pax_global_header00006660000000000000000000000064131635356410014521gustar00rootroot0000000000000052 comment=65bfcc7e7866030e87620e9fe1675ca6e62f37d1 mapcache-rel-1-6-1/000077500000000000000000000000001316353564100140455ustar00rootroot00000000000000mapcache-rel-1-6-1/.gitignore000066400000000000000000000000651316353564100160360ustar00rootroot00000000000000.*.swp nbproject/ /build/ /build_vagrant/ /.vagrant/ mapcache-rel-1-6-1/.travis.yml000066400000000000000000000033611316353564100161610ustar00rootroot00000000000000matrix: fast_finish: true include: - os: linux dist: trusty language: c sudo: required env: - DISTRO=trusty - BUILD_TYPE=maximum - os: linux dist: trusty language: c sudo: required env: - DISTRO=trusty - BUILD_TYPE=minimum - os: linux language: c sudo: required env: - DISTRO=precise - BUILD_TYPE=maximum language: c before_install: - sudo mv /etc/apt/sources.list.d/pgdg* /tmp - sudo apt-get purge -y libgdal* libgeos* libspatialite* - sudo add-apt-repository -y ppa:ubuntugis/ubuntugis-unstable - sudo apt-get update - sudo apt-get install cmake libspatialite-dev libfcgi-dev libproj-dev libgeos-dev libgdal-dev libtiff-dev libgeotiff-dev apache2-dev libpcre3-dev libsqlite3-dev libdb-dev # For testing - sudo apt-get install libxml2-utils apache2 gdal-bin script: - mkdir build - cd build - if test "$BUILD_TYPE" = "maximum"; then cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DWITH_TIFF=ON -DWITH_GEOTIFF=ON -DWITH_TIFF_WRITE_SUPPORT=ON -DWITH_PCRE=ON -DWITH_SQLITE=ON -DWITH_BERKELEY_DB=ON; else cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DWITH_TIFF=OFF -DWITH_GEOTIFF=OFF -DWITH_TIFF_WRITE_SUPPORT=OFF -DWITH_PCRE=OFF -DWITH_SQLITE=OFF -DWITH_BERKELEY_DB=OFF -DWITH_GDAL=OFF -DWITH_GEOS=OFF -DWITH_FCGI=OFF -DWITH_CGI=OFF -DWITH_APACHE=OFF -DWITH_OGR=OFF -DWITH_MAPSERVER=OFF; fi - make -j3 - sudo make install # Only test with Apache 2.4 - if test "$DISTRO" = "trusty" -a "$BUILD_TYPE" = "maximum"; then cd ../tests; sh ./travis_setup.sh; sh ./run_tests.sh; fi #notifications: # email: # recipients: # - thomas.bonfort@gmail.com # irc: # channels: # - "irc.freenode.org#mapserver" # use_notice: true mapcache-rel-1-6-1/CMakeLists.txt000066400000000000000000000247171316353564100166200ustar00rootroot00000000000000cmake_minimum_required (VERSION 2.6) project (MapCache C) include(CheckFunctionExists) include(CheckIncludeFile) include(CheckCSourceCompiles) if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") add_definitions(-DDEBUG) endif () set (MAPCACHE_VERSION_MAJOR 1) set (MAPCACHE_VERSION_MINOR 6) set (MAPCACHE_VERSION_REVISION 1) if(NOT DEFINED CMAKE_INSTALL_LIBDIR) set(CMAKE_INSTALL_LIBDIR lib) endif(NOT DEFINED CMAKE_INSTALL_LIBDIR) if(NOT DEFINED CMAKE_INSTALL_BINDIR) set(CMAKE_INSTALL_BINDIR bin) endif(NOT DEFINED CMAKE_INSTALL_BINDIR) MATH(EXPR MAPCACHE_IS_DEV_VERSION "1-${MAPCACHE_VERSION_MINOR}%2") if(MAPCACHE_IS_DEV_VERSION) set (MAPCACHE_VERSION_STRING "${MAPCACHE_VERSION_MAJOR}.${MAPCACHE_VERSION_MINOR}.${MAPCACHE_VERSION_REVISION}") else(MAPCACHE_IS_DEV_VERSION) set (MAPCACHE_VERSION_STRING "${MAPCACHE_VERSION_MAJOR}.${MAPCACHE_VERSION_MINOR}dev") endif(MAPCACHE_IS_DEV_VERSION) MATH(EXPR MAPCACHE_VERSION_NUM "${MAPCACHE_VERSION_MAJOR}*10000+${MAPCACHE_VERSION_MINOR}*100+${MAPCACHE_VERSION_REVISION}") SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) if (APPLE) set(CMAKE_FIND_FRAMEWORK "LAST") endif (APPLE) macro( report_optional_not_found component ) message(SEND_ERROR "${component} library/component/dependency could not be found. HINTS: - disable ${component} support by adding -DWITH_${component}=0 - add the ${component} install directory to the CMAKE_PREFIX_PATH variable (-DCMAKE_PREFIX_PATH=\"/path/to/${component}-install-dir;/path/to/other/dirs\"") endmacro() macro( report_mandatory_not_found component ) message(SEND_ERROR "${component} library/component could not be found and is a mandatory dependency HINT: - add the ${component} install directory to the CMAKE_PREFIX_PATH variable (-DCMAKE_PREFIX_PATH=\"/path/to/${component}-install-dir;/path/to/other/dirs\"") endmacro() macro( report_dependency_error component dependency) message(SEND_ERROR "${component} support requires ${dependency} support, however ${dependency} support has been disabled. HINTS: - re-run with -DWITH_${dependency}=1 (or without -DWITH_${dependency}=0) - disable ${component} support by adding -DWITH_${component}=0" ) endmacro() check_function_exists("strncasecmp" HAVE_STRNCASECMP) check_function_exists("symlink" HAVE_SYMLINK) check_function_exists ("timegm" HAVE_TIMEGM) check_function_exists ("strptime" HAVE_STRPTIME) set(CMAKE_SKIP_BUILD_RPATH FALSE) if(APPLE) set(CMAKE_MACOSX_RPATH ON) endif() set(CMAKE_LINK_INTERFACE_LIBRARY "") file(GLOB mapcache_SOURCES lib/*.c ) file(GLOB mapcache_HEADERS include/*.h) add_library(mapcache SHARED ${mapcache_SOURCES} ${mapcache_HEADERS}) set_target_properties(mapcache PROPERTIES VERSION ${MAPCACHE_VERSION_STRING} SOVERSION 1 ) # Add compiler flags for warnings if(CMAKE_COMPILER_IS_GNUCC) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror=declaration-after-statement") endif() if(CMAKE_C_COMPILER_ID MATCHES "Clang") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror=declaration-after-statement -std=c89 -Wno-comment") endif() #options suported by the cmake builder option(WITH_PIXMAN "Use pixman for SSE optimized image manipulations" ON) option(WITH_SQLITE "Use sqlite as a cache backend" ON) option(WITH_BERKELEY_DB "Use Berkeley DB as a cache backend" OFF) option(WITH_MEMCACHE "Use memcache as a cache backend (requires recent apr-util)" OFF) option(WITH_TIFF "Use TIFFs as a cache backend" OFF) option(WITH_TIFF_WRITE_SUPPORT "Enable (experimental) support for writable TIFF cache backends" OFF) option(WITH_GEOTIFF "Allow GeoTIFF metadata creation for TIFF cache backends" OFF) option(WITH_PCRE "Use PCRE for regex tests" OFF) option(WITH_MAPSERVER "Enable (experimental) support for the mapserver library" OFF) option(WITH_RIAK "Use Riak as a cache backend" OFF) option(WITH_GDAL "Choose if GDAL raster support should be built in" ON) find_package(PNG) if(PNG_FOUND) include_directories(${PNG_INCLUDE_DIR}) target_link_libraries(mapcache ${PNG_LIBRARIES}) else(PNG_FOUND) report_mandatory_not_found(PNG) endif(PNG_FOUND) find_package(JPEG) if(JPEG_FOUND) include_directories(${JPEG_INCLUDE_DIR}) target_link_libraries(mapcache ${JPEG_LIBRARY}) else(JPEG_FOUND) endif(JPEG_FOUND) find_package(CURL) if(CURL_FOUND) include_directories(${CURL_INCLUDE_DIR}) target_link_libraries(mapcache ${CURL_LIBRARY}) else(CURL_FOUND) report_mandatory_not_found(CURL) endif(CURL_FOUND) find_package(APR) if(APR_FOUND) include_directories(${APR_INCLUDE_DIR} ${APU_INCLUDE_DIR}) target_link_libraries(mapcache ${APR_LIBRARY} ${APU_LIBRARY}) if(DEFINED APR_CPPFLAGS) add_definitions("${APR_CPPFLAGS}") endif(DEFINED APR_CPPFLAGS) else(APR_FOUND) report_mandatory_not_found(APR) endif(APR_FOUND) if(WITH_MEMCACHE) include(CheckSymbolExists) FIND_PATH(tmp_APU_MEMCACHE_DIR NAMES apr_memcache.h HINTS ${APU_INCLUDE_DIR} ) if(tmp_APU_MEMCACHE_DIR) set(CMAKE_REQUIRED_INCLUDE ${APR_INCLUDE_DIR} ${APU_INCLUDE_DIR}) set(CMAKE_REQUIRED_LIBRARIES ${APR_LIBRARY} ${APU_LIBRARY}) check_symbol_exists(apr_memcache_hash "${tmp_APU_MEMCACHE_DIR}/apr_memcache.h" tmp_MEMCACHE_USABLE) if(tmp_MEMCACHE_USABLE) set(USE_MEMCACHE 1) else(tmp_MEMCACHE_USABLE) MESSAGE(SEND_ERROR "apr_memcache.h found, but seems too old (missing apr_memcache_hash function)") report_optional_not_found(MEMCACHE) endif(tmp_MEMCACHE_USABLE) else(tmp_APU_MEMCACHE_DIR) MESSAGE(SEND_ERROR "apr_memcache.h not found, your apr-util version may be configured without memcache support") report_optional_not_found(MEMCACHE) endif(tmp_APU_MEMCACHE_DIR) endif(WITH_MEMCACHE) if(WITH_PIXMAN) find_package(Pixman) if(PIXMAN_FOUND) include_directories(${PIXMAN_INCLUDE_DIR}) target_link_libraries(mapcache ${PIXMAN_LIBRARY}) set (USE_PIXMAN 1) else(PIXMAN_FOUND) report_optional_not_found(PIXMAN) endif(PIXMAN_FOUND) endif (WITH_PIXMAN) if(WITH_GDAL) find_package(GDAL) if(GDAL_FOUND) include_directories(${GDAL_INCLUDE_DIR}) target_link_libraries(mapcache ${GDAL_LIBRARY}) set (USE_GDAL 1) else(GDAL_FOUND) report_optional_not_found(GDAL) endif(GDAL_FOUND) endif(WITH_GDAL) if(WITH_PCRE) find_package(PCRE) if(PCRE_FOUND) include_directories(${PCRE_INCLUDE_DIR}) target_link_libraries(mapcache ${PCRE_LIBRARY}) set (USE_PCRE 1) add_definitions(-DPCRE_STATIC) else(PCRE_FOUND) report_optional_not_found(PCRE) endif(PCRE_FOUND) endif (WITH_PCRE) if(WITH_SQLITE) find_package(SQLITE) if(SQLITE_FOUND) include_directories(${SQLITE_INCLUDE_DIR}) target_link_libraries(mapcache ${SQLITE_LIBRARY}) set (USE_SQLITE 1) else(SQLITE_FOUND) report_optional_not_found(SQLITE) endif(SQLITE_FOUND) endif (WITH_SQLITE) if(WITH_BERKELEY_DB) if(NOT BERKELEYDB_FIND_VERSION) set(BERKELEYDB_FIND_VERSION "4.6") endif(NOT BERKELEYDB_FIND_VERSION) find_package(BerkeleyDB) if(BERKELEYDB_FOUND) include_directories(${BERKELEYDB_INCLUDE_DIR}) target_link_libraries(mapcache ${BERKELEYDB_LIBRARY}) set (USE_BDB 1) else(BERKELEYDB_FOUND) report_optional_not_found(BERKELEY_DB) endif(BERKELEYDB_FOUND) endif (WITH_BERKELEY_DB) if(WITH_TIFF) find_package(TIFF) if(TIFF_FOUND) include_directories(${TIFF_INCLUDE_DIR}) target_link_libraries(mapcache ${TIFF_LIBRARY}) set (USE_TIFF 1) else(TIFF_FOUND) report_optional_not_found(TIFF) endif(TIFF_FOUND) endif (WITH_TIFF) if(WITH_TIFF_WRITE_SUPPORT) if(USE_TIFF) set (USE_TIFF_WRITE 1) else(USE_TIFF) report_dependency_error(TIFF_WRITE_SUPPORT TIFF) endif(USE_TIFF) endif(WITH_TIFF_WRITE_SUPPORT) if(WITH_GEOTIFF) find_package(GEOTIFF) if(GEOTIFF_FOUND) include_directories(${GEOTIFF_INCLUDE_DIR}) target_link_libraries(mapcache ${GEOTIFF_LIBRARY}) set (USE_GEOTIFF 1) else(GEOTIFF_FOUND) report_optional_not_found(GEOTIFF) endif(GEOTIFF_FOUND) endif (WITH_GEOTIFF) if(WITH_MAPSERVER) find_package(MAPSERVER) if(MAPSERVER_FOUND) include_directories(${MAPSERVER_INCLUDE_DIR}) target_link_libraries(mapcache ${MAPSERVER_LIBRARY}) set (USE_MAPSERVER 1) else(MAPSERVER_FOUND) report_optional_not_found(MAPSERVER) endif(MAPSERVER_FOUND) endif (WITH_MAPSERVER) if(WITH_RIAK) find_package(RIAK) if(RIAK_FOUND) include_directories(${RIAK_INCLUDE_DIR}) target_link_libraries(mapcache ${RIAK_LIBRARY}) set (USE_RIAK 1) else(RIAK_FOUND) report_optional_not_found(RIAK) endif(RIAK_FOUND) endif (WITH_RIAK) if(UNIX) target_link_libraries(mapcache ${CMAKE_DL_LIBS} m ) endif(UNIX) configure_file ( "${PROJECT_SOURCE_DIR}/include/mapcache-config.h.in" "${PROJECT_BINARY_DIR}/include/mapcache-config.h" ) configure_file ( "${PROJECT_SOURCE_DIR}/include/mapcache-version.h.in" "${PROJECT_BINARY_DIR}/include/mapcache-version.h" ) include_directories(include ${PROJECT_BINARY_DIR}/include) macro(status_optional_component component enabled libpath) if("${enabled}" EQUAL "1") message(STATUS " * ${component}: ${libpath}") else() message(STATUS " * ${component}: disabled") endif() endmacro() macro(status_optional_feature feature enabled) if("${enabled}" EQUAL "1") message(STATUS " * ${feature}: ENABLED") else() message(STATUS " * ${feature}: disabled") endif() endmacro() message(STATUS "* Configured options for the mapcache library") message(STATUS " * Mandatory components") message(STATUS " * png: ${PNG_LIBRARY}") message(STATUS " * jpeg: ${JPEG_LIBRARY}") message(STATUS " * Curl: ${CURL_LIBRARY}") message(STATUS " * Apr: ${APR_LIBRARY}") message(STATUS " * Optional components") status_optional_component("PIXMAN" "${USE_PIXMAN}" "${PIXMAN_LIBRARY}") status_optional_component("SQLITE" "${USE_SQLITE}" "${SQLITE_LIBRARY}") status_optional_component("Berkeley DB" "${USE_BDB}" "${BERKELEYDB_LIBRARY}") status_optional_component("Memcache" "${USE_MEMCACHE}" "${APU_LIBRARY}") status_optional_component("TIFF" "${USE_TIFF}" "${TIFF_LIBRARY}") status_optional_component("GeoTIFF" "${USE_GEOTIFF}" "${GEOTIFF_LIBRARY}") status_optional_component("Experimental TIFF write support" "${USE_TIFF_WRITE}" "${TIFF_LIBRARY}") status_optional_component("PCRE" "${USE_PCRE}" "${PCRE_LIBRARY}") status_optional_component("Experimental mapserver support" "${USE_MAPSERVER}" "${MAPSERVER_LIBRARY}") status_optional_component("RIAK" "${USE_RIAK}" "${RIAK_LIBRARY}") status_optional_component("GDAL" "${USE_GDAL}" "${GDAL_LIBRARY}") INSTALL(TARGETS mapcache DESTINATION ${CMAKE_INSTALL_LIBDIR}) add_subdirectory(util) add_subdirectory(cgi) add_subdirectory(apache) add_subdirectory(nginx) mapcache-rel-1-6-1/INSTALL000066400000000000000000000006741316353564100151050ustar00rootroot00000000000000Unix compilation instructions ----------------------------- Mapcache now builds with cmake. It seems much happier if it can find apxs, which means you might need apache2-prefork installed (on ubuntu apt-get install apache2-prefork-dev). cd mapcache mkdir build cd build cmake .. make sudo make install Detailed instructions and configuration options are maintained in the mapcache documentation : http://mapserver.org/mapcache/install.html mapcache-rel-1-6-1/LICENSE000066400000000000000000000027711316353564100150610ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching program. * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2012 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ mapcache-rel-1-6-1/MIGRATION_GUIDE.txt000066400000000000000000000014761316353564100170640ustar00rootroot00000000000000Migrating from Mapcache 1.4 to 1.6 =================================== * The tileset child has been removed. Time dimensions are now added with * val1,val2,val3 should be replaced by val1val2val3 * ... should be replaced by true.... * ^abc$ should be replaced by ^abc$ * ... should be replaced by stack.... mapcache-rel-1-6-1/Makefile.vc000066400000000000000000000056321316353564100161220ustar00rootroot00000000000000# # makefile.vc - Main mapcache makefile for MSVC++ # # # To use the makefile: # - Open a DOS prompt window # - Run the VCVARS32.BAT script to initialize the VC++ environment variables # - Start the build with: nmake /f makefile.vc # # $Id: $ # !INCLUDE nmake.opt BASE_CFLAGS = $(OPTFLAGS) CFLAGS=$(BASE_CFLAGS) $(MAPCACHE_CFLAGS) CC= cl LINK= link # # Main mapcache library. # MAPCACHE_OBJS = lib\axisorder.obj lib\dimension.obj lib\imageio_mixed.obj lib\service_wms.obj \ lib\buffer.obj lib\ezxml.obj lib\imageio_png.obj lib\service_wmts.obj \ lib\cache_disk.obj lib\lock.obj lib\services.obj lib\cache_bdb.obj \ lib\cache_memcache.obj lib\grid.obj lib\source.obj \ lib\cache_sqlite.obj lib\http.obj lib\source_gdal.obj lib\source_dummy.obj \ lib\cache_tiff.obj lib\image.obj lib\service_demo.obj lib\source_mapserver.obj \ lib\configuration.obj lib\image_error.obj lib\service_kml.obj lib\source_wms.obj \ lib\configuration_xml.obj lib\imageio.obj lib\service_tms.obj lib\tileset.obj \ lib\core.obj lib\imageio_jpeg.obj lib\service_ve.obj lib\util.obj lib\strptime.obj \ $(REGEX_OBJ) MAPCACHE_FCGI = mapcache.exe MAPCACHE_APACHE = mod_mapcache.dll MAPCACHE_SEED = mapcache_seed.exe # # # default: all all: $(MAPCACHE_LIB) $(MAPCACHE_FCGI) $(MAPCACHE_APACHE) $(MAPCACHE_SEED) $(MAPCACHE_LIB): $(MAPCACHE_OBJS) lib /debug /out:$(MAPCACHE_LIB) $(MAPCACHE_OBJS) $(MAPCACHE_FCGI): $(MAPCACHE_LIB) $(CC) $(CFLAGS) cgi\mapcache.c /Fecgi\mapcache.exe $(LIBS) if exist cgi\$(MAPCACHE_FCGI).manifest mt -manifest cgi\$(MAPCACHE_FCGI).manifest -outputresource:cgi\$(MAPCACHE_FCGI);1 $(MAPCACHE_APACHE): $(MAPCACHE_LIB) $(CC) $(CFLAGS) apache\mod_mapcache.c /link /DLL /out:apache\mod_mapcache.dll $(LIBS) if exist apache\$(MAPCACHE_APACHE).manifest mt -manifest apache\$(MAPCACHE_APACHE).manifest -outputresource:apache\$(MAPCACHE_APACHE);2 $(MAPCACHE_SEED): $(MAPCACHE_LIB) $(CC) $(CFLAGS) util\mapcache_seed.c /Feutil\mapcache_seed.exe $(LIBS) if exist util\$(MAPCACHE_SEED).manifest mt -manifest util\$(MAPCACHE_SEED).manifest -outputresource:util\$(MAPCACHE_SEED);1 .c.obj: $(CC) $(CFLAGS) /c $*.c /Fo$*.obj .cpp.obj: $(CC) $(CFLAGS) /c $*.cpp /Fo$*.obj clean: del lib\*.obj del *.obj del *.exp del apache\$(MAPCACHE_APACHE) del apache\*.manifest del apache\*.exp del apache\*.lib del apache\*.pdb del apache\*.ilk del cgi\$(MAPCACHE_FCGI) del cgi\*.manifest del cgi\*.exp del cgi\*.lib del cgi\*.pdb del cgi\*.ilk del util\$(MAPCACHE_SEED) del util\*.manifest del util\*.exp del util\*.lib del util\*.pdb del util\*.ilk del *.lib del *.manifest install: $(MAPCACHE_EXE) -mkdir $(BINDIR) copy *.exe $(BINDIR) mapcache-rel-1-6-1/README000066400000000000000000000001011316353564100147150ustar00rootroot00000000000000new code repository is at https://github.com/mapserver/mapcache mapcache-rel-1-6-1/Vagrantfile000066400000000000000000000015621316353564100162360ustar00rootroot00000000000000# -*- mode: ruby -*- # vi: set ft=ruby : require 'socket' # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box = "precise64" config.vm.box_url = "http://files.vagrantup.com/precise64.box" config.vm.hostname = "mapcache-vagrant" config.vm.network :forwarded_port, guest: 80, host: 8080 config.vm.provider "virtualbox" do |v| v.customize ["modifyvm", :id, "--memory", 1024, "--cpus", 2] v.customize ["modifyvm", :id, "--ioapic", "on", "--largepages", "off", "--vtxvpid", "off"] v.name = "mapcache-vagrant" end config.vm.provision "shell", path: "scripts/vagrant/virtualbox-fix.sh" config.vm.provision "shell", path: "scripts/vagrant/packages.sh" config.vm.provision "shell", path: "scripts/vagrant/mapcache.sh" end mapcache-rel-1-6-1/apache/000077500000000000000000000000001316353564100152665ustar00rootroot00000000000000mapcache-rel-1-6-1/apache/CMakeLists.txt000066400000000000000000000031301316353564100200230ustar00rootroot00000000000000option(WITH_VERSION_STRING "Show MapCache in server version string" ON) option(WITH_APACHE "Build Apache Module" ON) if(WITH_APACHE) add_library(mod_mapcache MODULE mod_mapcache.c) set_target_properties(mod_mapcache PROPERTIES PREFIX "") target_link_libraries(mod_mapcache mapcache) find_package(APACHE) if(APACHE_FOUND) include_directories(${APACHE_INCLUDE_DIR}) target_link_libraries(mod_mapcache ${APACHE_LIBRARY}) else(APACHE_FOUND) report_mandatory_not_found(APACHE) endif(APACHE_FOUND) if(WITH_VERSION_STRING) set(USE_VERSION_STRING 1) endif(WITH_VERSION_STRING) configure_file ( "${PROJECT_SOURCE_DIR}/apache/mod_mapcache-config.h.in" "${PROJECT_BINARY_DIR}/apache/mod_mapcache-config.h" ) include_directories("${PROJECT_BINARY_DIR}/apache/") IF(APPLE) set_target_properties(mod_mapcache PROPERTIES LINK_FLAGS "-Wl,-flat_namespace -Wl,-undefined -Wl,suppress") ENDIF(APPLE) message(STATUS "* Apache Module support status:") status_optional_component("Mapcache Version String" "${USE_VERSION_STRING}" "mod_mapcache/${MAPCACHE_VERSION_STRING}") if(APACHE_MODULE_DIR) message(STATUS " * Module will be installed to : ${APACHE_MODULE_DIR}") else(APACHE_MODULE_DIR) message(WARNING " * Module will not be automatically installed: module directory not found") endif(APACHE_MODULE_DIR) if(APACHE_MODULE_DIR) INSTALL(TARGETS mod_mapcache DESTINATION ${APACHE_MODULE_DIR}) endif(APACHE_MODULE_DIR) else(WITH_APACHE) message(STATUS " * Apache Module support status: DISABLED") endif(WITH_APACHE) mapcache-rel-1-6-1/apache/mod_mapcache-config.h.in000066400000000000000000000001511316353564100217040ustar00rootroot00000000000000#ifndef _MOD_MAPCACHE_CONFIG_H #define _MOD_MAPCACHE_CONFIG_H #cmakedefine USE_VERSION_STRING 1 #endif mapcache-rel-1-6-1/apache/mod_mapcache.c000066400000000000000000000604371316353564100200440ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching apache module implementation * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ /* * Include the core server components. */ #include "mod_mapcache-config.h" #include #include #include #include #include #include #include #include #include "mapcache.h" #ifndef _WIN32 #include #endif #ifdef AP_NEED_SET_MUTEX_PERMS #include "unixd.h" #endif module AP_MODULE_DECLARE_DATA mapcache_module; typedef struct mapcache_context_apache mapcache_context_apache; typedef struct mapcache_context_apache_request mapcache_context_apache_request; typedef struct mapcache_context_apache_server mapcache_context_apache_server; struct mapcache_context_apache { mapcache_context ctx; }; struct mapcache_context_apache_server { mapcache_context_apache ctx; server_rec *server; }; struct mapcache_context_apache_request { mapcache_context_apache ctx; request_rec *request; }; typedef struct mapcache_alias_entry mapcache_alias_entry; struct mapcache_alias_entry { char *endpoint; char *configfile; mapcache_cfg *cfg; mapcache_connection_pool *cp; }; struct mapcache_server_cfg { apr_array_header_t *aliases; /**< list of mapcache configurations aliased to a server uri */ apr_array_header_t *quickaliases; /**< list of mapcache configurations aliased to a server uri */ }; static int mapcache_alias_matches(const char *uri, const char *alias_fakename); void apache_context_server_log(mapcache_context *c, mapcache_log_level level, char *message, ...) { mapcache_context_apache_server *ctx = (mapcache_context_apache_server*)c; va_list args; char *msg; int ap_log_level; va_start(args,message); msg = apr_pvsprintf(c->pool,message,args); va_end(args); switch(level) { case MAPCACHE_DEBUG: ap_log_level = APLOG_DEBUG; break; case MAPCACHE_INFO: ap_log_level = APLOG_INFO; break; case MAPCACHE_NOTICE: ap_log_level = APLOG_NOTICE; break; case MAPCACHE_WARN: ap_log_level = APLOG_WARNING; break; case MAPCACHE_ERROR: ap_log_level = APLOG_ERR; break; case MAPCACHE_CRIT: ap_log_level = APLOG_CRIT; break; case MAPCACHE_ALERT: ap_log_level = APLOG_ALERT; break; case MAPCACHE_EMERG: ap_log_level = APLOG_EMERG; break; default: ap_log_level = APLOG_WARNING; } ap_log_error(APLOG_MARK, ap_log_level, 0, ctx->server,"%s",msg); } void apache_context_request_log(mapcache_context *c, mapcache_log_level level, char *message, ...) { mapcache_context_apache_request *ctx = (mapcache_context_apache_request*)c; va_list args; char *res; int ap_log_level; va_start(args,message); res = apr_pvsprintf(c->pool, message, args); va_end(args); switch(level) { case MAPCACHE_DEBUG: ap_log_level = APLOG_DEBUG; break; case MAPCACHE_INFO: ap_log_level = APLOG_INFO; break; case MAPCACHE_NOTICE: ap_log_level = APLOG_NOTICE; break; case MAPCACHE_WARN: ap_log_level = APLOG_WARNING; break; case MAPCACHE_ERROR: ap_log_level = APLOG_ERR; break; case MAPCACHE_CRIT: ap_log_level = APLOG_CRIT; break; case MAPCACHE_ALERT: ap_log_level = APLOG_ALERT; break; case MAPCACHE_EMERG: ap_log_level = APLOG_EMERG; break; default: ap_log_level = APLOG_WARNING; } ap_log_rerror(APLOG_MARK, ap_log_level, 0, ctx->request, "%s", res); } mapcache_context *mapcache_context_request_clone(mapcache_context *ctx) { mapcache_context_apache_request *newctx = (mapcache_context_apache_request*)apr_pcalloc(ctx->pool, sizeof(mapcache_context_apache_request)); mapcache_context *nctx = (mapcache_context*)newctx; mapcache_context_copy(ctx,nctx); //apr_pool_create(&nctx->pool,ctx->pool); apr_pool_create(&nctx->pool,NULL); apr_pool_cleanup_register(ctx->pool, nctx->pool,(void*)apr_pool_destroy, apr_pool_cleanup_null); newctx->request = ((mapcache_context_apache_request*)ctx)->request; return nctx; } mapcache_context_apache_request* create_apache_request_context(request_rec *r) { mapcache_context_apache_request *rctx = apr_pcalloc(r->pool, sizeof(mapcache_context_apache_request)); mapcache_context *ctx = (mapcache_context*)rctx; mapcache_context_init(ctx); ctx->pool = r->pool; rctx->request = r; ctx->log = apache_context_request_log; ctx->clone = mapcache_context_request_clone; return rctx; } static mapcache_context_apache_server* create_apache_server_context(server_rec *s, apr_pool_t *pool) { mapcache_context_apache_server *actx = apr_pcalloc(pool, sizeof(mapcache_context_apache_server)); mapcache_context *ctx = (mapcache_context*)actx; mapcache_context_init(ctx); ctx->pool = pool; ctx->config = NULL; ctx->log = apache_context_server_log; actx->server = s; return actx; } /* read post body. code taken from "The apache modules book, Nick Kew" */ static void read_post_body(mapcache_context_apache_request *ctx, mapcache_request_proxy *p) { request_rec *r = ctx->request; mapcache_context *mctx = (mapcache_context*)ctx; int bytes,eos; apr_bucket_brigade *bb, *bbin; apr_bucket *b; apr_status_t rv; const char *clen = apr_table_get(r->headers_in, "Content-Length"); if(clen) { bytes = strtol(clen, NULL, 0); if(bytes >= p->rule->max_post_len) { mctx->set_error(mctx, HTTP_REQUEST_ENTITY_TOO_LARGE, "post request too big"); return; } } else { bytes = p->rule->max_post_len; } bb = apr_brigade_create(mctx->pool, r->connection->bucket_alloc); bbin = apr_brigade_create(mctx->pool, r->connection->bucket_alloc); p->post_len = 0; do { apr_bucket *nextb; rv = ap_get_brigade(r->input_filters, bbin, AP_MODE_READBYTES, APR_BLOCK_READ, bytes); if(rv != APR_SUCCESS) { mctx->set_error(mctx, 500, "failed to read form input"); return; } for(b = APR_BRIGADE_FIRST(bbin); b != APR_BRIGADE_SENTINEL(bbin); b = nextb) { nextb = APR_BUCKET_NEXT(b); if(APR_BUCKET_IS_EOS(b)) { eos = 1; } if(!APR_BUCKET_IS_METADATA(b)) { if(b->length != (apr_size_t)(-1)) { p->post_len += b->length; if(p->post_len > p->rule->max_post_len) { apr_bucket_delete(b); } } } if(p->post_len <= p->rule->max_post_len) { APR_BUCKET_REMOVE(b); APR_BRIGADE_INSERT_TAIL(bb, b); } } } while (!eos); if(p->post_len > p->rule->max_post_len) { mctx->set_error(mctx, HTTP_REQUEST_ENTITY_TOO_LARGE, "request too big"); return; } p->post_buf = apr_palloc(mctx->pool, p->post_len+1); if(p->post_len> 0) { rv = apr_brigade_flatten(bb, p->post_buf, &(p->post_len)); if(rv != APR_SUCCESS) { mctx->set_error(mctx, 500, "error (flatten) reading form data"); return; } } p->post_buf[p->post_len] = 0; } static int write_http_response(mapcache_context_apache_request *ctx, mapcache_http_response *response) { request_rec *r = ctx->request; int rc; char *timestr; if(response->mtime) { ap_update_mtime(r, response->mtime); if((rc = ap_meets_conditions(r)) != OK) { return rc; } timestr = apr_palloc(r->pool, APR_RFC822_DATE_LEN); apr_rfc822_date(timestr, response->mtime); apr_table_setn(r->headers_out, "Last-Modified", timestr); } if(response->headers && !apr_is_empty_table(response->headers)) { const apr_array_header_t *elts = apr_table_elts(response->headers); int i; for(i=0; inelts; i++) { apr_table_entry_t entry = APR_ARRAY_IDX(elts,i,apr_table_entry_t); if(!strcasecmp(entry.key,"Content-Type")) { ap_set_content_type(r,entry.val); } else { apr_table_set(r->headers_out, entry.key, entry.val); } } } if(response->data && response->data->size) { ap_set_content_length(r,response->data->size); ap_rwrite((void*)response->data->buf, response->data->size, r); } r->status = response->code; return OK; } static void mod_mapcache_child_init(apr_pool_t *pool, server_rec *s) { for( ; s ; s=s->next) { mapcache_server_cfg* cfg = ap_get_module_config(s->module_config, &mapcache_module); int i,rv; for(i=0;ialiases->nelts;i++) { mapcache_alias_entry *alias_entry = APR_ARRAY_IDX(cfg->aliases,i,mapcache_alias_entry*); rv = mapcache_connection_pool_create(&(alias_entry->cp),pool); ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "creating a child process mapcache connection pool on server %s for alias %s", s->server_hostname, alias_entry->endpoint); if(rv!=APR_SUCCESS) { ap_log_error(APLOG_MARK, APLOG_CRIT, 0, s, "failed to create mapcache connection pool"); } } for(i=0;iquickaliases->nelts;i++) { mapcache_alias_entry *alias_entry = APR_ARRAY_IDX(cfg->quickaliases,i,mapcache_alias_entry*); rv = mapcache_connection_pool_create(&(alias_entry->cp),pool); ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "creating a child process mapcache connection pool on server %s for alias %s", s->server_hostname, alias_entry->endpoint); if(rv!=APR_SUCCESS) { ap_log_error(APLOG_MARK, APLOG_CRIT, 0, s, "failed to create mapcache connection pool"); } } } } static int mapcache_handler(request_rec *r, mapcache_alias_entry *alias_entry) { apr_table_t *params; mapcache_request *request = NULL; mapcache_context_apache_request *apache_ctx = create_apache_request_context(r); mapcache_context *ctx = (mapcache_context*)apache_ctx; mapcache_http_response *http_response = NULL; ctx->config = alias_entry->cfg; ctx->connection_pool = alias_entry->cp; ctx->supports_redirects = 1; ctx->headers_in = r->headers_in; params = mapcache_http_parse_param_string(ctx, r->args); //ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "mapcache dispatch %s",r->path_info); mapcache_service_dispatch_request(ctx,&request,r->path_info,params,ctx->config); if(GC_HAS_ERROR(ctx) || !request) { return write_http_response(apache_ctx, mapcache_core_respond_to_error(ctx)); } if(request->type == MAPCACHE_REQUEST_GET_CAPABILITIES) { mapcache_request_get_capabilities *req_caps = (mapcache_request_get_capabilities*)request; request_rec *original; char *url; if(r->main) original = r->main; else original = r; url = ap_construct_url(r->pool,original->uri,original); /* * remove the path_info from the end of the url (we want the url of the base of the service) * TODO: is there an apache api to access this ? */ if(*(original->path_info) && strcmp(original->path_info,"/")) { char *end = strstr(url,original->path_info); if(end) { /* make sure our url ends with a single '/' */ if(*end == '/') { char *slash = end; while((*(--slash))=='/') end--; end++; } *end = '\0'; } } http_response = mapcache_core_get_capabilities(ctx,request->service,req_caps, url,original->path_info,ctx->config); } else if( request->type == MAPCACHE_REQUEST_GET_TILE) { mapcache_request_get_tile *req_tile = (mapcache_request_get_tile*)request; http_response = mapcache_core_get_tile(ctx,req_tile); } else if( request->type == MAPCACHE_REQUEST_PROXY ) { const char *buf; mapcache_request_proxy *req_proxy = (mapcache_request_proxy*)request; if(r->method_number == M_POST) { read_post_body(apache_ctx, req_proxy); if(GC_HAS_ERROR(ctx)) { return write_http_response(apache_ctx, mapcache_core_respond_to_error(ctx)); } if(!req_proxy->headers) { req_proxy->headers = apr_table_make(ctx->pool, 2); } apr_table_set(req_proxy->headers, "Content-Type", r->content_type); if((buf = apr_table_get(r->headers_in,"X-Forwarded-For"))) { #if (AP_SERVER_MAJORVERSION_NUMBER == 2) && (AP_SERVER_MINORVERSION_NUMBER < 4) apr_table_set(req_proxy->headers, "X-Forwarded-For", apr_psprintf(ctx->pool,"%s, %s", buf, r->connection->remote_ip)); #else apr_table_set(req_proxy->headers, "X-Forwarded-For", apr_psprintf(ctx->pool,"%s, %s", buf, r->connection->client_ip)); #endif } else { #if (AP_SERVER_MAJORVERSION_NUMBER == 2) && (AP_SERVER_MINORVERSION_NUMBER < 4) apr_table_set(req_proxy->headers, "X-Forwarded-For", r->connection->remote_ip); #else apr_table_set(req_proxy->headers, "X-Forwarded-For", r->connection->client_ip); #endif } if ((buf = apr_table_get(r->headers_in, "Host"))) { const char *buf2; if((buf2 = apr_table_get(r->headers_in,"X-Forwarded-Host"))) { apr_table_set(req_proxy->headers, "X-Forwarded-Host", apr_psprintf(ctx->pool,"%s, %s",buf2,buf)); } else { apr_table_set(req_proxy->headers, "X-Forwarded-Host", buf); } } if ((buf = apr_table_get(r->headers_in, "X-Forwarded-Server"))) { apr_table_set(req_proxy->headers, "X-Forwarded-Server", apr_psprintf(ctx->pool, "%s, %s", buf, r->server->server_hostname)); } else { apr_table_set(req_proxy->headers, "X-Forwarded-Server", r->server->server_hostname); } } http_response = mapcache_core_proxy_request(ctx, req_proxy); } else if( request->type == MAPCACHE_REQUEST_GET_MAP) { mapcache_request_get_map *req_map = (mapcache_request_get_map*)request; http_response = mapcache_core_get_map(ctx,req_map); } else if( request->type == MAPCACHE_REQUEST_GET_FEATUREINFO) { mapcache_request_get_feature_info *req_fi = (mapcache_request_get_feature_info*)request; http_response = mapcache_core_get_featureinfo(ctx,req_fi); } else { ctx->set_error(ctx,500,"###BUG### unknown request type"); } if(GC_HAS_ERROR(ctx)) { return write_http_response(apache_ctx, mapcache_core_respond_to_error(ctx)); } return write_http_response(apache_ctx,http_response); } static int mod_mapcache_quick_handler(request_rec *r, int lookup) { mapcache_server_cfg *sconfig = ap_get_module_config(r->server->module_config, &mapcache_module); mapcache_alias_entry *alias_entry; int i; ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "mapcache quick handler hook on uri %s",r->uri); if (!sconfig || !sconfig->quickaliases) return DECLINED; if (r->uri[0] != '/' && r->uri[0]) return DECLINED; if(lookup) { return DECLINED; } /* loop through the entries to find one where the alias matches */ for(i=0; iquickaliases->nelts; i++) { int l; alias_entry = APR_ARRAY_IDX(sconfig->quickaliases,i,mapcache_alias_entry*); //ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "cheking mapcache alias %s against %s",r->uri,alias_entry->endpoint); if((l=mapcache_alias_matches(r->uri, alias_entry->endpoint))>0) { if (r->method_number != M_GET && r->method_number != M_POST) { return HTTP_METHOD_NOT_ALLOWED; } r->path_info = &(r->uri[l]); return mapcache_handler(r,alias_entry); } } return DECLINED; } static int mod_mapcache_request_handler(request_rec *r) { const char *mapcache_alias; int i; mapcache_server_cfg* cfg; if (!r->handler || strcmp(r->handler, "mapcache")) { return DECLINED; } if (r->method_number != M_GET && r->method_number != M_POST) { return HTTP_METHOD_NOT_ALLOWED; } cfg = ap_get_module_config(r->server->module_config, &mapcache_module); mapcache_alias = apr_table_get(r->notes,"mapcache_alias_entry"); //ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "using mapcache config %s", mapcache_config_file); if(!mapcache_alias) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "mapcache module bug? no mapcache_alias_entry found"); return DECLINED; } for(i=0; ialiases->nelts; i++) { mapcache_alias_entry *alias_entry = APR_ARRAY_IDX(cfg->aliases,i,mapcache_alias_entry*); if(strcmp(alias_entry->endpoint,mapcache_alias)) continue; return mapcache_handler(r,alias_entry); } return DECLINED; /*should never happen, the fixup phase would not have oriented us here*/ } static int mod_mapcache_post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) { mapcache_server_cfg* cfg = ap_get_module_config(s->module_config, &mapcache_module); if(!cfg) { ap_log_error(APLOG_MARK, APLOG_CRIT, 0, s, "configuration not found in server context"); return 1; } #ifdef USE_VERSION_STRING ap_add_version_component(p, MAPCACHE_USERAGENT); #endif return 0; } static int mapcache_alias_matches(const char *uri, const char *alias_fakename) { /* Code for this function from Apache mod_alias module. */ const char *aliasp = alias_fakename, *urip = uri; while (*aliasp) { if (*aliasp == '/') { /* any number of '/' in the alias matches any number in * the supplied URI, but there must be at least one... */ if (*urip != '/') return 0; do { ++aliasp; } while (*aliasp == '/'); do { ++urip; } while (*urip == '/'); } else { /* Other characters are compared literally */ if (*urip++ != *aliasp++) return 0; } } /* Check last alias path component matched all the way */ if (aliasp[-1] != '/' && *urip != '\0' && *urip != '/') return 0; /* Return number of characters from URI which matched (may be * greater than length of alias, since we may have matched * doubled slashes) */ return urip - uri; } static int mapcache_hook_fixups(request_rec *r) { int i; //ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "running mapcache fixup on %s (handler:%s,filename:%s)",r->uri,r->handler,r->filename); if(!r->handler) { mapcache_server_cfg *sconfig = ap_get_module_config(r->server->module_config, &mapcache_module); mapcache_alias_entry *alias_entry; if (!sconfig || !sconfig->aliases) return DECLINED; if (r->uri[0] != '/' && r->uri[0]) return DECLINED; /* loop through the entries to find one where the alias matches */ for(i=0; ialiases->nelts; i++) { int l; alias_entry = APR_ARRAY_IDX(sconfig->aliases,i,mapcache_alias_entry*); //ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "cheking mapcache alias %s against %s",r->uri,alias_entry->endpoint); if((l=mapcache_alias_matches(r->uri, alias_entry->endpoint))>0) { r->handler = apr_pstrdup(r->pool,"mapcache"); apr_table_set(r->notes,"mapcache_alias_entry",alias_entry->endpoint); r->path_info = &(r->uri[l]); //ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "setting config %s for alias %s",alias_entry->configfile,alias_entry->endpoint); //ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "using pathinfo %s from uri %s",r->path_info,r->uri); return OK; } } } return DECLINED; } static void mod_mapcache_register_hooks(apr_pool_t *p) { ap_hook_child_init(mod_mapcache_child_init, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_post_config(mod_mapcache_post_config, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_handler(mod_mapcache_request_handler, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_quick_handler(mod_mapcache_quick_handler, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_fixups(mapcache_hook_fixups, NULL, NULL, APR_HOOK_MIDDLE); } static void* mod_mapcache_create_server_conf(apr_pool_t *pool, server_rec *s) { mapcache_server_cfg *cfg = apr_pcalloc(pool, sizeof(mapcache_server_cfg)); cfg->aliases = apr_array_make(pool,1,sizeof(mapcache_alias_entry*)); cfg->quickaliases = apr_array_make(pool,1,sizeof(mapcache_alias_entry*)); return cfg; } static void *mod_mapcache_merge_server_conf(apr_pool_t *p, void *base_, void *vhost_) { mapcache_server_cfg *base = (mapcache_server_cfg*)base_; mapcache_server_cfg *vhost = (mapcache_server_cfg*)vhost_; mapcache_server_cfg *cfg = apr_pcalloc(p,sizeof(mapcache_server_cfg)); cfg->aliases = apr_array_append(p, vhost->aliases,base->aliases); cfg->quickaliases = apr_array_append(p, vhost->quickaliases,base->quickaliases); #if 0 { mapcache_alias_entry *e; int i; fprintf(stderr,"#### merge called ####\n"); for(i=0;ialiases->nelts;i++) { e = APR_ARRAY_IDX(base->aliases,i,mapcache_alias_entry*); fprintf(stderr,"merge base: have alias %s on %s\n",e->configfile,e->endpoint); } for(i=0;ialiases->nelts;i++) { e = APR_ARRAY_IDX(vhost->aliases,i,mapcache_alias_entry*); fprintf(stderr,"merge vhosts: have alias %s on %s\n",e->configfile,e->endpoint); } for(i=0;ialiases->nelts;i++) { e = APR_ARRAY_IDX(cfg->aliases,i,mapcache_alias_entry*); fprintf(stderr,"merge result: have alias %s on %s\n",e->configfile,e->endpoint); } } #endif return cfg; } static const char* mapcache_add_alias(cmd_parms *cmd, void *cfg, const char *alias, const char* configfile, const char *quick) { mapcache_server_cfg *sconfig; mapcache_alias_entry *alias_entry; mapcache_context *ctx; unsigned forbidden = NOT_IN_DIRECTORY|NOT_IN_FILES; const char *err; #if (AP_SERVER_MAJORVERSION_NUMBER > 2) || (AP_SERVER_MINORVERSION_NUMBER >= 4) forbidden |= NOT_IN_HTACCESS; #endif err = ap_check_cmd_context(cmd, forbidden); if (err) { return err; } sconfig = ap_get_module_config(cmd->server->module_config, &mapcache_module); if(!sconfig || !sconfig->aliases) return "no mapcache module config, server bug?"; alias_entry = apr_pcalloc(cmd->pool,sizeof(mapcache_alias_entry)); ctx = (mapcache_context*)create_apache_server_context(cmd->server,cmd->pool); alias_entry->cfg = mapcache_configuration_create(cmd->pool); alias_entry->configfile = apr_pstrdup(cmd->pool,configfile); alias_entry->endpoint = apr_pstrdup(cmd->pool,alias); mapcache_configuration_parse(ctx,alias_entry->configfile,alias_entry->cfg,0); if(GC_HAS_ERROR(ctx)) { return ctx->get_error_message(ctx); } mapcache_configuration_post_config(ctx, alias_entry->cfg); if(GC_HAS_ERROR(ctx)) { return ctx->get_error_message(ctx); } if(mapcache_config_services_enabled(ctx, alias_entry->cfg) <= 0) { return "no mapcache s configured/enabled, no point in continuing."; } if(quick && !strcmp(quick,"quick")) { APR_ARRAY_PUSH(sconfig->quickaliases,mapcache_alias_entry*) = alias_entry; ap_log_error(APLOG_MARK, APLOG_INFO, 0, cmd->server, "loaded mapcache configuration file from %s on (quick) endpoint %s", alias_entry->configfile, alias_entry->endpoint); } else { APR_ARRAY_PUSH(sconfig->aliases,mapcache_alias_entry*) = alias_entry; ap_log_error(APLOG_MARK, APLOG_INFO, 0, cmd->server, "loaded mapcache configuration file from %s on endpoint %s", alias_entry->configfile, alias_entry->endpoint); } return NULL; } static const command_rec mod_mapcache_cmds[] = { AP_INIT_TAKE23("MapCacheAlias", mapcache_add_alias ,NULL,RSRC_CONF,"Aliased location of configuration file"), { NULL } } ; module AP_MODULE_DECLARE_DATA mapcache_module = { STANDARD20_MODULE_STUFF, NULL, NULL, mod_mapcache_create_server_conf, mod_mapcache_merge_server_conf, mod_mapcache_cmds, mod_mapcache_register_hooks }; /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/astyle.sh000077500000000000000000000002571316353564100157110ustar00rootroot00000000000000#!/bin/bash ASTYLEOPTS="--style=kr --indent=spaces=2 -c --lineend=linux -S" ASTYLEBIN=astyle $ASTYLEBIN $ASTYLEOPTS -R '*.c' '*.h' #find . -name '*.orig' -exec rm -f {} \; mapcache-rel-1-6-1/benchmark.py000066400000000000000000000042171316353564100163550ustar00rootroot00000000000000#! /usr/bin/env python import commands import os import re def do_ab_call(url,nthreads,reqs): cmd="ab -k -c %d -n %d '%s'" % (nthreads,reqs,url) print cmd summary={} ret = commands.getoutput(cmd) sList = ret.split(os.linesep) for i, line in enumerate(sList): if re.match("Requests per second", line) is not None: val = line.split() summary['reqspersec']=val[3] if re.match("Document Length", line) is not None: val = line.split() summary['size']=val[2] return summary base="http://localhost:8081" params="LAYERS=test,test3&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A4326&BBOX=-2.8125,47.8125,0,50.625&WIDTH=256&HEIGHT=256" urls={} nreqs=400 title="tile merging" filebase=title urls['tilecache']="%s/%s?%s" % (base,'tilecache',params) urls['mapcache best compression']="%s/%s?%s" % (base,'mapcache-best',params) urls['mapcache default compression']="%s/%s?%s" % (base,'mapcache-default',params) urls['mapcache fast compression']="%s/%s?%s" % (base,'mapcache-fast',params) urls['mapcache png quantization']="%s/%s?%s" % (base,'mapcache-pngq',params) #urls['mapproxy']="http://localhost:8080/service?%s" % (params) plotfile = open("%s.plot"%(filebase),"w") datafile = open("%s.dat"%(filebase),"w") plotfile.write("set terminal pdf\nset key autotitle columnhead\nset output \"%s.pdf\"\nset style data lines\n"%(filebase)) plotfile.write("set xlabel \"concurrent requests\"\n") plotfile.write("set ylabel \"throughput (requests/sec)\"\n") plotfile.write("set title \"%s\"\n"%(title)) count=0 for title,url in urls.iteritems(): if count == 0: plotfile.write("plot \"%s.dat\" using 2:xticlabel(1) index 0"%(filebase)) else: plotfile.write(",\"\" using 2 index %d"%(count)) count += 1 for nthreads in [1,2,3,4]: reqs = min(nthreads,4) * nreqs res = do_ab_call(url,nthreads,reqs) if nthreads == 1: datafile.write("\n\nthreads \"%s (%s bytes)\"\n"%(title,res['size'])) datafile.write("%d %s\n"%(nthreads,res['reqspersec'])) plotfile.write("\n") mapcache-rel-1-6-1/cgi/000077500000000000000000000000001316353564100146075ustar00rootroot00000000000000mapcache-rel-1-6-1/cgi/CMakeLists.txt000066400000000000000000000022071316353564100173500ustar00rootroot00000000000000option(WITH_CGI "Choose if CGI executable should be built" ON) option(WITH_FCGI "Choose if CGI executable should support FastCGI" ON) if(WITH_CGI) if(NOT DEFINED CMAKE_INSTALL_CGIBINDIR) set(CMAKE_INSTALL_CGIBINDIR ${CMAKE_INSTALL_BINDIR}) endif(NOT DEFINED CMAKE_INSTALL_CGIBINDIR) add_executable(mapcache.fcgi mapcache.c) target_link_libraries(mapcache.fcgi mapcache) if(WITH_FCGI) find_package(FCGI) if(FCGI_FOUND) include_directories(${FCGI_INCLUDE_DIR}) target_link_libraries(mapcache.fcgi ${FCGI_LIBRARY}) set (USE_FASTCGI 1) else(FCGI_FOUND) report_optional_not_found(FCGI) endif(FCGI_FOUND) endif (WITH_FCGI) configure_file ( "${PROJECT_SOURCE_DIR}/cgi/mapcache-cgi-config.h.in" "${PROJECT_BINARY_DIR}/cgi/mapcache-cgi-config.h" ) include_directories("${PROJECT_BINARY_DIR}/cgi/") message(STATUS "* CGI Configuration Options:") status_optional_component("FastCGI" "${USE_FASTCGI}" "${FCGI_LIBRARY}") INSTALL(TARGETS mapcache.fcgi RUNTIME DESTINATION ${CMAKE_INSTALL_CGIBINDIR}) else(WITH_CGI) message(STATUS "* CGI Configuration Options: DISABLED") endif(WITH_CGI) mapcache-rel-1-6-1/cgi/mapcache-cgi-config.h.in000066400000000000000000000001421316353564100211260ustar00rootroot00000000000000#ifndef _MAPCACHE_CGI_CONFIG_H #define _MAPCACHE_CGI_CONFIG_H #cmakedefine USE_FASTCGI 1 #endif mapcache-rel-1-6-1/cgi/mapcache.c000066400000000000000000000265541316353564100165300ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching CGI and FastCGI main program * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache-cgi-config.h" #include "mapcache.h" #include #include #include #include #include #include #ifdef USE_FASTCGI #include #endif typedef struct mapcache_context_fcgi mapcache_context_fcgi; typedef struct mapcache_context_fcgi_request mapcache_context_fcgi_request; static char *err400 = "Bad Request"; static char *err404 = "Not Found"; static char *err500 = "Internal Server Error"; static char *err501 = "Not Implemented"; static char *err502 = "Bad Gateway"; static char *errother = "No Description"; apr_pool_t *global_pool = NULL,*config_pool, *tmp_config_pool; static char* err_msg(int code) { switch(code) { case 400: return err400; case 404: return err404; case 500: return err500; case 501: return err501; case 502: return err502; default: return errother; } } struct mapcache_context_fcgi { mapcache_context ctx; }; static mapcache_context* fcgi_context_clone(mapcache_context *ctx) { mapcache_context_fcgi *newctx = (mapcache_context_fcgi*)apr_pcalloc(ctx->pool, sizeof(mapcache_context_fcgi)); mapcache_context *nctx = (mapcache_context*)newctx; mapcache_context_copy(ctx,nctx); apr_pool_create(&nctx->pool,ctx->pool); return nctx; } static void fcgi_context_log(mapcache_context *c, mapcache_log_level level, char *message, ...) { va_list args; if(!c->config || level >= c->config->loglevel) { va_start(args,message); fprintf(stderr,"%s\n",apr_pvsprintf(c->pool,message,args)); va_end(args); } } static void handle_signal(int signal) { apr_pool_destroy(global_pool); exit(signal); } static mapcache_context_fcgi* fcgi_context_create() { mapcache_context_fcgi *ctx = apr_pcalloc(global_pool, sizeof(mapcache_context_fcgi)); if(!ctx) { return NULL; } ctx->ctx.pool = global_pool; mapcache_context_init((mapcache_context*)ctx); ctx->ctx.log = fcgi_context_log; ctx->ctx.clone = fcgi_context_clone; ctx->ctx.config = NULL; return ctx; } static void fcgi_write_response(mapcache_context_fcgi *ctx, mapcache_http_response *response) { if(response->code != 200) { printf("Status: %ld %s\r\n",response->code, err_msg(response->code)); } if(response->headers && !apr_is_empty_table(response->headers)) { const apr_array_header_t *elts = apr_table_elts(response->headers); int i; for(i=0; inelts; i++) { apr_table_entry_t entry = APR_ARRAY_IDX(elts,i,apr_table_entry_t); printf("%s: %s\r\n", entry.key, entry.val); } } if(response->mtime) { char *datestr; char *if_modified_since = getenv("HTTP_IF_MODIFIED_SINCE"); datestr = apr_palloc(ctx->ctx.pool, APR_RFC822_DATE_LEN); apr_rfc822_date(datestr, response->mtime); printf("Last-Modified: %s\r\n", datestr); if(if_modified_since) { apr_time_t ims_time; apr_int64_t ims,mtime; mtime = apr_time_sec(response->mtime); ims_time = apr_date_parse_http(if_modified_since); ims = apr_time_sec(ims_time); if(ims >= mtime) { printf("Status: 304 Not Modified\r\n"); /* * "The 304 response MUST NOT contain a message-body" * https://tools.ietf.org/html/rfc2616#section-10.3.5 */ printf("\r\n"); return; } } } if(response->data) { printf("Content-Length: %ld\r\n\r\n", response->data->size); fwrite((char*)response->data->buf, response->data->size,1,stdout); } } apr_time_t mtime; char *conffile; static void load_config(mapcache_context *ctx, char *filename) { apr_file_t *f; apr_finfo_t finfo; mapcache_cfg *old_cfg; mapcache_cfg *cfg; if((apr_file_open(&f, filename, APR_FOPEN_READ, APR_UREAD | APR_GREAD, global_pool)) == APR_SUCCESS) { apr_file_info_get(&finfo, APR_FINFO_MTIME, f); apr_file_close(f); } else { if(!ctx->pool) ctx->pool = global_pool; ctx->set_error(ctx,500,"failed to open config file %s",filename); return; } if(ctx->config) { //we already have a loaded configuration, check that the config file hasn't changed if(finfo.mtime > mtime) { ctx->log(ctx,MAPCACHE_INFO,"config file has changed, reloading"); } else { return; } } mtime = finfo.mtime; /* either we have no config, or it has changed */ old_cfg = ctx->config; apr_pool_create(&tmp_config_pool,global_pool); cfg = mapcache_configuration_create(tmp_config_pool); ctx->config = cfg; ctx->pool = tmp_config_pool; mapcache_configuration_parse(ctx,conffile,cfg,1); if(GC_HAS_ERROR(ctx)) goto failed_load; mapcache_configuration_post_config(ctx, cfg); if(GC_HAS_ERROR(ctx)) goto failed_load; if(mapcache_config_services_enabled(ctx,cfg) <= 0) { ctx->set_error(ctx,500,"no mapcache s configured/enabled, no point in continuing."); goto failed_load; } /* no error, destroy the previous pool if we are reloading the config */ if(config_pool) { apr_pool_destroy(config_pool); } config_pool = tmp_config_pool; mapcache_connection_pool_create(&ctx->connection_pool, config_pool); return; failed_load: /* we failed to load the config file */ if(config_pool) { /* we already have a running configuration, keep it and only log the error to not * interrupt the already running service */ ctx->log(ctx,MAPCACHE_ERROR,"failed to reload config file %s: %s", conffile,ctx->get_error_message(ctx)); ctx->clear_errors(ctx); ctx->config = old_cfg; ctx->pool = config_pool; apr_pool_destroy(tmp_config_pool); } } int main(int argc, const char **argv) { mapcache_context_fcgi* globalctx; mapcache_context* ctx; apr_table_t *params; mapcache_request *request = NULL; char *pathInfo; mapcache_http_response *http_response; (void) signal(SIGTERM,handle_signal); #ifndef _WIN32 (void) signal(SIGUSR1,handle_signal); #endif apr_initialize(); atexit(apr_terminate); if(apr_pool_create(&global_pool,NULL) != APR_SUCCESS) { return 1; } config_pool = NULL; globalctx = fcgi_context_create(); ctx = (mapcache_context*)globalctx; conffile = getenv("MAPCACHE_CONFIG_FILE"); #ifdef DEBUG if(!conffile) { int i; for(i=1; ilog(ctx,MAPCACHE_INFO,"mapcache fcgi conf file: %s",conffile); #ifdef USE_FASTCGI while (FCGI_Accept() >= 0) { #endif ctx->pool = config_pool; if(!ctx->config || ctx->config->autoreload) { load_config(ctx,conffile); if(GC_HAS_ERROR(ctx)) { fcgi_write_response(globalctx, mapcache_core_respond_to_error(ctx)); goto cleanup; } } apr_pool_create(&(ctx->pool),config_pool); request = NULL; pathInfo = getenv("PATH_INFO"); params = mapcache_http_parse_param_string(ctx, getenv("QUERY_STRING")); mapcache_service_dispatch_request(ctx,&request,pathInfo,params,ctx->config); if(GC_HAS_ERROR(ctx) || !request) { fcgi_write_response(globalctx, mapcache_core_respond_to_error(ctx)); goto cleanup; } http_response = NULL; if(request->type == MAPCACHE_REQUEST_GET_CAPABILITIES) { mapcache_request_get_capabilities *req = (mapcache_request_get_capabilities*)request; char *host = getenv("SERVER_NAME"); char *port = getenv("SERVER_PORT"); char *fullhost; char *url; if(getenv("HTTPS")) { if(!port || !strcmp(port,"443")) { fullhost = apr_psprintf(ctx->pool,"https://%s",host); } else { fullhost = apr_psprintf(ctx->pool,"https://%s:%s",host,port); } } else { if(!port || !strcmp(port,"80")) { fullhost = apr_psprintf(ctx->pool,"http://%s",host); } else { fullhost = apr_psprintf(ctx->pool,"http://%s:%s",host,port); } } url = apr_psprintf(ctx->pool,"%s%s/", fullhost, getenv("SCRIPT_NAME") ); http_response = mapcache_core_get_capabilities(ctx,request->service,req,url,pathInfo,ctx->config); } else if( request->type == MAPCACHE_REQUEST_GET_TILE) { mapcache_request_get_tile *req_tile = (mapcache_request_get_tile*)request; http_response = mapcache_core_get_tile(ctx,req_tile); } else if( request->type == MAPCACHE_REQUEST_PROXY ) { mapcache_request_proxy *req_proxy = (mapcache_request_proxy*)request; http_response = mapcache_core_proxy_request(ctx, req_proxy); } else if( request->type == MAPCACHE_REQUEST_GET_MAP) { mapcache_request_get_map *req_map = (mapcache_request_get_map*)request; http_response = mapcache_core_get_map(ctx,req_map); } else if( request->type == MAPCACHE_REQUEST_GET_FEATUREINFO) { mapcache_request_get_feature_info *req_fi = (mapcache_request_get_feature_info*)request; http_response = mapcache_core_get_featureinfo(ctx,req_fi); #ifdef DEBUG } else { ctx->set_error(ctx,500,"###BUG### unknown request type"); #endif } if(GC_HAS_ERROR(ctx)) { fcgi_write_response(globalctx, mapcache_core_respond_to_error(ctx)); goto cleanup; } #ifdef DEBUG if(!http_response) { ctx->set_error(ctx,500,"###BUG### NULL response"); fcgi_write_response(globalctx, mapcache_core_respond_to_error(ctx)); goto cleanup; } #endif fcgi_write_response(globalctx,http_response); cleanup: #ifdef USE_FASTCGI apr_pool_destroy(ctx->pool); ctx->clear_errors(ctx); } #endif apr_pool_destroy(global_pool); apr_terminate(); return 0; } /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/cmake/000077500000000000000000000000001316353564100151255ustar00rootroot00000000000000mapcache-rel-1-6-1/cmake/FindAPACHE.cmake000066400000000000000000000016111316353564100176500ustar00rootroot00000000000000# # APACHE_FOUND - System has APACHE # APACHE_INCLUDE_DIR - The APACHE include directory # # APACHE_LOCATION # setting this enables search for apache libraries / headers in this location # # Include directories # find_path(APACHE_INCLUDE_DIR NAMES httpd.h PATH_SUFFIXES httpd apache apache2 apache22 apache24 ) if(NOT DEFINED APACHE_MODULE_DIR) find_program(APXS_BIN NAMES apxs apxs2 PATH_SUFFIXES httpd apache apache2 ) if(APXS_BIN) EXEC_PROGRAM(${APXS_BIN} ARGS -q LIBEXECDIR OUTPUT_VARIABLE APACHE_MODULE_DIR ) endif(APXS_BIN) endif(NOT DEFINED APACHE_MODULE_DIR) include(FindPackageHandleStandardArgs) # handle the QUIETLY and REQUIRED arguments and set APACHE_FOUND to TRUE if # all listed variables are TRUE find_package_handle_standard_args(APACHE DEFAULT_MSG APACHE_INCLUDE_DIR ) mark_as_advanced(APACHE_INCLUDE_DIR) mapcache-rel-1-6-1/cmake/FindAPR.cmake000066400000000000000000000046031316353564100173550ustar00rootroot00000000000000# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you 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. # - Find Apache Portable Runtime # Find the APR includes and libraries # This module defines # APR_INCLUDE_DIR and APRUTIL_INCLUDE_DIR, where to find apr.h, etc. # APR_LIBRARIES and APRUTIL_LIBRARIES, the libraries needed to use APR. # APR_FOUND and APRUTIL_FOUND, If false, do not try to use APR. # also defined, but not for general use are # APR_LIBRARY and APRUTIL_LIBRARY, where to find the APR library. # APR first. FIND_PROGRAM(APR_CONFIG_BIN NAMES apr-config apr-1-config ) if(APR_CONFIG_BIN) execute_process( COMMAND ${APR_CONFIG_BIN} --includedir OUTPUT_VARIABLE HINT_APR_INCLUDE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE ) execute_process( COMMAND ${APR_CONFIG_BIN} --cppflags OUTPUT_VARIABLE APR_CPPFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE ) endif(APR_CONFIG_BIN) FIND_PATH(APR_INCLUDE_DIR NAMES apr.h HINTS ${HINT_APR_INCLUDE_DIR} PATH_SUFFIXES apr-1 apr-1.0 apr ) FIND_LIBRARY(APR_LIBRARY NAMES apr-1 apr PATH_SUFFIXES apr-1 apr-1.0 apr ) set(APR_INCLUDE_DIRS ${APR_INCLUDE_DIR}) set(APR_LIBRARIES ${APR_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(APR DEFAULT_MSG APR_LIBRARY APR_INCLUDE_DIR) mark_as_advanced(APR_LIBRARY APR_INCLUDE_DIR) # Next, APRUTIL. FIND_PATH(APU_INCLUDE_DIR NAMES apu.h PATH_SUFFIXES apr-1 apr-1.0 apr ) FIND_LIBRARY(APU_LIBRARY NAMES aprutil-1 aprutil PATH_SUFFIXES apr-1 apr-1.0 apr ) set(APU_INCLUDE_DIRS ${APU_INCLUDE_DIR}) set(APU_LIBRARIES ${APU_LIBRARY}) find_package_handle_standard_args(APU DEFAULT_MSG APU_LIBRARY APU_INCLUDE_DIR) mark_as_advanced(APU_LIBRARY APU_INCLUDE_DIR) mapcache-rel-1-6-1/cmake/FindBerkeleyDB.cmake000066400000000000000000000071051316353564100207030ustar00rootroot00000000000000set(BERKELEYDB_FOUND TRUE) # set the search path if (WIN32) file(GLOB BERKELEYDB_SEARCH_PATH "C:/Program Files/Oracle/Berkeley DB*") if (NOT BERKELEYDB_SEARCH_PATH) file(GLOB BERKELEYDB_SEARCH_PATH "C:/Program Files (x86)/Oracle/Berkeley DB*") endif (NOT BERKELEYDB_SEARCH_PATH) else (WIN32) file(GLOB BERKELEYDB_SEARCH_PATH "/usr/local/BerkeleyDB*") file(GLOB BERKELEYDB_INC_SEARCH_PATH "/usr/local/BerkeleyDB*/include") file(GLOB BERKELEYDB_LIB_SEARCH_PATH "/usr/local/BerkeleyDB*/lib") endif (WIN32) # search for header find_path(BERKELEYDB_INCLUDE_DIR NAMES "db.h" HINTS ${BERKELEYDB_SEARCH_PATH} ${BERKELEYDB_INC_SEARCH_PATH} ) # header is found if (BERKELEYDB_INCLUDE_DIR) # retrieve version information from the header file(READ "${BERKELEYDB_INCLUDE_DIR}/db.h" DB_H_FILE) string(REGEX REPLACE ".*#define[ \t]+DB_VERSION_STRING[ \t]+\"([^\"]+)\".*" "\\1" BERKELEYDB_VERSION "${DB_H_FILE}") string(REGEX REPLACE ".*#define[ \t]+DB_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" BERKELEYDB_VERSION_MAJOR "${DB_H_FILE}") string(REGEX REPLACE ".*#define[ \t]+DB_VERSION_MINOR[ \t]+([0-9]+).*" "\\1" BERKELEYDB_VERSION_MINOR "${DB_H_FILE}") string(REGEX REPLACE ".*#define[ \t]+DB_VERSION_PATCH[ \t]+([0-9]+).*" "\\1" BERKELEYDB_VERSION_PATCH "${DB_H_FILE}") # search for library if (WIN32) file(GLOB BERKELEYDB_LIBRARIES "${DBROOTDIR}/lib/libdb${BERKELEYDB_VERSION_MAJOR}${BERKELEYDB_VERSION_MINOR}.lib" "${BERKELEYDB_SEARCH_PATH}/lib/libdb${BERKELEYDB_VERSION_MAJOR}${BERKELEYDB_VERSION_MINOR}.lib") else (WIN32) find_library(BERKELEYDB_LIBRARY NAMES "db-${BERKELEYDB_VERSION_MAJOR}.${BERKELEYDB_VERSION_MINOR}" db HINTS ${BERKELEYDB_SEARCH_PATH} ${BERKELEYDB_LIB_SEARCH_PATH} ) endif (WIN32) endif (BERKELEYDB_INCLUDE_DIR) # header is not found if (NOT BERKELEYDB_INCLUDE_DIR OR NOT BERKELEYDB_LIBRARY) set(BERKELEYDB_FOUND_TMP FALSE) else (NOT BERKELEYDB_INCLUDE_DIR OR NOT BERKELEYDB_LIBRARY) set(BERKELEYDB_FOUND_TMP TRUE) endif (NOT BERKELEYDB_INCLUDE_DIR OR NOT BERKELEYDB_LIBRARY) # check found version if (BERKELEYDB_FIND_VERSION AND BERKELEYDB_FOUND_TMP) set(BERKELEYDB_FOUND_VERSION "${BERKELEYDB_VERSION_MAJOR}.${BERKELEYDB_VERSION_MINOR}.${BERKELEYDB_VERSION_PATCH}") if (BERKELEYDB_FIND_VERSION_EXACT) if (NOT ${BERKELEYDB_FOUND_VERSION} VERSION_EQUAL ${BERKELEYDB_FIND_VERSION}) set(BERKELEYDB_FOUND_TMP FALSE) endif (NOT ${BERKELEYDB_FOUND_VERSION} VERSION_EQUAL ${BERKELEYDB_FIND_VERSION}) else (BERKELEYDB_FIND_VERSION_EXACT) if (${BERKELEYDB_FOUND_VERSION} VERSION_LESS ${BERKELEYDB_FIND_VERSION}) set(BERKELEYDB_FOUND_TMP FALSE) endif (${BERKELEYDB_FOUND_VERSION} VERSION_LESS ${BERKELEYDB_FIND_VERSION}) endif (BERKELEYDB_FIND_VERSION_EXACT) if (NOT BERKELEYDB_FOUND_TMP) message(SEND_ERROR "Berkeley DB library found, but with wrong version v${BERKELEYDB_FIND_VERSION} (${BERKELEYDB_FOUND_VERSION} was found)") unset(BERKELEYDB_INCLUDE_DIR) unset(BERKELEYDB_LIBRARY) endif (NOT BERKELEYDB_FOUND_TMP) endif (BERKELEYDB_FIND_VERSION AND BERKELEYDB_FOUND_TMP) set(BERKELEYDB_INCLUDE_DIRS ${BERKELEYDB_INCLUDE_DIR}) set(BERKELEYDB_LIBRARIES ${BERKELEYDB_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(BERKELEYDB DEFAULT_MSG BERKELEYDB_LIBRARY BERKELEYDB_INCLUDE_DIR) mark_as_advanced(BERKELEYDB_LIBRARY BERKELEYDB_INCLUDE_DIR) mapcache-rel-1-6-1/cmake/FindFCGI.cmake000066400000000000000000000006001316353564100174340ustar00rootroot00000000000000# Look for the header file. find_path(FCGI_INCLUDE_DIR NAMES fastcgi.h) # Look for the library. find_library(FCGI_LIBRARY NAMES fcgi) set(FCGI_INCLUDE_DIRS ${FCGI_INCLUDE_DIR}) set(FCGI_LIBRARIES ${FCGI_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(FCGI DEFAULT_MSG FCGI_LIBRARY FCGI_INCLUDE_DIR) mark_as_advanced(FCGI_LIBRARY FCGI_INCLUDE_DIR) mapcache-rel-1-6-1/cmake/FindGEOS.cmake000066400000000000000000000016501316353564100174670ustar00rootroot00000000000000# Find the native GEOS(Geometry Engine - Open Source) includes and libraries. # # This module defines: # # GEOS_INCLUDE_DIR, where to find geos.h, etc. # GEOS_LIBRARY, libraries to link against to use GEOS, using the geos_c library # GEOS_FOUND, True if found, false if one of the above are not found. #--- # Find include path: # Note: Version < 3.3.0 do not have geos.h in the geos sub directory; hence, # the check for both "geos/geos.h" and "geos.h". #--- find_path( GEOS_INCLUDE_DIR NAMES geos_c.h PATH_SUFFIXES geos) # Find GEOS C library: find_library( GEOS_LIBRARY NAMES geos_c ) set(GEOS_INCLUDE_DIRS ${GEOS_INCLUDE_DIR}) set(GEOS_LIBRARIES ${GEOS_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args( GEOS DEFAULT_MSG GEOS_LIBRARY GEOS_INCLUDE_DIR ) MARK_AS_ADVANCED(GEOS_LIBRARY GEOS_INCLUDE_DIR) mapcache-rel-1-6-1/cmake/FindGEOTIFF.cmake000066400000000000000000000006751316353564100200230ustar00rootroot00000000000000find_path(GEOTIFF_INCLUDE_DIR NAMES geotiff.h PATH_SUFFIXES libgeotiff geotiff) find_library(GEOTIFF_LIBRARY NAMES geotiff geotiff3 PATH_SUFFIXES geotiff ) set(GEOTIFF_INCLUDE_DIRS ${GEOTIFF_INCLUDE_DIR}) set(GEOTIFF_LIBRARIES ${GEOTIFF_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(GEOTIFF DEFAULT_MSG GEOTIFF_LIBRARY GEOTIFF_INCLUDE_DIR) mark_as_advanced(GEOTIFF_LIBRARY GEOTIFF_INCLUDE_DIR) mapcache-rel-1-6-1/cmake/FindMAPSERVER.cmake000066400000000000000000000006611316353564100202770ustar00rootroot00000000000000 FIND_PATH(MAPSERVER_INCLUDE_DIR NAMES mapserver.h PATH_SUFFIXES mapserver ) FIND_LIBRARY(MAPSERVER_LIBRARY NAMES mapserver ) set(MAPSERVER_INCLUDE_DIRS ${MAPSERVER_INCLUDE_DIR}) set(MAPSERVER_LIBRARIES ${MAPSERVER_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(MAPSERVER DEFAULT_MSG MAPSERVER_LIBRARY MAPSERVER_INCLUDE_DIR) mark_as_advanced(MAPSERVER_LIBRARY MAPSERVER_INCLUDE_DIR) mapcache-rel-1-6-1/cmake/FindPCRE.cmake000066400000000000000000000005321316353564100174610ustar00rootroot00000000000000 FIND_PATH(PCRE_INCLUDE_DIR NAMES pcre.h ) FIND_LIBRARY(PCRE_LIBRARY NAMES pcre pcred ) set(PCRE_INCLUDE_DIRS ${PCRE_INCLUDE_DIR}) set(PCRE_LIBRARIES ${PCRE_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(PCRE DEFAULT_MSG PCRE_LIBRARY PCRE_INCLUDE_DIR) mark_as_advanced(PCRE_LIBRARY PCRE_INCLUDE_DIR) mapcache-rel-1-6-1/cmake/FindPixman.cmake000066400000000000000000000012721316353564100201660ustar00rootroot00000000000000FIND_PACKAGE(PkgConfig) PKG_CHECK_MODULES(PC_PIXMAN pixman) if(NOT PC_PIXMAN_FOUND) PKG_CHECK_MODULES(PC_PIXMAN pixman-1) endif(NOT PC_PIXMAN_FOUND) FIND_PATH(PIXMAN_INCLUDE_DIR NAMES pixman.h HINTS ${PC_PIXMAN_INCLUDEDIR} ${PC_PIXMAN_INCLUDE_DIR} PATH_SUFFIXES pixman pixman-1 ) FIND_LIBRARY(PIXMAN_LIBRARY NAMES pixman pixman-1 HINTS ${PC_PIXMAN_LIBDIR} ${PC_PIXMAN_LIBRARY_DIRS} ) set(PIXMAN_INCLUDE_DIRS ${PIXMAN_INCLUDE_DIR}) set(PIXMAN_LIBRARIES ${PIXMAN_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(PIXMAN DEFAULT_MSG PIXMAN_LIBRARY PIXMAN_INCLUDE_DIR) mark_as_advanced(PIXMAN_LIBRARY PIXMAN_INCLUDE_DIR) mapcache-rel-1-6-1/cmake/FindRIAK.cmake000066400000000000000000000005261316353564100174610ustar00rootroot00000000000000 FIND_PATH(RIAK_INCLUDE_DIR NAMES riack.h ) FIND_LIBRARY(RIAK_LIBRARY NAMES riack ) set(RIAK_INCLUDE_DIRS ${RIAK_INCLUDE_DIR}) set(RIAK_LIBRARIES ${RIAK_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(RIAK DEFAULT_MSG RIAK_LIBRARY RIAK_INCLUDE_DIR) mark_as_advanced(RIAK_LIBRARY RIAK_INCLUDE_DIR) mapcache-rel-1-6-1/cmake/FindSQLITE.cmake000066400000000000000000000006331316353564100177330ustar00rootroot00000000000000 FIND_PATH(SQLITE_INCLUDE_DIR NAMES sqlite3.h PATH_SUFFIXES sqlite sqlite3 ) FIND_LIBRARY(SQLITE_LIBRARY NAMES sqlite3 sqlite3_i ) set(SQLITE_INCLUDE_DIRS ${SQLITE_INCLUDE_DIR}) set(SQLITE_LIBRARIES ${SQLITE_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(SQLITE DEFAULT_MSG SQLITE_LIBRARY SQLITE_INCLUDE_DIR) mark_as_advanced(SQLITE_LIBRARY SQLITE_INCLUDE_DIR) mapcache-rel-1-6-1/include/000077500000000000000000000000001316353564100154705ustar00rootroot00000000000000mapcache-rel-1-6-1/include/errors.h000066400000000000000000000036341316353564100171630ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #ifndef MAPCACHE_ERRORS_H_ #define MAPCACHE_ERRORS_H_ typedef enum { MAPCACHE_DEBUG, MAPCACHE_INFO, MAPCACHE_NOTICE, MAPCACHE_WARN, MAPCACHE_ERROR, MAPCACHE_CRIT, MAPCACHE_ALERT, MAPCACHE_EMERG } mapcache_log_level; typedef enum { MAPCACHE_REPORT_LOG, MAPCACHE_REPORT_MSG, MAPCACHE_REPORT_ERROR_IMG, MAPCACHE_REPORT_EMPTY_IMG, MAPCACHE_REPORT_CUSTOM_IMG } mapcache_error_reporting; #endif /* ERRORS_H_ */ /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/include/ezxml.h000066400000000000000000000152701316353564100170050ustar00rootroot00000000000000/* ezxml.h * * Copyright 2004-2006 Aaron Voisine * * 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef _EZXML_H #define _EZXML_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif #define EZXML_BUFSIZE 1024 // size of internal memory buffers #define EZXML_NAMEM 0x80 // name is malloced #define EZXML_TXTM 0x40 // txt is malloced #define EZXML_DUP 0x20 // attribute name and value are strduped typedef struct ezxml *ezxml_t; struct ezxml { char *name; // tag name char **attr; // tag attributes { name, value, name, value, ... NULL } char *txt; // tag character content, empty string if none size_t off; // tag offset from start of parent tag character content ezxml_t next; // next tag with same name in this section at this depth ezxml_t sibling; // next tag with different name in same section and depth ezxml_t ordered; // next tag, same section and depth, in original order ezxml_t child; // head of sub tag list, NULL if none ezxml_t parent; // parent tag, NULL if current tag is root tag short flags; // additional information }; // Given a string of xml data and its length, parses it and creates an ezxml // structure. For efficiency, modifies the data by adding null terminators // and decoding ampersand sequences. If you don't want this, copy the data and // pass in the copy. Returns NULL on failure. ezxml_t ezxml_parse_str(char *s, size_t len); // A wrapper for ezxml_parse_str() that accepts a file descriptor. First // attempts to mem map the file. Failing that, reads the file into memory. // Returns NULL on failure. ezxml_t ezxml_parse_fd(int fd); // a wrapper for ezxml_parse_fd() that accepts a file name ezxml_t ezxml_parse_file(const char *file); // Wrapper for ezxml_parse_str() that accepts a file stream. Reads the entire // stream into memory and then parses it. For xml files, use ezxml_parse_file() // or ezxml_parse_fd() ezxml_t ezxml_parse_fp(FILE *fp); // returns the first child tag (one level deeper) with the given name or NULL // if not found ezxml_t ezxml_child(ezxml_t xml, const char *name); // returns the next tag of the same name in the same section and depth or NULL // if not found #define ezxml_next(xml) ((xml) ? xml->next : NULL) // Returns the Nth tag with the same name in the same section at the same depth // or NULL if not found. An index of 0 returns the tag given. ezxml_t ezxml_idx(ezxml_t xml, int idx); // returns the name of the given tag #define ezxml_name(xml) ((xml) ? xml->name : NULL) // returns the given tag's character content or empty string if none #define ezxml_txt(xml) ((xml) ? xml->txt : "") // returns the value of the requested tag attribute, or NULL if not found const char *ezxml_attr(ezxml_t xml, const char *attr); // Traverses the ezxml sturcture to retrieve a specific subtag. Takes a // variable length list of tag names and indexes. The argument list must be // terminated by either an index of -1 or an empty string tag name. Example: // title = ezxml_get(library, "shelf", 0, "book", 2, "title", -1); // This retrieves the title of the 3rd book on the 1st shelf of library. // Returns NULL if not found. ezxml_t ezxml_get(ezxml_t xml, ...); // Converts an ezxml structure back to xml. Returns a string of xml data that // must be freed. char *ezxml_toxml(ezxml_t xml); // returns a NULL terminated array of processing instructions for the given // target const char **ezxml_pi(ezxml_t xml, const char *target); // frees the memory allocated for an ezxml structure void ezxml_free(ezxml_t xml); // returns parser error message or empty string if none const char *ezxml_error(ezxml_t xml); // returns a new empty ezxml structure with the given root tag name ezxml_t ezxml_new(const char *name); // wrapper for ezxml_new() that strdup()s name #define ezxml_new_d(name) ezxml_set_flag(ezxml_new(strdup(name)), EZXML_NAMEM) // Adds a child tag. off is the offset of the child tag relative to the start // of the parent tag's character content. Returns the child tag. ezxml_t ezxml_add_child(ezxml_t xml, const char *name, size_t off); // wrapper for ezxml_add_child() that strdup()s name #define ezxml_add_child_d(xml, name, off) \ ezxml_set_flag(ezxml_add_child(xml, strdup(name), off), EZXML_NAMEM) // sets the character content for the given tag and returns the tag ezxml_t ezxml_set_txt(ezxml_t xml, const char *txt); // wrapper for ezxml_set_txt() that strdup()s txt #define ezxml_set_txt_d(xml, txt) \ ezxml_set_flag(ezxml_set_txt(xml, strdup(txt)), EZXML_TXTM) // Sets the given tag attribute or adds a new attribute if not found. A value // of NULL will remove the specified attribute. Returns the tag given. ezxml_t ezxml_set_attr(ezxml_t xml, const char *name, const char *value); // Wrapper for ezxml_set_attr() that strdup()s name/value. Value cannot be NULL #define ezxml_set_attr_d(xml, name, value) \ ezxml_set_attr(ezxml_set_flag(xml, EZXML_DUP), strdup(name), strdup(value)) // sets a flag for the given tag and returns the tag ezxml_t ezxml_set_flag(ezxml_t xml, short flag); // removes a tag along with its subtags without freeing its memory ezxml_t ezxml_cut(ezxml_t xml); // inserts an existing tag into an ezxml structure ezxml_t ezxml_insert(ezxml_t xml, ezxml_t dest, size_t off); // Moves an existing tag to become a subtag of dest at the given offset from // the start of dest's character content. Returns the moved tag. #define ezxml_move(xml, dest, off) ezxml_insert(ezxml_cut(xml), dest, off) // removes a tag along with all its subtags #define ezxml_remove(xml) ezxml_free(ezxml_cut(xml)) #ifdef __cplusplus } #endif #endif // _EZXML_H mapcache-rel-1-6-1/include/mapcache-config.h.in000066400000000000000000000007541316353564100212600ustar00rootroot00000000000000#ifndef _MAPCACHE_CONFIG_H #define _MAPCACHE_CONFIG_H #cmakedefine USE_PIXMAN 1 #cmakedefine USE_FASTCGI 1 #cmakedefine USE_SQLITE 1 #cmakedefine USE_BDB 1 #cmakedefine USE_MEMCACHE 1 #cmakedefine USE_TIFF 1 #cmakedefine USE_TIFF_WRITE 1 #cmakedefine USE_GEOTIFF 1 #cmakedefine USE_PCRE 1 #cmakedefine USE_MAPSERVER 1 #cmakedefine USE_RIAK 1 #cmakedefine USE_GDAL 1 #cmakedefine HAVE_STRNCASECMP 1 #cmakedefine HAVE_SYMLINK 1 #cmakedefine HAVE_STRPTIME 1 #cmakedefine HAVE_TIMEGM 1 #endif mapcache-rel-1-6-1/include/mapcache-version.h.in000066400000000000000000000005261316353564100214750ustar00rootroot00000000000000#ifndef _MAPCACHE_VERSION_H #define _MAPCACHE_VERSION_H #define MAPCACHE_VERSION_MAJOR @MAPCACHE_VERSION_MAJOR@ #define MAPCACHE_VERSION_MINOR @MAPCACHE_VERSION_MINOR@ #define MAPCACHE_VERSION_REV @MAPCACHE_VERSION_REVISION@ #define MAPCACHE_VERSION "@MAPCACHE_VERSION_STRING@" #define MAPCACHE_VERSION_NUM @MAPCACHE_VERSION_NUM@ #endif mapcache-rel-1-6-1/include/mapcache.h000066400000000000000000001462401316353564100174110ustar00rootroot00000000000000/****************************************************************************** * * Project: MapCache * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ /*! \file mapcache.h \brief global function and structure declarations */ #ifndef MAPCACHE_H_ #define MAPCACHE_H_ #include "mapcache-config.h" #include "mapcache-version.h" #include #include #include #include "util.h" #include "ezxml.h" #include "errors.h" #include #include #include #define MAPCACHE_SUCCESS 0 #define MAPCACHE_FAILURE 1 #define MAPCACHE_TRUE 1 #define MAPCACHE_FALSE 0 #define MAPCACHE_TILESET_WRONG_SIZE 2 #define MAPCACHE_TILESET_WRONG_RESOLUTION 3 #define MAPCACHE_TILESET_WRONG_EXTENT 4 #define MAPCACHE_CACHE_MISS 5 #define MAPCACHE_FILE_LOCKED 6 #define MAPCACHE_CACHE_RELOAD 7 #define MAPCACHE_MAX_NUM_TILES 1000 #define MAPCACHE_USERAGENT "mod-mapcache/"MAPCACHE_VERSION #if defined(_WIN32) && !defined(__CYGWIN__) # define MS_DLL_EXPORT __declspec(dllexport) #else #define MS_DLL_EXPORT #endif typedef struct mapcache_image_format mapcache_image_format; typedef struct mapcache_image_format_mixed mapcache_image_format_mixed; typedef struct mapcache_image_format_png mapcache_image_format_png; typedef struct mapcache_image_format_png_q mapcache_image_format_png_q; typedef struct mapcache_image_format_jpeg mapcache_image_format_jpeg; typedef struct mapcache_cfg mapcache_cfg; typedef struct mapcache_tileset mapcache_tileset; typedef struct mapcache_cache mapcache_cache; typedef struct mapcache_source mapcache_source; typedef struct mapcache_buffer mapcache_buffer; typedef struct mapcache_tile mapcache_tile; typedef struct mapcache_metatile mapcache_metatile; typedef struct mapcache_feature_info mapcache_feature_info; typedef struct mapcache_request_get_feature_info mapcache_request_get_feature_info; typedef struct mapcache_map mapcache_map; typedef struct mapcache_http_response mapcache_http_response; typedef struct mapcache_http mapcache_http; typedef struct mapcache_request mapcache_request; typedef struct mapcache_request_image mapcache_request_image; typedef struct mapcache_request_proxy mapcache_request_proxy; typedef struct mapcache_request_get_capabilities mapcache_request_get_capabilities; typedef struct mapcache_forwarding_rule mapcache_forwarding_rule; typedef struct mapcache_request_get_tile mapcache_request_get_tile; typedef struct mapcache_request_get_map mapcache_request_get_map; typedef struct mapcache_service mapcache_service; typedef struct mapcache_server_cfg mapcache_server_cfg; typedef struct mapcache_image mapcache_image; typedef struct mapcache_grid mapcache_grid; typedef struct mapcache_grid_level mapcache_grid_level; typedef struct mapcache_grid_link mapcache_grid_link; typedef struct mapcache_context mapcache_context; typedef struct mapcache_dimension mapcache_dimension; typedef struct mapcache_requested_dimension mapcache_requested_dimension; typedef struct mapcache_extent mapcache_extent; typedef struct mapcache_extent_i mapcache_extent_i; typedef struct mapcache_connection_pool mapcache_connection_pool; typedef struct mapcache_locker mapcache_locker; typedef enum { MAPCACHE_DIMENSION_VALUES, MAPCACHE_DIMENSION_REGEX, MAPCACHE_DIMENSION_INTERVALS, MAPCACHE_DIMENSION_TIME, MAPCACHE_DIMENSION_SQLITE } mapcache_dimension_type; typedef enum { MAPCACHE_DIMENSION_ASSEMBLY_NONE, MAPCACHE_DIMENSION_ASSEMBLY_STACK, MAPCACHE_DIMENSION_ASSEMBLY_ANIMATE } mapcache_dimension_assembly_type; /** \defgroup utility Utility */ /** @{ */ struct mapcache_extent { double minx; double miny; double maxx; double maxy; }; struct mapcache_extent_i { int minx; int miny; int maxx; int maxy; }; mapcache_image *mapcache_error_image(mapcache_context *ctx, int width, int height, char *msg); /** * \interface mapcache_context * \brief structure passed to most mapcache functions to abstract common functions */ struct mapcache_context { /** * \brief indicate that an error has happened * \memberof mapcache_context * \param c * \param code the error code * \param message human readable message of what happened */ void (*set_error)(mapcache_context *ctx, int code, char *message, ...); void (*set_exception)(mapcache_context *ctx, char *key, char *message, ...); /** * \brief query context to know if an error has occurred * \memberof mapcache_context */ int (*get_error)(mapcache_context * ctx); /** * \brief get human readable message for the error * \memberof mapcache_context */ char* (*get_error_message)(mapcache_context * ctx); /** * \brief get human readable message for the error * \memberof mapcache_context */ void (*clear_errors)(mapcache_context * ctx); /** * \brief clear current error and store it in mapcache_error * \memberof mapcache_context */ void (*pop_errors)(mapcache_context * ctx, void **error); /** * \brief restore error status from mapcache_error * \memberof mapcache_context */ void (*push_errors)(mapcache_context * ctx, void *error); /** * \brief log a message * \memberof mapcache_context */ void (*log)(mapcache_context *ctx, mapcache_log_level level, char *message, ...); const char* (*get_instance_id)(mapcache_context * ctx); mapcache_context* (*clone)(mapcache_context *ctx); apr_pool_t *pool; mapcache_connection_pool *connection_pool; char *_contenttype; char *_errmsg; int _errcode; mapcache_cfg *config; mapcache_service *service; apr_table_t *exceptions; int supports_redirects; apr_table_t *headers_in; }; MS_DLL_EXPORT void mapcache_context_init(mapcache_context *ctx); MS_DLL_EXPORT void mapcache_context_copy(mapcache_context *src, mapcache_context *dst); #define GC_CHECK_ERROR_RETURN(ctx) if(((mapcache_context*)ctx)->_errcode) return MAPCACHE_FAILURE; #define GC_CHECK_ERROR(ctx) if(((mapcache_context*)ctx)->_errcode) return; #define GC_HAS_ERROR(ctx) (((mapcache_context*)ctx)->_errcode > 0) /** * \brief autoexpanding buffer that allocates memory from a pool * \sa mapcache_buffer_create() * \sa mapcache_buffer_append() * */ struct mapcache_buffer { void* buf; /**< pointer to the actual data contained in buffer */ size_t size; /**< number of bytes actually used in the buffer */ size_t avail; /**< number of bytes allocated */ apr_pool_t* pool; /**< apache pool to allocate from */ }; /* in buffer.c */ /** * \brief create and initialize a mapcache_buffer * \memberof mapcache_buffer * \param initialStorage the initial size that should be allocated in the buffer. * defaults to #INITIAL_BUFFER_SIZE. * \param pool the pool from which to allocate memory. */ mapcache_buffer *mapcache_buffer_create(size_t initialStorage, apr_pool_t* pool); /** * \brief append data * \memberof mapcache_buffer * \param buffer * \param len the lenght of the data to append. * \param data the data to append */ int mapcache_buffer_append(mapcache_buffer *buffer, size_t len, void *data); /** @} */ /** \defgroup source Sources */ /** @{ */ typedef enum { MAPCACHE_SOURCE_WMS, MAPCACHE_SOURCE_MAPSERVER, MAPCACHE_SOURCE_DUMMY, MAPCACHE_SOURCE_GDAL, MAPCACHE_SOURCE_FALLBACK } mapcache_source_type; /**\interface mapcache_source * \brief a source of data that can return image data */ struct mapcache_source { char *name; /**< the key this source can be referenced by */ mapcache_extent data_extent; /**< extent in which this source can produce data */ mapcache_source_type type; apr_table_t *metadata; unsigned int retry_count; double retry_delay; apr_array_header_t *info_formats; /** * \brief get the data for the metatile * * sets the mapcache_metatile::tile::data for the given tile */ void (*_render_map)(mapcache_context *ctx, mapcache_source *psource, mapcache_map *map); void (*_query_info)(mapcache_context *ctx, mapcache_source *psource, mapcache_feature_info *fi); void (*configuration_parse_xml)(mapcache_context *ctx, ezxml_t xml, mapcache_source * source, mapcache_cfg *config); void (*configuration_check)(mapcache_context *ctx, mapcache_cfg *cfg, mapcache_source * source); }; mapcache_http* mapcache_http_configuration_parse_xml(mapcache_context *ctx,ezxml_t node); mapcache_http* mapcache_http_clone(mapcache_context *ctx, mapcache_http *orig); struct mapcache_http { char *url; /**< the base url to request */ apr_table_t *headers; /**< additional headers to add to the http request, eg, Referer */ char *post_body; size_t post_len; int connection_timeout; int timeout; /* TODO: authentication */ }; /** \defgroup cache Caches */ /** @{ */ typedef enum { MAPCACHE_CACHE_DISK ,MAPCACHE_CACHE_REST ,MAPCACHE_CACHE_MEMCACHE ,MAPCACHE_CACHE_SQLITE ,MAPCACHE_CACHE_BDB ,MAPCACHE_CACHE_TC ,MAPCACHE_CACHE_TIFF ,MAPCACHE_CACHE_COMPOSITE ,MAPCACHE_CACHE_COUCHBASE ,MAPCACHE_CACHE_RIAK } mapcache_cache_type; /** \interface mapcache_cache * \brief a place to cache a mapcache_tile */ struct mapcache_cache { char *name; /**< key this cache is referenced by */ mapcache_cache_type type; apr_table_t *metadata; unsigned int retry_count; double retry_delay; /** * get tile content from cache * \returns MAPCACHE_SUCCESS if the data was correctly loaded from the cache * \returns MAPCACHE_FAILURE if the file exists but contains no data * \returns MAPCACHE_CACHE_MISS if the file does not exist on the cache * \memberof mapcache_cache */ int (*_tile_get)(mapcache_context *ctx, mapcache_cache *cache, mapcache_tile * tile); /** * delete tile from cache * * \memberof mapcache_cache */ void (*_tile_delete)(mapcache_context *ctx, mapcache_cache *cache, mapcache_tile * tile); int (*_tile_exists)(mapcache_context *ctx, mapcache_cache *cache, mapcache_tile * tile); /** * set tile content to cache * \memberof mapcache_cache */ void (*_tile_set)(mapcache_context *ctx, mapcache_cache *cache, mapcache_tile * tile); void (*_tile_multi_set)(mapcache_context *ctx, mapcache_cache *cache, mapcache_tile *tiles, int ntiles); void (*configuration_parse_xml)(mapcache_context *ctx, ezxml_t xml, mapcache_cache * cache, mapcache_cfg *config); void (*configuration_post_config)(mapcache_context *ctx, mapcache_cache * cache, mapcache_cfg *config); }; MS_DLL_EXPORT int mapcache_cache_tile_get(mapcache_context *ctx, mapcache_cache *cache, mapcache_tile *tile); void mapcache_cache_tile_delete(mapcache_context *ctx, mapcache_cache *cache, mapcache_tile *tile); MS_DLL_EXPORT int mapcache_cache_tile_exists(mapcache_context *ctx, mapcache_cache *cache, mapcache_tile *tile); MS_DLL_EXPORT void mapcache_cache_tile_set(mapcache_context *ctx, mapcache_cache *cache, mapcache_tile *tile); void mapcache_cache_tile_multi_set(mapcache_context *ctx, mapcache_cache *cache, mapcache_tile *tiles, int ntiles); /** * \memberof mapcache_cache_sqlite */ mapcache_cache* mapcache_cache_sqlite_create(mapcache_context *ctx); mapcache_cache* mapcache_cache_mbtiles_create(mapcache_context *ctx); /** * \memberof mapcache_cache_bdb */ mapcache_cache *mapcache_cache_bdb_create(mapcache_context *ctx); /** * \memberof mapcache_cache_memcache */ mapcache_cache* mapcache_cache_memcache_create(mapcache_context *ctx); /** * \memberof mapcache_cache_couchbase */ mapcache_cache* mapcache_cache_couchbase_create(mapcache_context *ctx); /** * \memberof mapcache_cache_tc */ mapcache_cache* mapcache_cache_tc_create(mapcache_context *ctx); /** * \memberof mapcache_cache_riak */ mapcache_cache* mapcache_cache_riak_create(mapcache_context *ctx); /** @} */ typedef enum { MAPCACHE_REQUEST_UNKNOWN, MAPCACHE_REQUEST_GET_TILE, MAPCACHE_REQUEST_GET_MAP, MAPCACHE_REQUEST_GET_CAPABILITIES, MAPCACHE_REQUEST_GET_FEATUREINFO, MAPCACHE_REQUEST_PROXY } mapcache_request_type; typedef enum { MAPCACHE_GETMAP_ERROR, MAPCACHE_GETMAP_ASSEMBLE, MAPCACHE_GETMAP_FORWARD } mapcache_getmap_strategy; typedef enum { MAPCACHE_RESAMPLE_NEAREST, MAPCACHE_RESAMPLE_BILINEAR } mapcache_resample_mode; /** * \brief a request sent by a client */ struct mapcache_request { mapcache_request_type type; mapcache_service *service; }; struct mapcache_request_image { mapcache_request request; mapcache_image_format *format; }; struct mapcache_request_get_tile { mapcache_request_image image_request; /** * a list of tiles requested by the client */ mapcache_tile **tiles; /** * the number of tiles requested by the client. * If more than one, and merging is enabled, * the supplied tiles will be merged together * before being returned to the client */ int ntiles; int allow_redirect; }; struct mapcache_http_response { mapcache_buffer *data; apr_table_t *headers; long code; apr_time_t mtime; }; struct mapcache_map { mapcache_tileset *tileset; mapcache_grid_link *grid_link; apr_array_header_t *dimensions; mapcache_buffer *encoded_data; mapcache_image *raw_image; int nodata; /**< \sa mapcache_tile::nodata */ int width, height; mapcache_extent extent; apr_time_t mtime; /**< last modification time */ int expires; /**< time in seconds after which the tile should be rechecked for validity */ }; struct mapcache_feature_info { mapcache_map map; int i,j; char *format; mapcache_buffer *data; }; struct mapcache_request_get_feature_info { mapcache_request request; mapcache_feature_info *fi; }; struct mapcache_request_get_map { mapcache_request_image image_request; mapcache_map **maps; int nmaps; mapcache_getmap_strategy getmap_strategy; mapcache_resample_mode resample_mode; }; struct mapcache_request_get_capabilities { mapcache_request request; /** * the body of the capabilities */ char *capabilities; /** * the mime type */ char *mime_type; }; struct mapcache_forwarding_rule { char *name; mapcache_http *http; apr_array_header_t *match_params; /* actually those are mapcache_dimensions */ int append_pathinfo; size_t max_post_len; }; struct mapcache_request_proxy { mapcache_request request; mapcache_forwarding_rule *rule; apr_table_t *params; apr_table_t *headers; const char *pathinfo; char *post_buf; size_t post_len; }; /** \defgroup services Services*/ /** @{ */ #define MAPCACHE_SERVICES_COUNT 8 typedef enum { MAPCACHE_SERVICE_TMS=0, MAPCACHE_SERVICE_WMTS, MAPCACHE_SERVICE_DEMO, MAPCACHE_SERVICE_GMAPS, MAPCACHE_SERVICE_KML, MAPCACHE_SERVICE_VE, MAPCACHE_SERVICE_MAPGUIDE, MAPCACHE_SERVICE_WMS } mapcache_service_type; #define MAPCACHE_UNITS_COUNT 3 typedef enum { MAPCACHE_UNIT_METERS=0, MAPCACHE_UNIT_DEGREES, MAPCACHE_UNIT_FEET } mapcache_unit; /* defined in util.c*/ extern const double mapcache_meters_per_unit[MAPCACHE_UNITS_COUNT]; /** \interface mapcache_service * \brief a standard service (eg WMS, TMS) */ struct mapcache_service { char *name; mapcache_service_type type; /** * the pathinfo prefix of the url that routes to this service * eg, for accessing a wms service on http://host/mapcache/mywmsservice? , * url_prefix would take the value "mywmsservice" */ char *url_prefix; /** * \brief allocates and populates a mapcache_request corresponding to the parameters received */ void (*parse_request)(mapcache_context *ctx, mapcache_service *service, mapcache_request **request, const char *path_info, apr_table_t *params, mapcache_cfg * config); /** * \param request the received request (should be of type MAPCACHE_REQUEST_CAPABILITIES * \param url the full url at which the service is available */ void (*create_capabilities_response)(mapcache_context *ctx, mapcache_request_get_capabilities *request, char *url, char *path_info, mapcache_cfg *config); /** * parse advanced configuration options for the selected service */ void (*configuration_parse_xml)(mapcache_context *ctx, ezxml_t xml, mapcache_service * service, mapcache_cfg *config); void (*format_error)(mapcache_context *ctx, mapcache_service * service, char *err_msg, char **err_body, apr_table_t *headers); }; /** * \brief create and initialize a mapcache_service_wms * \memberof mapcache_service_wms */ mapcache_service* mapcache_service_wms_create(mapcache_context *ctx); /** * \brief create and initialize a mapcache_service_ve * \memberof mapcache_service_ve */ mapcache_service* mapcache_service_ve_create(mapcache_context *ctx); /** * \brief create and initialize a mapcache_service_mapguide * \memberof mapcache_service_mapguide */ mapcache_service* mapcache_service_mapguide_create(mapcache_context *ctx); /** * \brief create and initialize a mapcache_service_gmaps * \memberof mapcache_service_gmaps */ mapcache_service* mapcache_service_gmaps_create(mapcache_context *ctx); /** * \brief create and initialize a mapcache_service_kml * \memberof mapcache_service_kml */ mapcache_service* mapcache_service_kml_create(mapcache_context *ctx); /** * \brief create and initialize a mapcache_service_tms * \memberof mapcache_service_tms */ mapcache_service* mapcache_service_tms_create(mapcache_context *ctx); /** * \brief create and initialize a mapcache_service_wmts * \memberof mapcache_service_wtms */ mapcache_service* mapcache_service_wmts_create(mapcache_context *ctx); /** * \brief create and initialize a mapcache_service_demo * \memberof mapcache_service_demo */ mapcache_service* mapcache_service_demo_create(mapcache_context *ctx); /** * \brief return the request that corresponds to the given url */ MS_DLL_EXPORT void mapcache_service_dispatch_request(mapcache_context *ctx, mapcache_request **request, char *pathinfo, apr_table_t *params, mapcache_cfg *config); /** * \brief return the number of enabled/configured services */ MS_DLL_EXPORT int mapcache_config_services_enabled(mapcache_context *ctx, mapcache_cfg *config); /** @} */ /** \defgroup image Image Data Handling */ /** @{ */ typedef enum { GC_UNKNOWN, GC_PNG, GC_JPEG } mapcache_image_format_type; typedef enum { MC_EMPTY_UNKNOWN, MC_EMPTY_YES, MC_EMPTY_NO } mapcache_image_blank_type; typedef enum { MC_ALPHA_UNKNOWN, MC_ALPHA_YES, MC_ALPHA_NO } mapcache_image_alpha_type; /**\class mapcache_image * \brief representation of an RGBA image * * to access a pixel at position x,y, you should use the #GET_IMG_PIXEL macro */ struct mapcache_image { unsigned char *data; /**< pointer to the beginning of image data, stored in rgba order */ size_t w; /**< width of the image */ size_t h; /**< height of the image */ size_t stride; /**< stride of an image row */ mapcache_image_blank_type is_blank; mapcache_image_alpha_type has_alpha; }; /** \def GET_IMG_PIXEL * return the address of a pixel * \param y the row * \param x the column * \param img the mapcache_image * \returns a pointer to the pixel */ #define GET_IMG_PIXEL(img,x,y) (&((img).data[(y)*(img).stride + (x)*4])) /** * \brief initialize a new mapcache_image */ mapcache_image* mapcache_image_create(mapcache_context *ctx); mapcache_image* mapcache_image_create_with_data(mapcache_context *ctx, int width, int height); void mapcache_image_copy_resampled_nearest(mapcache_context *ctx, mapcache_image *src, mapcache_image *dst, double off_x, double off_y, double scale_x, double scale_y); void mapcache_image_copy_resampled_bilinear(mapcache_context *ctx, mapcache_image *src, mapcache_image *dst, double off_x, double off_y, double scale_x, double scale_y, int reflect_edges); /** * \brief merge two images * \param base the imae to merge onto * \param overlay the image to overlay onto * \param ctx the context * when finished, base will be modified and have overlay merged onto it */ void mapcache_image_merge(mapcache_context *ctx, mapcache_image *base, mapcache_image *overlay); void mapcache_image_copy_resampled(mapcache_context *ctx, mapcache_image *src, mapcache_image *dst, int srcX, int srcY, int srcW, int srcH, int dstX, int dstY, int dstW, int dstH); /** * \brief split the given metatile into tiles * \param mt the metatile to split * \param r the context */ void mapcache_image_metatile_split(mapcache_context *ctx, mapcache_metatile *mt); /** * \brief check if given image is composed of a unique color * \param image the mapcache_image to process * \returns MAPCACHE_TRUE if the image contains a single color * \returns MAPCACHE_FALSE if the image has more than one color */ int mapcache_image_blank_color(mapcache_image* image); /** * \brief check if image has some non opaque pixels */ int mapcache_image_has_alpha(mapcache_image *img, unsigned int cutoff); void mapcache_image_fill(mapcache_context *ctx, mapcache_image *image, const unsigned char *fill_color); /** @} */ /** \defgroup http HTTP Request handling*/ /** @{ */ void mapcache_http_do_request(mapcache_context *ctx, mapcache_http *req, mapcache_buffer *data, apr_table_t *headers, long *http_code); char* mapcache_http_build_url(mapcache_context *ctx, char *base, apr_table_t *params); MS_DLL_EXPORT apr_table_t *mapcache_http_parse_param_string(mapcache_context *ctx, char *args); /** @} */ /** \defgroup configuration Configuration*/ /** @{ */ typedef enum { MAPCACHE_MODE_NORMAL, MAPCACHE_MODE_MIRROR_COMBINED, MAPCACHE_MODE_MIRROR_SPLIT } mapcache_mode; typedef enum { MAPCACHE_LOCKER_DISK, MAPCACHE_LOCKER_MEMCACHE, MAPCACHE_LOCKER_FALLBACK } mapcache_lock_mode; typedef enum { MAPCACHE_LOCK_AQUIRED, MAPCACHE_LOCK_LOCKED, MAPCACHE_LOCK_NOENT } mapcache_lock_result; struct mapcache_locker{ mapcache_lock_result (*aquire_lock)(mapcache_context *ctx, mapcache_locker *self, char *resource, void **lock); mapcache_lock_result (*ping_lock)(mapcache_context *ctx, mapcache_locker *self, void *lock); void (*release_lock)(mapcache_context *ctx, mapcache_locker *self, void *lock); void (*parse_xml)(mapcache_context *ctx, mapcache_locker *self, ezxml_t node); mapcache_lock_mode type; double timeout; double retry_interval; /* time to wait before checking again on a lock, in seconds */ }; mapcache_locker* mapcache_locker_disk_create(mapcache_context *ctx); mapcache_locker* mapcache_locker_memcache_create(mapcache_context *ctx); mapcache_locker* mapcache_locker_fallback_create(mapcache_context *ctx); void mapcache_config_parse_locker(mapcache_context *ctx, ezxml_t node, mapcache_locker **locker); void mapcache_config_parse_locker_old(mapcache_context *ctx, ezxml_t doc, mapcache_cfg *config); /** * a configuration that will be served */ struct mapcache_cfg { /** * a list of services that will be responded to */ mapcache_service * services[MAPCACHE_SERVICES_COUNT]; /** * hashtable containing configured mapcache_source%s */ apr_hash_t *sources; /** * hashtable containing configured mapcache_cache%s */ apr_hash_t *caches; /** * hashtable containing configured mapcache_tileset%s */ apr_hash_t *tilesets; /** * hashtable containing configured mapcache_image_format%s */ apr_hash_t *image_formats; /** * hashtable containing (pre)defined grids */ apr_hash_t *grids; /** * the format to use for some miscelaneaous operations: * - creating an empty image * - creating an error image * - as a fallback when merging multiple tiles */ mapcache_image_format *default_image_format; /** * how should error messages be reported to the user */ mapcache_error_reporting reporting; /** * encoded empty (tranpsarent) image that will be returned to clients if cofigured * to return blank images upon error */ mapcache_buffer *empty_image; apr_table_t *metadata; mapcache_locker *locker; int threaded_fetching; /* for fastcgi only */ int autoreload; /* should the modification time of the config file be recorded and the file be reparsed if it is modified. */ mapcache_log_level loglevel; /* logging verbosity. Ignored for the apache module as in that case the apache LogLevel directive is used. */ mapcache_mode mode; /* return 404 on potentially blocking operations (proxying, source getmaps, locks on metatile waiting, ... Used for nginx module */ int non_blocking; }; /** * * @param filename * @param config * @param pool * @return */ MS_DLL_EXPORT void mapcache_configuration_parse(mapcache_context *ctx, const char *filename, mapcache_cfg *config, int cgi); MS_DLL_EXPORT void mapcache_configuration_post_config(mapcache_context *ctx, mapcache_cfg *config); void mapcache_configuration_parse_xml(mapcache_context *ctx, const char *filename, mapcache_cfg *config); MS_DLL_EXPORT mapcache_cfg* mapcache_configuration_create(apr_pool_t *pool); mapcache_source* mapcache_configuration_get_source(mapcache_cfg *config, const char *key); MS_DLL_EXPORT mapcache_cache* mapcache_configuration_get_cache(mapcache_cfg *config, const char *key); mapcache_grid *mapcache_configuration_get_grid(mapcache_cfg *config, const char *key); MS_DLL_EXPORT mapcache_tileset* mapcache_configuration_get_tileset(mapcache_cfg *config, const char *key); mapcache_image_format *mapcache_configuration_get_image_format(mapcache_cfg *config, const char *key); void mapcache_configuration_add_image_format(mapcache_cfg *config, mapcache_image_format *format, const char * key); void mapcache_configuration_add_source(mapcache_cfg *config, mapcache_source *source, const char * key); void mapcache_configuration_add_grid(mapcache_cfg *config, mapcache_grid *grid, const char * key); void mapcache_configuration_add_tileset(mapcache_cfg *config, mapcache_tileset *tileset, const char * key); void mapcache_configuration_add_cache(mapcache_cfg *config, mapcache_cache *cache, const char * key); /** @} */ /** * \memberof mapcache_source */ void mapcache_source_init(mapcache_context *ctx, mapcache_source *source); /** * \memberof mapcache_source */ void mapcache_source_render_map(mapcache_context *ctx, mapcache_source *source, mapcache_map *map); void mapcache_source_query_info(mapcache_context *ctx, mapcache_source *source, mapcache_feature_info *fi); /** * \memberof mapcache_source_gdal */ mapcache_source* mapcache_source_gdal_create(mapcache_context *ctx); /** * \memberof mapcache_source_fallback */ mapcache_source* mapcache_source_fallback_create(mapcache_context *ctx); /** * \memberof mapcache_source_wms */ mapcache_source* mapcache_source_wms_create(mapcache_context *ctx); /** * \memberof mapcache_source_wms */ mapcache_source* mapcache_source_mapserver_create(mapcache_context *ctx); mapcache_source* mapcache_source_dummy_create(mapcache_context *ctx); /** * \memberof mapcache_cache_disk */ mapcache_cache* mapcache_cache_disk_create(mapcache_context *ctx); /** * \memberof mapcache_cache_rest */ mapcache_cache* mapcache_cache_rest_create(mapcache_context *ctx); mapcache_cache* mapcache_cache_s3_create(mapcache_context *ctx); mapcache_cache* mapcache_cache_azure_create(mapcache_context *ctx); mapcache_cache* mapcache_cache_google_create(mapcache_context *ctx); /** * \memberof mapcache_cache_tiff */ mapcache_cache* mapcache_cache_tiff_create(mapcache_context *ctx); mapcache_cache* mapcache_cache_composite_create(mapcache_context *ctx); mapcache_cache* mapcache_cache_fallback_create(mapcache_context *ctx); mapcache_cache* mapcache_cache_multitier_create(mapcache_context *ctx); /** \defgroup tileset Tilesets*/ /** @{ */ /** * \brief Tile * \sa mapcache_metatile * \sa mapcache_tileset::metasize_x mapcache_tileset::metasize_x mapcache_tileset::metabuffer */ struct mapcache_tile { mapcache_tileset *tileset; /**< the mapcache_tileset that corresponds to the tile*/ mapcache_grid_link *grid_link; int x; /**< tile x index */ int y; /**< tile y index */ int z; /**< tile z index (zoom level) */ /** * encoded image data for the tile. * \sa mapcache_cache::tile_get() * \sa mapcache_source::render_map() * \sa mapcache_image_format */ mapcache_buffer *encoded_data; char *redirect; int allow_redirect; mapcache_image *raw_image; apr_time_t mtime; /**< last modification time */ int expires; /**< time in seconds after which the tile should be rechecked for validity */ apr_array_header_t *dimensions; /** * flag stating the tile is empty (i.e. fully transparent). * if set, this indicates that there was no error per se, but that there was * no way to get data back from the cache for this tile. This will happen for * a tileset with no configured, for tiles that have not been preseeded. * Tile assembling functions should look for this flag and ignore such a tile when * compositing image data */ int nodata; }; /** * \brief MetaTile * \extends mapcache_tile */ struct mapcache_metatile { mapcache_map map; int x,y,z; int metasize_x, metasize_y; int ntiles; /**< the number of mapcache_metatile::tiles contained in this metatile */ mapcache_tile *tiles; /**< the list of mapcache_tile s contained in this metatile */ }; struct mapcache_grid_level { double resolution; unsigned int maxx, maxy; }; /** * \brief mapcache_grid_origin * determines at which extent extrema the tiles will originate from. Only * BOTTOM_LEFT and TOP_LEFT are implemented */ typedef enum { MAPCACHE_GRID_ORIGIN_BOTTOM_LEFT, MAPCACHE_GRID_ORIGIN_TOP_LEFT, MAPCACHE_GRID_ORIGIN_BOTTOM_RIGHT, MAPCACHE_GRID_ORIGIN_TOP_RIGHT } mapcache_grid_origin; struct mapcache_grid { char *name; int nlevels; char *srs; apr_array_header_t *srs_aliases; mapcache_extent extent; mapcache_unit unit; int tile_sx, tile_sy; /**= alpha_cutoff will be considered fully opaque */ }; mapcache_buffer* mapcache_empty_png_decode(mapcache_context *ctx, int width, int height, const unsigned char *hex_color, int *is_empty); mapcache_image_format* mapcache_imageio_create_mixed_format(apr_pool_t *pool, char *name, mapcache_image_format *transparent, mapcache_image_format *opaque, unsigned int alpha_cutoff); /**\class mapcache_image_format_png_q * \brief Quantized PNG format * \extends mapcache_image_format_png */ struct mapcache_image_format_png_q { mapcache_image_format_png format; int ncolors; /**< number of colors used in quantization, 2-256 */ }; /** * @param r * @param buffer * @return */ mapcache_image* _mapcache_imageio_png_decode(mapcache_context *ctx, mapcache_buffer *buffer); void mapcache_image_create_empty(mapcache_context *ctx, mapcache_cfg *cfg); /** * @param r * @param buffer * @return */ void _mapcache_imageio_png_decode_to_image(mapcache_context *ctx, mapcache_buffer *buffer, mapcache_image *image); /** * \brief create a format capable of creating RGBA png * \memberof mapcache_image_format_png * @param pool * @param name * @param compression the ZLIB compression to apply * @return */ mapcache_image_format* mapcache_imageio_create_png_format(apr_pool_t *pool, char *name, mapcache_compression_type compression); /** * \brief create a format capable of creating quantized png * \memberof mapcache_image_format_png_q * @param pool * @param name * @param compression the ZLIB compression to apply * @param ncolors the number of colors to quantize with * @return */ mapcache_image_format* mapcache_imageio_create_png_q_format(apr_pool_t *pool, char *name, mapcache_compression_type compression, int ncolors); /** @} */ /**\defgroup imageio_jpg JPEG Image IO * \ingroup imageio */ /** @{ */ /**\class mapcache_image_format_jpeg * \brief JPEG image format * \extends mapcache_image_format */ struct mapcache_image_format_jpeg { mapcache_image_format format; int quality; /**< JPEG quality, 1-100 */ mapcache_photometric photometric; mapcache_optimization optimize; }; mapcache_image_format* mapcache_imageio_create_jpeg_format(apr_pool_t *pool, char *name, int quality, mapcache_photometric photometric, mapcache_optimization optimize); /** * @param r * @param buffer * @return */ mapcache_image* _mapcache_imageio_jpeg_decode(mapcache_context *ctx, mapcache_buffer *buffer); /** * @param r * @param buffer * @return */ void _mapcache_imageio_jpeg_decode_to_image(mapcache_context *ctx, mapcache_buffer *buffer, mapcache_image *image); /** @} */ /** * \brief lookup the first few bytes of a buffer to check for a known image format */ mapcache_image_format_type mapcache_imageio_header_sniff(mapcache_context *ctx, mapcache_buffer *buffer); /** * \brief checks if the given buffer is a recognized image format */ int mapcache_imageio_is_valid_format(mapcache_context *ctx, mapcache_buffer *buffer); /** * decodes given buffer */ mapcache_image* mapcache_imageio_decode(mapcache_context *ctx, mapcache_buffer *buffer); /** * decodes given buffer to an allocated image */ void mapcache_imageio_decode_to_image(mapcache_context *ctx, mapcache_buffer *buffer, mapcache_image *image); /** @} */ typedef struct { double start; double end; double resolution; } mapcache_interval; struct mapcache_requested_dimension { mapcache_dimension *dimension; char *requested_value; char *cached_value; }; void mapcache_tile_set_cached_dimension(mapcache_context *ctx, mapcache_tile *tile, const char *name, const char *value); void mapcache_map_set_cached_dimension(mapcache_context *ctx, mapcache_map *map, const char *name, const char *value); void mapcache_tile_set_requested_dimension(mapcache_context *ctx, mapcache_tile *tile, const char *name, const char *value); void mapcache_map_set_requested_dimension(mapcache_context *ctx, mapcache_map *map, const char *name, const char *value); void mapcache_set_requested_dimension(mapcache_context *ctx, apr_array_header_t *dimensions, const char *name, const char *value); void mapcache_set_cached_dimension(mapcache_context *ctx, apr_array_header_t *dimensions, const char *name, const char *value); MS_DLL_EXPORT apr_array_header_t *mapcache_requested_dimensions_clone(apr_pool_t *pool, apr_array_header_t *src); struct mapcache_dimension { mapcache_dimension_type type; char *name; char *unit; apr_table_t *metadata; char *default_value; /** * \brief return the list of dimension values that match the requested entry */ apr_array_header_t* (*get_entries_for_value)(mapcache_context *ctx, mapcache_dimension *dimension, const char *value, mapcache_tileset *tileset, mapcache_extent *extent, mapcache_grid *grid); /** * \brief return all possible values */ apr_array_header_t* (*get_all_entries)(mapcache_context *ctx, mapcache_dimension *dimension, mapcache_tileset *tileset, mapcache_extent *extent, mapcache_grid *grid); /** * \brief return all possible values formatted in a way compatible with OGC capabilities element */ apr_array_header_t* (*get_all_ogc_formatted_entries)(mapcache_context *ctx, mapcache_dimension *dimension, mapcache_tileset *tileset, mapcache_extent *extent, mapcache_grid *grid); /** * \brief parse the value given in the configuration */ void (*configuration_parse_xml)(mapcache_context *context, mapcache_dimension *dim, ezxml_t node); }; mapcache_dimension* mapcache_dimension_values_create(mapcache_context *ctx, apr_pool_t *pool); mapcache_dimension* mapcache_dimension_sqlite_create(mapcache_context *ctx, apr_pool_t *pool); mapcache_dimension* mapcache_dimension_regex_create(mapcache_context *ctx, apr_pool_t *pool); mapcache_dimension* mapcache_dimension_time_create(mapcache_context *ctx, apr_pool_t *pool); int mapcache_is_axis_inverted(const char *srs); typedef struct mapcache_pooled_connection_container mapcache_pooled_connection_container; typedef struct mapcache_pooled_connection mapcache_pooled_connection; typedef struct mapcache_pooled_connection_private_data mapcache_pooled_connection_private_data; struct mapcache_pooled_connection { mapcache_pooled_connection_private_data *private; void *connection; }; typedef void (*mapcache_connection_constructor)(mapcache_context *ctx, void **connection, void *params); typedef void (*mapcache_connection_destructor)(void *connection); MS_DLL_EXPORT apr_status_t mapcache_connection_pool_create(mapcache_connection_pool **cp, apr_pool_t *server_pool); mapcache_pooled_connection* mapcache_connection_pool_get_connection(mapcache_context *ctx, char *key, mapcache_connection_constructor constructor, mapcache_connection_destructor destructor, void *params); void mapcache_connection_pool_invalidate_connection(mapcache_context *ctx, mapcache_pooled_connection *connection); void mapcache_connection_pool_release_connection(mapcache_context *ctx, mapcache_pooled_connection *connection); #endif /* MAPCACHE_H_ */ /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/include/mapcache_services.h000066400000000000000000000113341316353564100213070ustar00rootroot00000000000000/****************************************************************************** * * Project: MapCache * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2016 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ /*! \file mapcache_services.h \brief structure declarations for supported services */ #ifndef MAPCACHE_SERVICES_H_ #define MAPCACHE_SERVICES_H_ #include "mapcache.h" /** \addtogroup services */ /** @{ */ typedef struct mapcache_request_get_capabilities_wmts mapcache_request_get_capabilities_wmts; typedef struct mapcache_service_wmts mapcache_service_wmts; struct mapcache_request_get_capabilities_wmts { mapcache_request_get_capabilities request; }; /**\class mapcache_service_wmts * \brief a WMTS service * \implements mapcache_service */ struct mapcache_service_wmts { mapcache_service service; }; typedef struct mapcache_service_wms mapcache_service_wms; typedef struct mapcache_request_get_capabilities_wms mapcache_request_get_capabilities_wms; struct mapcache_request_get_capabilities_wms { mapcache_request_get_capabilities request; }; /**\class mapcache_service_wms * \brief an OGC WMS service * \implements mapcache_service */ struct mapcache_service_wms { mapcache_service service; int maxsize; apr_array_header_t *forwarding_rules; mapcache_getmap_strategy getmap_strategy; mapcache_resample_mode resample_mode; mapcache_image_format *getmap_format; int allow_format_override; /* can the client specify which image format should be returned */ }; typedef struct mapcache_service_ve mapcache_service_ve; /**\class mapcache_service_ve * \brief a virtualearth service * \implements mapcache_service */ struct mapcache_service_ve { mapcache_service service; }; typedef struct mapcache_service_gmaps mapcache_service_gmaps; typedef struct mapcache_service_tms mapcache_service_tms; typedef struct mapcache_request_get_capabilities_tms mapcache_request_get_capabilities_tms; /**\class mapcache_service_tms * \brief a TMS service * \implements mapcache_service */ struct mapcache_service_tms { mapcache_service service; int reverse_y; }; struct mapcache_request_get_capabilities_tms { mapcache_request_get_capabilities request; mapcache_tileset *tileset; mapcache_grid_link *grid_link; char *version; }; typedef struct mapcache_service_mapguide mapcache_service_mapguide; struct mapcache_service_mapguide { mapcache_service service; int rows_per_folder; int cols_per_folder; }; typedef struct mapcache_service_kml mapcache_service_kml; typedef struct mapcache_request_get_capabilities_kml mapcache_request_get_capabilities_kml; struct mapcache_request_get_capabilities_kml { mapcache_request_get_capabilities request; mapcache_tile *tile; mapcache_tileset *tileset; mapcache_grid_link *grid; }; /**\class mapcache_service_kml * \brief a KML superoverlay service * \implements mapcache_service */ struct mapcache_service_kml { mapcache_service service; }; typedef struct mapcache_request_get_capabilities_demo mapcache_request_get_capabilities_demo; typedef struct mapcache_service_demo mapcache_service_demo; /** * the capabilities request for a specific service, to be able to create * demo pages specific to a given service */ struct mapcache_request_get_capabilities_demo { mapcache_request_get_capabilities request; mapcache_service *service; }; /**\class mapcache_service_demo * \brief a demo service * \implements mapcache_service */ struct mapcache_service_demo { mapcache_service service; }; #endif /*MAPCACHE_SERVICES_H*/ mapcache-rel-1-6-1/include/util.h000066400000000000000000000066021316353564100166220ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include #include #ifndef UTIL_H_ #define UTIL_H_ #define MAPCACHE_MAX(a,b) (((a)>(b))?(a):(b)) #define MAPCACHE_MIN(a,b) (((a)<(b))?(a):(b)) #ifndef APR_ARRAY_IDX #define APR_ARRAY_IDX(ary,i,type) (((type *)(ary)->elts)[i]) #endif #ifndef APR_ARRAY_PUSH #define APR_ARRAY_PUSH(ary,type) (*((type *)apr_array_push(ary))) #endif #if APR_MAJOR_VERSION < 1 || (APR_MAJOR_VERSION < 2 && APR_MINOR_VERSION < 3) /** * Create a new table whose contents are deep copied from the given * table. A deep copy operation copies all fields, and makes copies * of dynamically allocated memory pointed to by the fields. * @param p The pool to allocate the new table out of * @param t The table to clone * @return A deep copy of the table passed in */ APR_DECLARE(apr_table_t *) apr_table_clone(apr_pool_t *p, const apr_table_t *t); #endif #if APR_MAJOR_VERSION < 1 #ifndef APR_FOPEN_READ #define APR_FOPEN_READ APR_READ #endif #ifndef APR_FOPEN_BUFFERED #define APR_FOPEN_BUFFERED APR_BUFFERED #endif #ifndef APR_FOPEN_BINARY #define APR_FOPEN_BINARY APR_BINARY #endif #ifndef APR_FOPEN_CREATE #define APR_FOPEN_CREATE APR_CREATE #endif #ifndef APR_FOPEN_WRITE #define APR_FOPEN_WRITE APR_WRITE #endif #ifndef APR_FOPEN_SHARELOCK #define APR_FOPEN_SHARELOCK APR_SHARELOCK #endif #endif #if defined(_WIN32) && !defined(__CYGWIN__) # define MS_DLL_EXPORT __declspec(dllexport) #else #define MS_DLL_EXPORT #endif #if defined(_WIN32) struct mctimeval { long tv_sec; /* seconds */ long tv_usec; /* and microseconds */ }; MS_DLL_EXPORT void mapcache_gettimeofday(struct mctimeval *t, void *__not_used_here__); MS_DLL_EXPORT char * strptime (const char *buf, const char *format, struct tm *timeptr); #else # include /* for gettimeofday() */ # define mctimeval timeval # define mapcache_gettimeofday(t,u) gettimeofday(t,u) #endif #endif /* UTIL_H_ */ /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/000077500000000000000000000000001316353564100146135ustar00rootroot00000000000000mapcache-rel-1-6-1/lib/axisorder.c000066400000000000000000000544031316353564100167650ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Axis lookup table * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" static struct axisOrientationEpsgCodes_s { int code; } axisOrientationEpsgCodes[] = { { 4326 }, { 4258 }, { 31466 }, { 31467 }, { 31468 }, { 31469 }, { 2166 }, { 2167 }, { 2168 }, { 2036 }, { 2044 }, { 2045 }, { 2065 }, { 2081 }, { 2082 }, { 2083 }, { 2085 }, { 2086 }, { 2091 }, { 2092 }, { 2093 }, { 2096 }, { 2097 }, { 2098 }, { 2105 }, { 2106 }, { 2107 }, { 2108 }, { 2109 }, { 2110 }, { 2111 }, { 2112 }, { 2113 }, { 2114 }, { 2115 }, { 2116 }, { 2117 }, { 2118 }, { 2119 }, { 2120 }, { 2121 }, { 2122 }, { 2123 }, { 2124 }, { 2125 }, { 2126 }, { 2127 }, { 2128 }, { 2129 }, { 2130 }, { 2131 }, { 2132 }, { 2169 }, { 2170 }, { 2171 }, { 2172 }, { 2173 }, { 2174 }, { 2175 }, { 2176 }, { 2177 }, { 2178 }, { 2179 }, { 2180 }, { 2193 }, { 2199 }, { 2200 }, { 2206 }, { 2207 }, { 2208 }, { 2209 }, { 2210 }, { 2211 }, { 2212 }, { 2319 }, { 2320 }, { 2321 }, { 2322 }, { 2323 }, { 2324 }, { 2325 }, { 2326 }, { 2327 }, { 2328 }, { 2329 }, { 2330 }, { 2331 }, { 2332 }, { 2333 }, { 2334 }, { 2335 }, { 2336 }, { 2337 }, { 2338 }, { 2339 }, { 2340 }, { 2341 }, { 2342 }, { 2343 }, { 2344 }, { 2345 }, { 2346 }, { 2347 }, { 2348 }, { 2349 }, { 2350 }, { 2351 }, { 2352 }, { 2353 }, { 2354 }, { 2355 }, { 2356 }, { 2357 }, { 2358 }, { 2359 }, { 2360 }, { 2361 }, { 2362 }, { 2363 }, { 2364 }, { 2365 }, { 2366 }, { 2367 }, { 2368 }, { 2369 }, { 2370 }, { 2371 }, { 2372 }, { 2373 }, { 2374 }, { 2375 }, { 2376 }, { 2377 }, { 2378 }, { 2379 }, { 2380 }, { 2381 }, { 2382 }, { 2383 }, { 2384 }, { 2385 }, { 2386 }, { 2387 }, { 2388 }, { 2389 }, { 2390 }, { 2391 }, { 2392 }, { 2393 }, { 2394 }, { 2395 }, { 2396 }, { 2397 }, { 2398 }, { 2399 }, { 2400 }, { 2401 }, { 2402 }, { 2403 }, { 2404 }, { 2405 }, { 2406 }, { 2407 }, { 2408 }, { 2409 }, { 2410 }, { 2411 }, { 2412 }, { 2413 }, { 2414 }, { 2415 }, { 2416 }, { 2417 }, { 2418 }, { 2419 }, { 2420 }, { 2421 }, { 2422 }, { 2423 }, { 2424 }, { 2425 }, { 2426 }, { 2427 }, { 2428 }, { 2429 }, { 2430 }, { 2431 }, { 2432 }, { 2433 }, { 2434 }, { 2435 }, { 2436 }, { 2437 }, { 2438 }, { 2439 }, { 2440 }, { 2441 }, { 2442 }, { 2443 }, { 2444 }, { 2445 }, { 2446 }, { 2447 }, { 2448 }, { 2449 }, { 2450 }, { 2451 }, { 2452 }, { 2453 }, { 2454 }, { 2455 }, { 2456 }, { 2457 }, { 2458 }, { 2459 }, { 2460 }, { 2461 }, { 2462 }, { 2463 }, { 2464 }, { 2465 }, { 2466 }, { 2467 }, { 2468 }, { 2469 }, { 2470 }, { 2471 }, { 2472 }, { 2473 }, { 2474 }, { 2475 }, { 2476 }, { 2477 }, { 2478 }, { 2479 }, { 2480 }, { 2481 }, { 2482 }, { 2483 }, { 2484 }, { 2485 }, { 2486 }, { 2487 }, { 2488 }, { 2489 }, { 2490 }, { 2491 }, { 2492 }, { 2493 }, { 2494 }, { 2495 }, { 2496 }, { 2497 }, { 2498 }, { 2499 }, { 2500 }, { 2501 }, { 2502 }, { 2503 }, { 2504 }, { 2505 }, { 2506 }, { 2507 }, { 2508 }, { 2509 }, { 2510 }, { 2511 }, { 2512 }, { 2513 }, { 2514 }, { 2515 }, { 2516 }, { 2517 }, { 2518 }, { 2519 }, { 2520 }, { 2521 }, { 2522 }, { 2523 }, { 2524 }, { 2525 }, { 2526 }, { 2527 }, { 2528 }, { 2529 }, { 2530 }, { 2531 }, { 2532 }, { 2533 }, { 2534 }, { 2535 }, { 2536 }, { 2537 }, { 2538 }, { 2539 }, { 2540 }, { 2541 }, { 2542 }, { 2543 }, { 2544 }, { 2545 }, { 2546 }, { 2547 }, { 2548 }, { 2549 }, { 2551 }, { 2552 }, { 2553 }, { 2554 }, { 2555 }, { 2556 }, { 2557 }, { 2558 }, { 2559 }, { 2560 }, { 2561 }, { 2562 }, { 2563 }, { 2564 }, { 2565 }, { 2566 }, { 2567 }, { 2568 }, { 2569 }, { 2570 }, { 2571 }, { 2572 }, { 2573 }, { 2574 }, { 2575 }, { 2576 }, { 2577 }, { 2578 }, { 2579 }, { 2580 }, { 2581 }, { 2582 }, { 2583 }, { 2584 }, { 2585 }, { 2586 }, { 2587 }, { 2588 }, { 2589 }, { 2590 }, { 2591 }, { 2592 }, { 2593 }, { 2594 }, { 2595 }, { 2596 }, { 2597 }, { 2598 }, { 2599 }, { 2600 }, { 2601 }, { 2602 }, { 2603 }, { 2604 }, { 2605 }, { 2606 }, { 2607 }, { 2608 }, { 2609 }, { 2610 }, { 2611 }, { 2612 }, { 2613 }, { 2614 }, { 2615 }, { 2616 }, { 2617 }, { 2618 }, { 2619 }, { 2620 }, { 2621 }, { 2622 }, { 2623 }, { 2624 }, { 2625 }, { 2626 }, { 2627 }, { 2628 }, { 2629 }, { 2630 }, { 2631 }, { 2632 }, { 2633 }, { 2634 }, { 2635 }, { 2636 }, { 2637 }, { 2638 }, { 2639 }, { 2640 }, { 2641 }, { 2642 }, { 2643 }, { 2644 }, { 2645 }, { 2646 }, { 2647 }, { 2648 }, { 2649 }, { 2650 }, { 2651 }, { 2652 }, { 2653 }, { 2654 }, { 2655 }, { 2656 }, { 2657 }, { 2658 }, { 2659 }, { 2660 }, { 2661 }, { 2662 }, { 2663 }, { 2664 }, { 2665 }, { 2666 }, { 2667 }, { 2668 }, { 2669 }, { 2670 }, { 2671 }, { 2672 }, { 2673 }, { 2674 }, { 2675 }, { 2676 }, { 2677 }, { 2678 }, { 2679 }, { 2680 }, { 2681 }, { 2682 }, { 2683 }, { 2684 }, { 2685 }, { 2686 }, { 2687 }, { 2688 }, { 2689 }, { 2690 }, { 2691 }, { 2692 }, { 2693 }, { 2694 }, { 2695 }, { 2696 }, { 2697 }, { 2698 }, { 2699 }, { 2700 }, { 2701 }, { 2702 }, { 2703 }, { 2704 }, { 2705 }, { 2706 }, { 2707 }, { 2708 }, { 2709 }, { 2710 }, { 2711 }, { 2712 }, { 2713 }, { 2714 }, { 2715 }, { 2716 }, { 2717 }, { 2718 }, { 2719 }, { 2720 }, { 2721 }, { 2722 }, { 2723 }, { 2724 }, { 2725 }, { 2726 }, { 2727 }, { 2728 }, { 2729 }, { 2730 }, { 2731 }, { 2732 }, { 2733 }, { 2734 }, { 2735 }, { 2738 }, { 2739 }, { 2740 }, { 2741 }, { 2742 }, { 2743 }, { 2744 }, { 2745 }, { 2746 }, { 2747 }, { 2748 }, { 2749 }, { 2750 }, { 2751 }, { 2752 }, { 2753 }, { 2754 }, { 2755 }, { 2756 }, { 2757 }, { 2758 }, { 2935 }, { 2936 }, { 2937 }, { 2938 }, { 2939 }, { 2940 }, { 2941 }, { 2953 }, { 2963 }, { 3006 }, { 3007 }, { 3008 }, { 3009 }, { 3010 }, { 3011 }, { 3012 }, { 3013 }, { 3014 }, { 3015 }, { 3016 }, { 3017 }, { 3018 }, { 3019 }, { 3020 }, { 3021 }, { 3022 }, { 3023 }, { 3024 }, { 3025 }, { 3026 }, { 3027 }, { 3028 }, { 3029 }, { 3030 }, { 3034 }, { 3035 }, { 3038 }, { 3039 }, { 3040 }, { 3041 }, { 3042 }, { 3043 }, { 3044 }, { 3045 }, { 3046 }, { 3047 }, { 3048 }, { 3049 }, { 3050 }, { 3051 }, { 3058 }, { 3059 }, { 3068 }, { 3114 }, { 3115 }, { 3116 }, { 3117 }, { 3118 }, { 3120 }, { 3126 }, { 3127 }, { 3128 }, { 3129 }, { 3130 }, { 3131 }, { 3132 }, { 3133 }, { 3134 }, { 3135 }, { 3136 }, { 3137 }, { 3138 }, { 3139 }, { 3140 }, { 3146 }, { 3147 }, { 3150 }, { 3151 }, { 3152 }, { 3300 }, { 3301 }, { 3328 }, { 3329 }, { 3330 }, { 3331 }, { 3332 }, { 3333 }, { 3334 }, { 3335 }, { 3346 }, { 3350 }, { 3351 }, { 3352 }, { 3366 }, { 3386 }, { 3387 }, { 3388 }, { 3389 }, { 3390 }, { 3396 }, { 3397 }, { 3398 }, { 3399 }, { 3407 }, { 3414 }, { 3416 }, { 3764 }, { 3788 }, { 3789 }, { 3790 }, { 3791 }, { 3793 }, { 3795 }, { 3796 }, { 3819 }, { 3821 }, { 3823 }, { 3824 }, { 3833 }, { 3834 }, { 3835 }, { 3836 }, { 3837 }, { 3838 }, { 3839 }, { 3840 }, { 3841 }, { 3842 }, { 3843 }, { 3844 }, { 3845 }, { 3846 }, { 3847 }, { 3848 }, { 3849 }, { 3850 }, { 3851 }, { 3852 }, { 3854 }, { 3873 }, { 3874 }, { 3875 }, { 3876 }, { 3877 }, { 3878 }, { 3879 }, { 3880 }, { 3881 }, { 3882 }, { 3883 }, { 3884 }, { 3885 }, { 3888 }, { 3889 }, { 3906 }, { 3907 }, { 3908 }, { 3909 }, { 3910 }, { 3911 }, { 4001 }, { 4002 }, { 4003 }, { 4004 }, { 4005 }, { 4006 }, { 4007 }, { 4008 }, { 4009 }, { 4010 }, { 4011 }, { 4012 }, { 4013 }, { 4014 }, { 4015 }, { 4016 }, { 4017 }, { 4018 }, { 4019 }, { 4020 }, { 4021 }, { 4022 }, { 4023 }, { 4024 }, { 4025 }, { 4026 }, { 4027 }, { 4028 }, { 4029 }, { 4030 }, { 4031 }, { 4032 }, { 4033 }, { 4034 }, { 4035 }, { 4036 }, { 4037 }, { 4038 }, { 4040 }, { 4041 }, { 4042 }, { 4043 }, { 4044 }, { 4045 }, { 4046 }, { 4047 }, { 4052 }, { 4053 }, { 4054 }, { 4055 }, { 4074 }, { 4075 }, { 4080 }, { 4081 }, { 4120 }, { 4121 }, { 4122 }, { 4123 }, { 4124 }, { 4125 }, { 4126 }, { 4127 }, { 4128 }, { 4129 }, { 4130 }, { 4131 }, { 4132 }, { 4133 }, { 4134 }, { 4135 }, { 4136 }, { 4137 }, { 4138 }, { 4139 }, { 4140 }, { 4141 }, { 4142 }, { 4143 }, { 4144 }, { 4145 }, { 4146 }, { 4147 }, { 4148 }, { 4149 }, { 4150 }, { 4151 }, { 4152 }, { 4153 }, { 4154 }, { 4155 }, { 4156 }, { 4157 }, { 4158 }, { 4159 }, { 4160 }, { 4161 }, { 4162 }, { 4163 }, { 4164 }, { 4165 }, { 4166 }, { 4167 }, { 4168 }, { 4169 }, { 4170 }, { 4171 }, { 4172 }, { 4173 }, { 4174 }, { 4175 }, { 4176 }, { 4178 }, { 4179 }, { 4180 }, { 4181 }, { 4182 }, { 4183 }, { 4184 }, { 4185 }, { 4188 }, { 4189 }, { 4190 }, { 4191 }, { 4192 }, { 4193 }, { 4194 }, { 4195 }, { 4196 }, { 4197 }, { 4198 }, { 4199 }, { 4200 }, { 4201 }, { 4202 }, { 4203 }, { 4204 }, { 4205 }, { 4206 }, { 4207 }, { 4208 }, { 4209 }, { 4210 }, { 4211 }, { 4212 }, { 4213 }, { 4214 }, { 4215 }, { 4216 }, { 4218 }, { 4219 }, { 4220 }, { 4221 }, { 4222 }, { 4223 }, { 4224 }, { 4225 }, { 4226 }, { 4227 }, { 4228 }, { 4229 }, { 4230 }, { 4231 }, { 4232 }, { 4233 }, { 4234 }, { 4235 }, { 4236 }, { 4237 }, { 4238 }, { 4239 }, { 4240 }, { 4241 }, { 4242 }, { 4243 }, { 4244 }, { 4245 }, { 4246 }, { 4247 }, { 4248 }, { 4249 }, { 4250 }, { 4251 }, { 4252 }, { 4253 }, { 4254 }, { 4255 }, { 4256 }, { 4257 }, { 4259 }, { 4260 }, { 4261 }, { 4262 }, { 4263 }, { 4264 }, { 4265 }, { 4266 }, { 4267 }, { 4268 }, { 4269 }, { 4270 }, { 4271 }, { 4272 }, { 4273 }, { 4274 }, { 4275 }, { 4276 }, { 4277 }, { 4278 }, { 4279 }, { 4280 }, { 4281 }, { 4282 }, { 4283 }, { 4284 }, { 4285 }, { 4286 }, { 4287 }, { 4288 }, { 4289 }, { 4291 }, { 4292 }, { 4293 }, { 4294 }, { 4295 }, { 4296 }, { 4297 }, { 4298 }, { 4299 }, { 4300 }, { 4301 }, { 4302 }, { 4303 }, { 4304 }, { 4306 }, { 4307 }, { 4308 }, { 4309 }, { 4310 }, { 4311 }, { 4312 }, { 4313 }, { 4314 }, { 4315 }, { 4316 }, { 4317 }, { 4318 }, { 4319 }, { 4322 }, { 4324 }, { 4327 }, { 4329 }, { 4339 }, { 4341 }, { 4343 }, { 4345 }, { 4347 }, { 4349 }, { 4351 }, { 4353 }, { 4355 }, { 4357 }, { 4359 }, { 4361 }, { 4363 }, { 4365 }, { 4367 }, { 4369 }, { 4371 }, { 4373 }, { 4375 }, { 4377 }, { 4379 }, { 4381 }, { 4383 }, { 4386 }, { 4388 }, { 4417 }, { 4434 }, { 4463 }, { 4466 }, { 4469 }, { 4470 }, { 4472 }, { 4475 }, { 4480 }, { 4482 }, { 4483 }, { 4490 }, { 4491 }, { 4492 }, { 4493 }, { 4494 }, { 4495 }, { 4496 }, { 4497 }, { 4498 }, { 4499 }, { 4500 }, { 4501 }, { 4502 }, { 4503 }, { 4504 }, { 4505 }, { 4506 }, { 4507 }, { 4508 }, { 4509 }, { 4510 }, { 4511 }, { 4512 }, { 4513 }, { 4514 }, { 4515 }, { 4516 }, { 4517 }, { 4518 }, { 4519 }, { 4520 }, { 4521 }, { 4522 }, { 4523 }, { 4524 }, { 4525 }, { 4526 }, { 4527 }, { 4528 }, { 4529 }, { 4530 }, { 4531 }, { 4532 }, { 4533 }, { 4534 }, { 4535 }, { 4536 }, { 4537 }, { 4538 }, { 4539 }, { 4540 }, { 4541 }, { 4542 }, { 4543 }, { 4544 }, { 4545 }, { 4546 }, { 4547 }, { 4548 }, { 4549 }, { 4550 }, { 4551 }, { 4552 }, { 4553 }, { 4554 }, { 4555 }, { 4557 }, { 4558 }, { 4568 }, { 4569 }, { 4570 }, { 4571 }, { 4572 }, { 4573 }, { 4574 }, { 4575 }, { 4576 }, { 4577 }, { 4578 }, { 4579 }, { 4580 }, { 4581 }, { 4582 }, { 4583 }, { 4584 }, { 4585 }, { 4586 }, { 4587 }, { 4588 }, { 4589 }, { 4600 }, { 4601 }, { 4602 }, { 4603 }, { 4604 }, { 4605 }, { 4606 }, { 4607 }, { 4608 }, { 4609 }, { 4610 }, { 4611 }, { 4612 }, { 4613 }, { 4614 }, { 4615 }, { 4616 }, { 4617 }, { 4618 }, { 4619 }, { 4620 }, { 4621 }, { 4622 }, { 4623 }, { 4624 }, { 4625 }, { 4626 }, { 4627 }, { 4628 }, { 4629 }, { 4630 }, { 4631 }, { 4632 }, { 4633 }, { 4634 }, { 4635 }, { 4636 }, { 4637 }, { 4638 }, { 4639 }, { 4640 }, { 4641 }, { 4642 }, { 4643 }, { 4644 }, { 4645 }, { 4646 }, { 4652 }, { 4653 }, { 4654 }, { 4655 }, { 4656 }, { 4657 }, { 4658 }, { 4659 }, { 4660 }, { 4661 }, { 4662 }, { 4663 }, { 4664 }, { 4665 }, { 4666 }, { 4667 }, { 4668 }, { 4669 }, { 4670 }, { 4671 }, { 4672 }, { 4673 }, { 4674 }, { 4675 }, { 4676 }, { 4677 }, { 4678 }, { 4679 }, { 4680 }, { 4681 }, { 4682 }, { 4683 }, { 4684 }, { 4685 }, { 4686 }, { 4687 }, { 4688 }, { 4689 }, { 4690 }, { 4691 }, { 4692 }, { 4693 }, { 4694 }, { 4695 }, { 4696 }, { 4697 }, { 4698 }, { 4699 }, { 4700 }, { 4701 }, { 4702 }, { 4703 }, { 4704 }, { 4705 }, { 4706 }, { 4707 }, { 4708 }, { 4709 }, { 4710 }, { 4711 }, { 4712 }, { 4713 }, { 4714 }, { 4715 }, { 4716 }, { 4717 }, { 4718 }, { 4719 }, { 4720 }, { 4721 }, { 4722 }, { 4723 }, { 4724 }, { 4725 }, { 4726 }, { 4727 }, { 4728 }, { 4729 }, { 4730 }, { 4731 }, { 4732 }, { 4733 }, { 4734 }, { 4735 }, { 4736 }, { 4737 }, { 4738 }, { 4739 }, { 4740 }, { 4741 }, { 4742 }, { 4743 }, { 4744 }, { 4745 }, { 4746 }, { 4747 }, { 4748 }, { 4749 }, { 4750 }, { 4751 }, { 4752 }, { 4753 }, { 4754 }, { 4755 }, { 4756 }, { 4757 }, { 4758 }, { 4759 }, { 4760 }, { 4761 }, { 4762 }, { 4763 }, { 4764 }, { 4765 }, { 4766 }, { 4767 }, { 4768 }, { 4769 }, { 4770 }, { 4771 }, { 4772 }, { 4773 }, { 4774 }, { 4775 }, { 4776 }, { 4777 }, { 4778 }, { 4779 }, { 4780 }, { 4781 }, { 4782 }, { 4783 }, { 4784 }, { 4785 }, { 4786 }, { 4787 }, { 4788 }, { 4789 }, { 4790 }, { 4791 }, { 4792 }, { 4793 }, { 4794 }, { 4795 }, { 4796 }, { 4797 }, { 4798 }, { 4799 }, { 4800 }, { 4801 }, { 4802 }, { 4803 }, { 4804 }, { 4805 }, { 4806 }, { 4807 }, { 4808 }, { 4809 }, { 4810 }, { 4811 }, { 4812 }, { 4813 }, { 4814 }, { 4815 }, { 4816 }, { 4817 }, { 4818 }, { 4819 }, { 4820 }, { 4821 }, { 4822 }, { 4823 }, { 4824 }, { 4839 }, { 4855 }, { 4856 }, { 4857 }, { 4858 }, { 4859 }, { 4860 }, { 4861 }, { 4862 }, { 4863 }, { 4864 }, { 4865 }, { 4866 }, { 4867 }, { 4868 }, { 4869 }, { 4870 }, { 4871 }, { 4872 }, { 4873 }, { 4874 }, { 4875 }, { 4876 }, { 4877 }, { 4878 }, { 4879 }, { 4880 }, { 4883 }, { 4885 }, { 4887 }, { 4889 }, { 4891 }, { 4893 }, { 4895 }, { 4898 }, { 4900 }, { 4901 }, { 4902 }, { 4903 }, { 4904 }, { 4907 }, { 4909 }, { 4921 }, { 4923 }, { 4925 }, { 4927 }, { 4929 }, { 4931 }, { 4933 }, { 4935 }, { 4937 }, { 4939 }, { 4941 }, { 4943 }, { 4945 }, { 4947 }, { 4949 }, { 4951 }, { 4953 }, { 4955 }, { 4957 }, { 4959 }, { 4961 }, { 4963 }, { 4965 }, { 4967 }, { 4969 }, { 4971 }, { 4973 }, { 4975 }, { 4977 }, { 4979 }, { 4981 }, { 4983 }, { 4985 }, { 4987 }, { 4989 }, { 4991 }, { 4993 }, { 4995 }, { 4997 }, { 4999 }, { 5012 }, { 5013 }, { 5017 }, { 5048 }, { 5105 }, { 5106 }, { 5107 }, { 5108 }, { 5109 }, { 5110 }, { 5111 }, { 5112 }, { 5113 }, { 5114 }, { 5115 }, { 5116 }, { 5117 }, { 5118 }, { 5119 }, { 5120 }, { 5121 }, { 5122 }, { 5123 }, { 5124 }, { 5125 }, { 5126 }, { 5127 }, { 5128 }, { 5129 }, { 5130 }, { 5132 }, { 5167 }, { 5168 }, { 5169 }, { 5170 }, { 5171 }, { 5172 }, { 5173 }, { 5174 }, { 5175 }, { 5176 }, { 5177 }, { 5178 }, { 5179 }, { 5180 }, { 5181 }, { 5182 }, { 5183 }, { 5184 }, { 5185 }, { 5186 }, { 5187 }, { 5188 }, { 5224 }, { 5228 }, { 5229 }, { 5233 }, { 5245 }, { 5246 }, { 5251 }, { 5252 }, { 5253 }, { 5254 }, { 5255 }, { 5256 }, { 5257 }, { 5258 }, { 5259 }, { 5263 }, { 5264 }, { 5269 }, { 5270 }, { 5271 }, { 5272 }, { 5273 }, { 5274 }, { 5275 }, { 5801 }, { 5802 }, { 5803 }, { 5804 }, { 5808 }, { 5809 }, { 5810 }, { 5811 }, { 5812 }, { 5813 }, { 5814 }, { 5815 }, { 5816 }, { 20004 }, { 20005 }, { 20006 }, { 20007 }, { 20008 }, { 20009 }, { 20010 }, { 20011 }, { 20012 }, { 20013 }, { 20014 }, { 20015 }, { 20016 }, { 20017 }, { 20018 }, { 20019 }, { 20020 }, { 20021 }, { 20022 }, { 20023 }, { 20024 }, { 20025 }, { 20026 }, { 20027 }, { 20028 }, { 20029 }, { 20030 }, { 20031 }, { 20032 }, { 20064 }, { 20065 }, { 20066 }, { 20067 }, { 20068 }, { 20069 }, { 20070 }, { 20071 }, { 20072 }, { 20073 }, { 20074 }, { 20075 }, { 20076 }, { 20077 }, { 20078 }, { 20079 }, { 20080 }, { 20081 }, { 20082 }, { 20083 }, { 20084 }, { 20085 }, { 20086 }, { 20087 }, { 20088 }, { 20089 }, { 20090 }, { 20091 }, { 20092 }, { 21413 }, { 21414 }, { 21415 }, { 21416 }, { 21417 }, { 21418 }, { 21419 }, { 21420 }, { 21421 }, { 21422 }, { 21423 }, { 21453 }, { 21454 }, { 21455 }, { 21456 }, { 21457 }, { 21458 }, { 21459 }, { 21460 }, { 21461 }, { 21462 }, { 21463 }, { 21473 }, { 21474 }, { 21475 }, { 21476 }, { 21477 }, { 21478 }, { 21479 }, { 21480 }, { 21481 }, { 21482 }, { 21483 }, { 21896 }, { 21897 }, { 21898 }, { 21899 }, { 22171 }, { 22172 }, { 22173 }, { 22174 }, { 22175 }, { 22176 }, { 22177 }, { 22181 }, { 22182 }, { 22183 }, { 22184 }, { 22185 }, { 22186 }, { 22187 }, { 22191 }, { 22192 }, { 22193 }, { 22194 }, { 22195 }, { 22196 }, { 22197 }, { 25884 }, { 27205 }, { 27206 }, { 27207 }, { 27208 }, { 27209 }, { 27210 }, { 27211 }, { 27212 }, { 27213 }, { 27214 }, { 27215 }, { 27216 }, { 27217 }, { 27218 }, { 27219 }, { 27220 }, { 27221 }, { 27222 }, { 27223 }, { 27224 }, { 27225 }, { 27226 }, { 27227 }, { 27228 }, { 27229 }, { 27230 }, { 27231 }, { 27232 }, { 27391 }, { 27392 }, { 27393 }, { 27394 }, { 27395 }, { 27396 }, { 27397 }, { 27398 }, { 27492 }, { 28402 }, { 28403 }, { 28404 }, { 28405 }, { 28406 }, { 28407 }, { 28408 }, { 28409 }, { 28410 }, { 28411 }, { 28412 }, { 28413 }, { 28414 }, { 28415 }, { 28416 }, { 28417 }, { 28418 }, { 28419 }, { 28420 }, { 28421 }, { 28422 }, { 28423 }, { 28424 }, { 28425 }, { 28426 }, { 28427 }, { 28428 }, { 28429 }, { 28430 }, { 28431 }, { 28432 }, { 28462 }, { 28463 }, { 28464 }, { 28465 }, { 28466 }, { 28467 }, { 28468 }, { 28469 }, { 28470 }, { 28471 }, { 28472 }, { 28473 }, { 28474 }, { 28475 }, { 28476 }, { 28477 }, { 28478 }, { 28479 }, { 28480 }, { 28481 }, { 28482 }, { 28483 }, { 28484 }, { 28485 }, { 28486 }, { 28487 }, { 28488 }, { 28489 }, { 28490 }, { 28491 }, { 28492 }, { 29701 }, { 29702 }, { 30161 }, { 30162 }, { 30163 }, { 30164 }, { 30165 }, { 30166 }, { 30167 }, { 30168 }, { 30169 }, { 30170 }, { 30171 }, { 30172 }, { 30173 }, { 30174 }, { 30175 }, { 30176 }, { 30177 }, { 30178 }, { 30179 }, { 30800 }, { 31251 }, { 31252 }, { 31253 }, { 31254 }, { 31255 }, { 31256 }, { 31257 }, { 31258 }, { 31259 }, { 31275 }, { 31276 }, { 31277 }, { 31278 }, { 31279 }, { 31281 }, { 31282 }, { 31283 }, { 31284 }, { 31285 }, { 31286 }, { 31287 }, { 31288 }, { 31289 }, { 31290 }, { 31700 }, }; #define AXIS_ORIENTATION_TABLE_SIZE 1703 int mapcache_is_axis_inverted(const char *srs) { int i,code; if(strncasecmp(srs,"epsg:",5) || strlen(srs)<6) { /* if we don't have an epsg formated srs */ return MAPCACHE_FALSE; } code = atoi(&(srs[5])); /*check the static table*/ for (i=0; i #define INITIAL_BUFFER_SIZE 100 static void _mapcache_buffer_realloc(mapcache_buffer *buffer, apr_off_t len) { if(buffer->avail) { unsigned char* newbuf ; while ( len > buffer->avail ) { buffer->avail += buffer->avail; } newbuf = realloc(buffer->buf, buffer->avail) ; if ( newbuf != buffer->buf ) { if ( buffer->buf ) apr_pool_cleanup_kill(buffer->pool, buffer->buf, (void*)free) ; apr_pool_cleanup_register(buffer->pool, newbuf,(void*)free, apr_pool_cleanup_null); buffer->buf = newbuf ; } } else { buffer->avail = len; buffer->buf = malloc(buffer->avail); apr_pool_cleanup_register(buffer->pool, buffer->buf,(void*)free, apr_pool_cleanup_null); } } mapcache_buffer *mapcache_buffer_create(size_t initialStorage, apr_pool_t* pool) { mapcache_buffer *buffer = apr_pcalloc(pool, sizeof(mapcache_buffer)); if(!buffer) return NULL; buffer->pool = pool; buffer->avail = initialStorage; if(buffer->avail) { buffer->buf = malloc(buffer->avail); apr_pool_cleanup_register(buffer->pool, buffer->buf,(void*)free, apr_pool_cleanup_null); } else { buffer->buf = NULL; } return buffer; } int mapcache_buffer_append(mapcache_buffer *buffer, size_t len, void *data) { size_t total = buffer->size + len; if(total > buffer->avail) _mapcache_buffer_realloc(buffer,total); memcpy(((unsigned char*)buffer->buf) + buffer->size, data, len); buffer->size += len; return len; } /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/cache.c000066400000000000000000000150201316353564100160200ustar00rootroot00000000000000/****************************************************************************** * * Project: MapServer * Purpose: MapCache tile caching: generic cache access * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2015 Regents of the University of Minnesota. * * 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 compositeriction, 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #include int mapcache_cache_tile_get(mapcache_context *ctx, mapcache_cache *cache, mapcache_tile *tile) { int i,rv; #ifdef DEBUG ctx->log(ctx,MAPCACHE_DEBUG,"calling tile_get on cache (%s): (tileset=%s, grid=%s, z=%d, x=%d, y=%d",cache->name,tile->tileset->name,tile->grid_link->grid->name,tile->z,tile->x, tile->y); #endif for(i=0;i<=cache->retry_count;i++) { if(i) { ctx->log(ctx,MAPCACHE_INFO,"cache (%s) get retry %d of %d. previous try returned error: %s",cache->name,i,cache->retry_count,ctx->get_error_message(ctx)); ctx->clear_errors(ctx); if(cache->retry_delay > 0) { double wait = cache->retry_delay; int j = 0; for(j=1;j_tile_get(ctx,cache,tile); if(!GC_HAS_ERROR(ctx)) break; } return rv; } void mapcache_cache_tile_delete(mapcache_context *ctx, mapcache_cache *cache, mapcache_tile *tile) { int i; #ifdef DEBUG ctx->log(ctx,MAPCACHE_DEBUG,"calling tile_delete on cache (%s): (tileset=%s, grid=%s, z=%d, x=%d, y=%d",cache->name,tile->tileset->name,tile->grid_link->grid->name,tile->z,tile->x, tile->y); #endif if(tile->tileset->read_only) return; for(i=0;i<=cache->retry_count;i++) { if(i) { ctx->log(ctx,MAPCACHE_INFO,"cache (%s) delete retry %d of %d. previous try returned error: %s",cache->name,i,cache->retry_count,ctx->get_error_message(ctx)); ctx->clear_errors(ctx); if(cache->retry_delay > 0) { double wait = cache->retry_delay; int j = 0; for(j=1;j_tile_delete(ctx,cache,tile); if(!GC_HAS_ERROR(ctx)) break; } } int mapcache_cache_tile_exists(mapcache_context *ctx, mapcache_cache *cache, mapcache_tile *tile) { int i,rv; #ifdef DEBUG ctx->log(ctx,MAPCACHE_DEBUG,"calling tile_exists on cache (%s): (tileset=%s, grid=%s, z=%d, x=%d, y=%d",cache->name,tile->tileset->name,tile->grid_link->grid->name,tile->z,tile->x, tile->y); #endif for(i=0;i<=cache->retry_count;i++) { if(i) { ctx->log(ctx,MAPCACHE_INFO,"cache (%s) exists retry %d of %d. previous try returned error: %s",cache->name,i,cache->retry_count,ctx->get_error_message(ctx)); ctx->clear_errors(ctx); if(cache->retry_delay > 0) { double wait = cache->retry_delay; int j = 0; for(j=1;j_tile_exists(ctx,cache,tile); if(!GC_HAS_ERROR(ctx)) break; } return rv; } void mapcache_cache_tile_set(mapcache_context *ctx, mapcache_cache *cache, mapcache_tile *tile) { int i; #ifdef DEBUG ctx->log(ctx,MAPCACHE_DEBUG,"calling tile_set on cache (%s): (tileset=%s, grid=%s, z=%d, x=%d, y=%d",cache->name,tile->tileset->name,tile->grid_link->grid->name,tile->z,tile->x, tile->y); #endif if(tile->tileset->read_only) return; for(i=0;i<=cache->retry_count;i++) { if(i) { ctx->log(ctx,MAPCACHE_INFO,"cache (%s) set retry %d of %d. previous try returned error: %s",cache->name,i,cache->retry_count,ctx->get_error_message(ctx)); ctx->clear_errors(ctx); if(cache->retry_delay > 0) { double wait = cache->retry_delay; int j = 0; for(j=1;j_tile_set(ctx,cache,tile); if(!GC_HAS_ERROR(ctx)) break; } } void mapcache_cache_tile_multi_set(mapcache_context *ctx, mapcache_cache *cache, mapcache_tile *tiles, int ntiles) { int i; #ifdef DEBUG ctx->log(ctx,MAPCACHE_DEBUG,"calling tile_multi_set on cache (%s): (tileset=%s, grid=%s, first tile: z=%d, x=%d, y=%d",cache->name,tiles[0].tileset->name,tiles[0].grid_link->grid->name, tiles[0].z,tiles[0].x, tiles[0].y); #endif if((&tiles[0])->tileset->read_only) return; if(cache->_tile_multi_set) { for(i=0;i<=cache->retry_count;i++) { if(i) { ctx->log(ctx,MAPCACHE_INFO,"cache (%s) multi-set retry %d of %d. previous try returned error: %s",cache->name,i,cache->retry_count,ctx->get_error_message(ctx)); ctx->clear_errors(ctx); if(cache->retry_delay > 0) { double wait = cache->retry_delay; int j = 0; for(j=1;j_tile_multi_set(ctx,cache,tiles,ntiles); if(!GC_HAS_ERROR(ctx)) break; } } else { for( i=0;i #include #include #include #include #include #include #ifdef APR_HAS_THREADS #include #endif #ifndef _WIN32 #include #endif #include #define PAGESIZE 64*1024 #define CACHESIZE 1024*1024 typedef struct mapcache_cache_bdb mapcache_cache_bdb; struct mapcache_cache_bdb { mapcache_cache cache; char *basedir; char *key_template; }; struct bdb_env { DB* db; DB_ENV *env; int readonly; char *errmsg; }; void mapcache_bdb_connection_constructor(mapcache_context *ctx, void **conn_, void *params) { int ret; int env_flags; int mode; mapcache_cache_bdb *cache = (mapcache_cache_bdb*)params; char *dbfile = malloc(strlen(cache->basedir)+strlen(cache->cache.name)+strlen("/.db")+1); struct bdb_env *benv = calloc(1,sizeof(struct bdb_env)); dbfile[0]=0; strcat(strcat(strcat(strcat(dbfile,cache->basedir),"/"),cache->cache.name),".db"); /*yuk yuk*/ *conn_ = benv; ret = db_env_create(&benv->env, 0); if(ret) { ctx->set_error(ctx, 500, "bdb cache failure for db_env_create: %s", db_strerror(ret)); goto cleanup_error; } ret = benv->env->set_cachesize(benv->env,0,CACHESIZE,1); /* set a larger cache size than default */ if(ret) { ctx->set_error(ctx, 500, "bdb cache failure for db->set_cachesize: %s", db_strerror(ret)); goto cleanup_error; } env_flags = DB_INIT_CDB|DB_INIT_MPOOL|DB_CREATE; ret = benv->env->open(benv->env,cache->basedir,env_flags,0); if(ret) { ctx->set_error(ctx,500,"bdb cache failure for env->open: %s", db_strerror(ret)); goto cleanup_error; } if ((ret = db_create(&benv->db, benv->env, 0)) != 0) { ctx->set_error(ctx,500,"bdb cache failure for db_create: %s", db_strerror(ret)); goto cleanup_error; } mode = DB_BTREE; ret = benv->db->set_pagesize(benv->db,PAGESIZE); /* set pagesize to maximum allowed, as tile data is usually pretty large */ if(ret) { ctx->set_error(ctx,500,"bdb cache failure for db->set_pagesize: %s", db_strerror(ret)); goto cleanup_error; } if ((ret = benv->db->open(benv->db, NULL, dbfile, NULL, mode, DB_CREATE, 0664)) != 0) { ctx->set_error(ctx,500,"bdb cache failure 1 for db->open: %s", db_strerror(ret)); goto cleanup_error; } goto cleanup; cleanup_error: free(benv); cleanup: free(dbfile); } void mapcache_bdb_connection_destructor(void *conn_) { struct bdb_env *benv = (struct bdb_env*)conn_; benv->db->close(benv->db,0); benv->env->close(benv->env,0); free(benv); } static mapcache_pooled_connection* _bdb_get_conn(mapcache_context *ctx, mapcache_cache_bdb *cache, mapcache_tile* tile, int readonly) { struct bdb_env *benv; mapcache_pooled_connection *pc; char *conn_key = apr_pstrcat(ctx->pool,readonly?"ro_":"rw_",cache->cache.name,NULL); pc = mapcache_connection_pool_get_connection(ctx,conn_key,mapcache_bdb_connection_constructor, mapcache_bdb_connection_destructor, cache); if(GC_HAS_ERROR(ctx)) return NULL; benv = pc->connection; benv->readonly = readonly; return pc; } static void _bdb_release_conn(mapcache_context *ctx, mapcache_cache_bdb *cache, mapcache_tile *tile, mapcache_pooled_connection *pc) { if(GC_HAS_ERROR(ctx)) { mapcache_connection_pool_invalidate_connection(ctx, pc); } else { mapcache_connection_pool_release_connection(ctx,pc); } } static int _mapcache_cache_bdb_has_tile(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { int ret; DBT key; mapcache_cache_bdb *cache = (mapcache_cache_bdb*)pcache; char *skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL); mapcache_pooled_connection *pc; struct bdb_env *benv; pc = _bdb_get_conn(ctx,cache,tile,1); if(GC_HAS_ERROR(ctx)) return MAPCACHE_FALSE; benv = pc->connection; memset(&key, 0, sizeof(DBT)); key.data = skey; key.size = strlen(skey)+1; ret = benv->db->exists(benv->db, NULL, &key, 0); if(ret == 0) { ret = MAPCACHE_TRUE; } else if(ret == DB_NOTFOUND) { ret = MAPCACHE_FALSE; } else { ctx->set_error(ctx,500,"bdb backend failure on tile_exists: %s",db_strerror(ret)); ret= MAPCACHE_FALSE; } _bdb_release_conn(ctx,cache,tile,pc); return ret; } static void _mapcache_cache_bdb_delete(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { DBT key; int ret; mapcache_cache_bdb *cache = (mapcache_cache_bdb*)pcache; char *skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL); mapcache_pooled_connection *pc; struct bdb_env *benv; pc = _bdb_get_conn(ctx,cache,tile,0); GC_CHECK_ERROR(ctx); benv = pc->connection; memset(&key, 0, sizeof(DBT)); key.data = skey; key.size = strlen(skey)+1; ret = benv->db->del(benv->db, NULL, &key, 0); if(ret && ret != DB_NOTFOUND) { ctx->set_error(ctx,500,"bdb backend failure on tile_delete: %s",db_strerror(ret)); } else { ret = benv->db->sync(benv->db,0); if(ret) ctx->set_error(ctx,500,"bdb backend sync failure on tile_delete: %s",db_strerror(ret)); } _bdb_release_conn(ctx,cache,tile,pc); } static int _mapcache_cache_bdb_get(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { DBT key,data; int ret; char *skey; mapcache_cache_bdb *cache = (mapcache_cache_bdb*)pcache; mapcache_pooled_connection *pc; struct bdb_env *benv; pc = _bdb_get_conn(ctx,cache,tile,1); if(GC_HAS_ERROR(ctx)) return MAPCACHE_FALSE; benv = pc->connection; skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL); memset(&key, 0, sizeof(DBT)); memset(&data, 0, sizeof(DBT)); data.flags = DB_DBT_MALLOC; key.data = skey; key.size = strlen(skey)+1; ret = benv->db->get(benv->db, NULL, &key, &data, 0); if(ret == 0) { if(((char*)(data.data))[0] == '#') { tile->encoded_data = mapcache_empty_png_decode(ctx,tile->grid_link->grid->tile_sx, tile->grid_link->grid->tile_sy, (unsigned char*)data.data,&tile->nodata); } else { tile->encoded_data = mapcache_buffer_create(0,ctx->pool); tile->encoded_data->buf = data.data; tile->encoded_data->size = data.size-sizeof(apr_time_t); tile->encoded_data->avail = data.size; apr_pool_cleanup_register(ctx->pool, tile->encoded_data->buf,(void*)free, apr_pool_cleanup_null); } tile->mtime = *((apr_time_t*)(((char*)data.data)+data.size-sizeof(apr_time_t))); ret = MAPCACHE_SUCCESS; } else if(ret == DB_NOTFOUND) { ret = MAPCACHE_CACHE_MISS; } else { ctx->set_error(ctx,500,"bdb backend failure on tile_get: %s",db_strerror(ret)); ret = MAPCACHE_FAILURE; } _bdb_release_conn(ctx,cache,tile,pc); return ret; } static void _mapcache_cache_bdb_set(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { DBT key,data; int ret; apr_time_t now; mapcache_cache_bdb *cache = (mapcache_cache_bdb*)pcache; char *skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL); mapcache_pooled_connection *pc; struct bdb_env *benv; now = apr_time_now(); memset(&key, 0, sizeof(DBT)); memset(&data, 0, sizeof(DBT)); key.data = skey; key.size = strlen(skey)+1; if(!tile->raw_image) { tile->raw_image = mapcache_imageio_decode(ctx, tile->encoded_data); GC_CHECK_ERROR(ctx); } if(tile->raw_image->h==256 && tile->raw_image->w==256 && mapcache_image_blank_color(tile->raw_image) != MAPCACHE_FALSE) { data.size = 5+sizeof(apr_time_t); data.data = apr_palloc(ctx->pool,data.size); (((char*)data.data)[0])='#'; memcpy(((char*)data.data)+1,tile->raw_image->data,4); memcpy(((char*)data.data)+5,&now,sizeof(apr_time_t)); } else { if(!tile->encoded_data) { tile->encoded_data = tile->tileset->format->write(ctx, tile->raw_image, tile->tileset->format); GC_CHECK_ERROR(ctx); } mapcache_buffer_append(tile->encoded_data,sizeof(apr_time_t),&now); data.data = tile->encoded_data->buf; data.size = tile->encoded_data->size; tile->encoded_data->size -= sizeof(apr_time_t); } pc = _bdb_get_conn(ctx,cache,tile,0); GC_CHECK_ERROR(ctx); benv = pc->connection; ret = benv->db->put(benv->db,NULL,&key,&data,0); if(ret != 0) { ctx->set_error(ctx,500,"dbd backend failed on tile_set: %s", db_strerror(ret)); } else { ret = benv->db->sync(benv->db,0); if(ret) ctx->set_error(ctx,500,"bdb backend sync failure on tile_set: %s",db_strerror(ret)); } _bdb_release_conn(ctx,cache,tile,pc); } static void _mapcache_cache_bdb_multiset(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tiles, int ntiles) { DBT key,data; int ret,i; apr_time_t now; mapcache_cache_bdb *cache = (mapcache_cache_bdb*)pcache; mapcache_pooled_connection *pc; struct bdb_env *benv; now = apr_time_now(); memset(&key, 0, sizeof(DBT)); memset(&data, 0, sizeof(DBT)); pc = _bdb_get_conn(ctx,cache,&tiles[0],0); GC_CHECK_ERROR(ctx); benv = pc->connection; for(i=0; ikey_template,NULL,NULL); if(!tile->raw_image) { tile->raw_image = mapcache_imageio_decode(ctx, tile->encoded_data); if(GC_HAS_ERROR(ctx)) { _bdb_release_conn(ctx,cache,&tiles[0],pc); return; } } if(tile->raw_image->h==256 && tile->raw_image->w==256 && mapcache_image_blank_color(tile->raw_image) != MAPCACHE_FALSE) { data.size = 5+sizeof(apr_time_t); data.data = apr_palloc(ctx->pool,data.size); (((char*)data.data)[0])='#'; memcpy(((char*)data.data)+1,tile->raw_image->data,4); memcpy(((char*)data.data)+5,&now,sizeof(apr_time_t)); } else { if(!tile->encoded_data) { tile->encoded_data = tile->tileset->format->write(ctx, tile->raw_image, tile->tileset->format); if(GC_HAS_ERROR(ctx)) { _bdb_release_conn(ctx,cache,&tiles[0],pc); return; } } mapcache_buffer_append(tile->encoded_data,sizeof(apr_time_t),&now); data.data = tile->encoded_data->buf; data.size = tile->encoded_data->size; tile->encoded_data->size -= sizeof(apr_time_t); } key.data = skey; key.size = strlen(skey)+1; ret = benv->db->put(benv->db,NULL,&key,&data,0); if(ret != 0) { ctx->set_error(ctx,500,"dbd backend failed on tile_multiset: %s", db_strerror(ret)); break; } } if(ret == 0) { ret = benv->db->sync(benv->db,0); if(ret) ctx->set_error(ctx,500,"bdb backend sync failure on sync in tile_multiset: %s",db_strerror(ret)); } _bdb_release_conn(ctx,cache,&tiles[0],pc); } static void _mapcache_cache_bdb_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_cache *cache, mapcache_cfg *config) { ezxml_t cur_node; mapcache_cache_bdb *dcache = (mapcache_cache_bdb*)cache; if ((cur_node = ezxml_child(node,"base")) != NULL) { dcache->basedir = apr_pstrdup(ctx->pool,cur_node->txt); } if ((cur_node = ezxml_child(node,"key_template")) != NULL) { dcache->key_template = apr_pstrdup(ctx->pool,cur_node->txt); } else { dcache->key_template = apr_pstrdup(ctx->pool,"{tileset}-{grid}-{dim}-{z}-{y}-{x}.{ext}"); } if(!dcache->basedir) { ctx->set_error(ctx,500,"dbd cache \"%s\" is missing entry",cache->name); return; } } /** * \private \memberof mapcache_cache_dbd */ static void _mapcache_cache_bdb_configuration_post_config(mapcache_context *ctx, mapcache_cache *cache, mapcache_cfg *cfg) { mapcache_cache_bdb *dcache = (mapcache_cache_bdb*)cache; apr_status_t rv; apr_dir_t *dir; rv = apr_dir_open(&dir, dcache->basedir, ctx->pool); if(rv != APR_SUCCESS) { char errmsg[120]; ctx->set_error(ctx,500,"bdb failed to open directory %s:%s",dcache->basedir,apr_strerror(rv,errmsg,120)); } } /** * \brief creates and initializes a mapcache_dbd_cache */ mapcache_cache* mapcache_cache_bdb_create(mapcache_context *ctx) { mapcache_cache_bdb *cache = apr_pcalloc(ctx->pool,sizeof(mapcache_cache_bdb)); if(!cache) { ctx->set_error(ctx, 500, "failed to allocate berkeley db cache"); return NULL; } cache->cache.metadata = apr_table_make(ctx->pool,3); cache->cache.type = MAPCACHE_CACHE_BDB; cache->cache._tile_delete = _mapcache_cache_bdb_delete; cache->cache._tile_get = _mapcache_cache_bdb_get; cache->cache._tile_exists = _mapcache_cache_bdb_has_tile; cache->cache._tile_set = _mapcache_cache_bdb_set; cache->cache._tile_multi_set = _mapcache_cache_bdb_multiset; cache->cache.configuration_post_config = _mapcache_cache_bdb_configuration_post_config; cache->cache.configuration_parse_xml = _mapcache_cache_bdb_configuration_parse_xml; cache->basedir = NULL; cache->key_template = NULL; return (mapcache_cache*)cache; } #else mapcache_cache* mapcache_cache_bdb_create(mapcache_context *ctx) { ctx->set_error(ctx,400,"BERKELEYDB support not compiled in this version"); return NULL; } #endif /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/cache_composite.c000066400000000000000000000246611316353564100201150ustar00rootroot00000000000000/****************************************************************************** * * Project: MapServer * Purpose: MapCache tile caching: composite cache backend. * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 compositeriction, 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #include typedef struct mapcache_cache_composite mapcache_cache_composite; typedef struct mapcache_cache_composite_cache_link mapcache_cache_composite_cache_link; struct mapcache_cache_composite_cache_link { mapcache_cache *cache; int minzoom; int maxzoom; apr_array_header_t *grids; apr_table_t *dimensions; /* key/value pairs of dimensions */ }; struct mapcache_cache_composite { mapcache_cache cache; apr_array_header_t *cache_links; }; static mapcache_cache_composite_cache_link* _mapcache_cache_link_create(apr_pool_t *pool) { mapcache_cache_composite_cache_link *cl = apr_pcalloc(pool, sizeof(mapcache_cache_composite_cache_link)); cl->cache=NULL; cl->dimensions=NULL; cl->grids=NULL; cl->maxzoom=-1; cl->minzoom=-1; return cl; } /** * returns the mapcache_cache to use for a given tile * @param ctx * @param tile * @return */ static mapcache_cache* _mapcache_composite_cache_get(mapcache_context *ctx, mapcache_cache_composite *cache, mapcache_tile *tile) { int i; for(i=0; icache_links->nelts; i++) { mapcache_cache_composite_cache_link *cache_link = APR_ARRAY_IDX(cache->cache_links,i,mapcache_cache_composite_cache_link*); if(cache_link->minzoom != -1 && tile->z < cache_link->minzoom) continue; if(cache_link->maxzoom != -1 && tile->z > cache_link->maxzoom) continue; if(cache_link->grids) { int j; for(j=0;jgrids->nelts;j++) { char *grid_name = APR_ARRAY_IDX(cache_link->grids,j,char*); if(!strcmp(tile->grid_link->grid->name,grid_name)) break; } /* not found */ if(j == cache_link->grids->nelts) continue; } if(cache_link->dimensions) { const apr_array_header_t *array = apr_table_elts(cache_link->dimensions); apr_table_entry_t *elts = (apr_table_entry_t *) array->elts; int j; if(!tile->dimensions) continue; /* the cache link refers to dimensions, but this tile does not have any, it cannot match */ for (j = 0; j < array->nelts; j++) { char *dim = elts[j].key; char *dimval = elts[j].val; int k; for(k=0;kdimensions->nelts;k++) { mapcache_requested_dimension *rdim = APR_ARRAY_IDX(tile->dimensions,i,mapcache_requested_dimension*); if(!strcmp(rdim->dimension->name,dim) && !strcmp(rdim->cached_value,dimval)) break; } if(k == tile->dimensions->nelts) break; /* no tile dimension matched the current cache dimension */ } if(j != array->nelts) continue; /* we broke out early from the cache dimension loop, so at least one was not correct */ } return cache_link->cache; } ctx->set_error(ctx, 500, "no cache matches for given tile request"); return NULL; } static int _mapcache_cache_composite_tile_exists(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_composite *cache = (mapcache_cache_composite*)pcache; mapcache_cache *subcache; subcache = _mapcache_composite_cache_get(ctx, cache, tile); if(GC_HAS_ERROR(ctx) || !subcache) return MAPCACHE_FAILURE; return mapcache_cache_tile_exists(ctx, subcache, tile); } static void _mapcache_cache_composite_tile_delete(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_composite *cache = (mapcache_cache_composite*)pcache; mapcache_cache *subcache; subcache = _mapcache_composite_cache_get(ctx, cache, tile); GC_CHECK_ERROR(ctx); /*delete the tile itself*/ mapcache_cache_tile_delete(ctx,subcache,tile); } /** * \brief get content of given tile * * fills the mapcache_tile::data of the given tile with content stored on the composite server * \private \memberof mapcache_cache_composite * \sa mapcache_cache::tile_get() */ static int _mapcache_cache_composite_tile_get(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_composite *cache = (mapcache_cache_composite*)pcache; mapcache_cache *subcache; subcache = _mapcache_composite_cache_get(ctx, cache, tile); GC_CHECK_ERROR_RETURN(ctx); return mapcache_cache_tile_get(ctx,subcache,tile); } static void _mapcache_cache_composite_tile_set(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_composite *cache = (mapcache_cache_composite*)pcache; mapcache_cache *subcache; subcache = _mapcache_composite_cache_get(ctx, cache, tile); GC_CHECK_ERROR(ctx); return mapcache_cache_tile_set(ctx,subcache,tile); } static void _mapcache_cache_composite_tile_multi_set(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tiles, int ntiles) { mapcache_cache_composite *cache = (mapcache_cache_composite*)pcache; mapcache_cache *subcache; subcache = _mapcache_composite_cache_get(ctx, cache, &tiles[0]); GC_CHECK_ERROR(ctx); return mapcache_cache_tile_multi_set(ctx,subcache,tiles,ntiles); } /** * \private \memberof mapcache_cache_composite */ static void _mapcache_cache_composite_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_cache *pcache, mapcache_cfg *config) { ezxml_t cur_node; mapcache_cache_composite *cache = (mapcache_cache_composite*)pcache; cache->cache_links = apr_array_make(ctx->pool,3,sizeof(mapcache_cache_composite_cache_link*)); for(cur_node = ezxml_child(node,"cache"); cur_node; cur_node = cur_node->next) { char *sZoom; int zoom; mapcache_cache *refcache = mapcache_configuration_get_cache(config, cur_node->txt); mapcache_cache_composite_cache_link *cachelink; if(!refcache) { ctx->set_error(ctx, 400, "composite cache \"%s\" references cache \"%s\"," " but it is not configured (hint:referenced caches must be declared before this composite cache in the xml file)", pcache->name, cur_node->txt); return; } cachelink = _mapcache_cache_link_create(ctx->pool); cachelink->cache = refcache; sZoom = (char*)ezxml_attr(cur_node,"max-zoom"); if(sZoom) { char *endptr; zoom = (int)strtol(sZoom,&endptr,10); if(*endptr != 0 || zoom < 0) { ctx->set_error(ctx, 400, "failed to parse cache max-zoom %s (expecting a positive integer)", sZoom); return; } cachelink->maxzoom = zoom; } sZoom = (char*)ezxml_attr(cur_node,"min-zoom"); if(sZoom) { char *endptr; zoom = (int)strtol(sZoom,&endptr,10); if(*endptr != 0 || zoom < 0) { ctx->set_error(ctx, 400, "failed to parse cache min-zoom %s (expecting a positive integer)", sZoom); return; } cachelink->minzoom = zoom; } sZoom = (char*)ezxml_attr(cur_node,"grids"); if(sZoom) { char *grids = apr_pstrdup(ctx->pool,sZoom),*key,*last; for(key = apr_strtok(grids, ",", &last); key; key = apr_strtok(NULL,",",&last)) { /*loop through grids*/ if(!cachelink->grids) { cachelink->grids =apr_array_make(ctx->pool,1,sizeof(char*)); } APR_ARRAY_PUSH(cachelink->grids,char*) = key; } } sZoom = (char*)ezxml_attr(cur_node,"dimensions"); if(sZoom) { char *dims = apr_pstrdup(ctx->pool,sZoom),*key,*last; for(key = apr_strtok(dims, ",", &last); key; key = apr_strtok(NULL,",",&last)) { char *dimname; /*loop through dims*/ if(!cachelink->dimensions) { cachelink->dimensions =apr_table_make(ctx->pool,1); } dimname = key; while(*key && *key!='=') key++; if(!(*key)) { ctx->set_error(ctx,400,"failed to parse composite cache dimensions. expecting dimensions=\"dim1=val1,dim2=val2\""); return; } *key = 0; key++; apr_table_set(cachelink->dimensions,dimname,key); } } APR_ARRAY_PUSH(cache->cache_links,mapcache_cache_composite_cache_link*) = cachelink; } } /** * \private \memberof mapcache_cache_composite */ static void _mapcache_cache_composite_configuration_post_config(mapcache_context *ctx, mapcache_cache *cache, mapcache_cfg *cfg) { } /** * \brief creates and initializes a mapcache_cache_composite */ mapcache_cache* mapcache_cache_composite_create(mapcache_context *ctx) { mapcache_cache_composite *cache = apr_pcalloc(ctx->pool,sizeof(mapcache_cache_composite)); if(!cache) { ctx->set_error(ctx, 500, "failed to allocate composite cache"); return NULL; } cache->cache.metadata = apr_table_make(ctx->pool,3); cache->cache.type = MAPCACHE_CACHE_COMPOSITE; cache->cache._tile_delete = _mapcache_cache_composite_tile_delete; cache->cache._tile_get = _mapcache_cache_composite_tile_get; cache->cache._tile_exists = _mapcache_cache_composite_tile_exists; cache->cache._tile_set = _mapcache_cache_composite_tile_set; cache->cache._tile_multi_set = _mapcache_cache_composite_tile_multi_set; cache->cache.configuration_post_config = _mapcache_cache_composite_configuration_post_config; cache->cache.configuration_parse_xml = _mapcache_cache_composite_configuration_parse_xml; return (mapcache_cache*)cache; } mapcache-rel-1-6-1/lib/cache_couchbase.c000066400000000000000000000405261316353564100200450ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching support file: couchbase cache backend. * Author: Michael Downey and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #ifdef USE_COUCHBASE #include #include #include #include typedef struct mapcache_cache_couchbase mapcache_cache_couchbase; /**\class mapcache_cache_couchbase * \brief a mapcache_cache on couchbase servers * \implements mapcache_cache */ struct mapcache_cache_couchbase { mapcache_cache cache; // apr_reslist_t *connection_pool; char *host; char *username; char *password; char *bucket; mapcache_context *ctx; }; typedef struct getStruct { mapcache_buffer *tileBuffer; libcouchbase_error_t error; } getStruct_t; /* Not sure if we need this. */ static void _couchbase_error_callback(libcouchbase_t instance, libcouchbase_error_t error, const char *errinfo) { /* Ignore timeouts... */ if (error != LIBCOUCHBASE_ETIMEDOUT) { fprintf(stderr, "\nFATAL ERROR: %s\n", libcouchbase_strerror(instance, error)); if (errinfo && strlen(errinfo) != 0) { fprintf(stderr, "\t\"%s\"\n", errinfo); } } } static void _couchbase_get_callback(libcouchbase_t instance, const void *cookie, libcouchbase_error_t error, const void *key, libcouchbase_size_t nkey, const void *bytes, libcouchbase_size_t nbytes, libcouchbase_uint32_t flags, libcouchbase_cas_t cas) { (void)instance; (void)key; (void)nkey; (void)flags; (void)cas; if (cookie) { getStruct_t *request = (getStruct_t*)cookie; request->error = error; if (error == LIBCOUCHBASE_SUCCESS && request->tileBuffer) { mapcache_buffer_append(request->tileBuffer, nbytes, (void*)bytes); } } } static void _couchbase_store_callback(libcouchbase_t instance, const void* cookie, libcouchbase_storage_t unknown, libcouchbase_error_t error, const void* unknown2, libcouchbase_size_t unknown3, libcouchbase_cas_t cas) { (void)instance; (void)unknown; (void)unknown2; (void)unknown3; (void)cas; libcouchbase_error_t* userError = (libcouchbase_error_t*)cookie; *userError = error; } static apr_status_t _couchbase_reslist_get_connection(void **conn_, void *params, apr_pool_t *pool) { mapcache_cache_couchbase *cache = (mapcache_cache_couchbase*)params; libcouchbase_t *instance = apr_pcalloc(pool,sizeof(libcouchbase_t)); const char *host = cache->host; const char *username = cache->username; const char *passwd = cache->password; const char *bucket = "default"; *instance = libcouchbase_create(host, username, passwd, bucket, NULL); if (*instance == NULL) { return APR_EGENERAL; } libcouchbase_set_error_callback(*instance, _couchbase_error_callback); libcouchbase_set_get_callback(*instance, _couchbase_get_callback); libcouchbase_set_storage_callback(*instance, _couchbase_store_callback); if (libcouchbase_connect(*instance) != LIBCOUCHBASE_SUCCESS) { return APR_EGENERAL; } /* Wait for the connect to compelete */ libcouchbase_wait(*instance); *conn_ = instance; return APR_SUCCESS; } static apr_status_t _couchbase_reslist_free_connection(void *conn_, void *params, apr_pool_t *pool) { libcouchbase_t *instance = (libcouchbase_t*)conn_; libcouchbase_destroy(*instance); return APR_SUCCESS; } static libcouchbase_t* _couchbase_get_connection(mapcache_context *ctx, mapcache_tile *tile) { apr_status_t rv; libcouchbase_t *instance; mapcache_cache_couchbase *cache = (mapcache_cache_couchbase*)tile->tileset->cache; rv = apr_reslist_acquire(cache->connection_pool, (void **)&instance); if(rv != APR_SUCCESS) { ctx->set_error(ctx, 500, "failed to aquire connection to couchbase backend: %s", ctx->get_error_message(ctx)); return NULL; } return instance; } static void _couchbase_release_connection(mapcache_tile *tile, libcouchbase_t* instance) { mapcache_cache_couchbase* cache = (mapcache_cache_couchbase*)tile->tileset->cache; apr_reslist_release(cache->connection_pool, (void*)instance); } static void _couchbase_invalidate_connection(mapcache_tile *tile, libcouchbase_t* instance) { mapcache_cache_couchbase* cache = (mapcache_cache_couchbase*)tile->tileset->cache; apr_reslist_invalidate(cache->connection_pool, (void*)instance); } static int _mapcache_cache_couchbase_has_tile(mapcache_context *ctx, mapcache_tile *tile) { char *key[1]; libcouchbase_t *instance; libcouchbase_error_t error; size_t keySize[1]; getStruct_t request; key[0] = mapcache_util_get_tile_key(ctx, tile, NULL, " \r\n\t\f\e\a\b", "#"); if(GC_HAS_ERROR(ctx)) { return MAPCACHE_FALSE; } keySize[0] = strlen(key[0]); instance = _couchbase_get_connection(ctx, tile); request.tileBuffer = 0; request.error = LIBCOUCHBASE_KEY_ENOENT; error = libcouchbase_mget(*instance, &request, 1, (const void * const*)key, keySize, 0); if (error != LIBCOUCHBASE_SUCCESS) { ctx->set_error(ctx, 500, "couchbase: failed to get key %s: %s", key, libcouchbase_strerror(*instance, error)); _couchbase_invalidate_connection(tile, instance); return MAPCACHE_FALSE; } libcouchbase_wait(*instance); error = request.error; if (error != LIBCOUCHBASE_SUCCESS) { ctx->set_error(ctx, 500, "couchbase: failed to get key %s: %s", key, libcouchbase_strerror(*instance, error)); _couchbase_invalidate_connection(tile, instance); return MAPCACHE_FALSE; } _couchbase_release_connection(tile, instance); return MAPCACHE_TRUE; } static void _mapcache_cache_couchbase_delete(mapcache_context *ctx, mapcache_tile *tile) { char *key; libcouchbase_t *instance; libcouchbase_error_t error; key = mapcache_util_get_tile_key(ctx, tile,NULL," \r\n\t\f\e\a\b","#"); GC_CHECK_ERROR(ctx); instance = _couchbase_get_connection(ctx, tile); error = libcouchbase_remove(*instance, 0, key, strlen(key), 0); if (error != LIBCOUCHBASE_SUCCESS) { ctx->set_error(ctx, 500, "couchbase: failed to delete key %s: %s", key, libcouchbase_strerror(*instance, error)); } libcouchbase_wait(*instance); error = libcouchbase_get_last_error(*instance); if (error != LIBCOUCHBASE_SUCCESS) { ctx->set_error(ctx, 500, "couchbase: failed to delete key %s: %s", key, libcouchbase_strerror(*instance, error)); } _couchbase_release_connection(tile, instance); } /** * \brief get content of given tile * * fills the mapcache_tile::data of the given tile with content stored on the couchbase server * \private \memberof mapcache_cache_couchbase * \sa mapcache_cache::tile_get() */ static int _mapcache_cache_couchbase_get(mapcache_context *ctx, mapcache_tile *tile) { char *key[1]; size_t keySize[1]; libcouchbase_t *instance; libcouchbase_error_t error; getStruct_t request; key[0] = mapcache_util_get_tile_key(ctx, tile, NULL, " \r\n\t\f\e\a\b", "#"); if(GC_HAS_ERROR(ctx)) { return MAPCACHE_FAILURE; } keySize[0] = strlen(key[0]); tile->encoded_data = mapcache_buffer_create(0, ctx->pool); libcouchbase_time_t expires = 86400; if(tile->tileset->auto_expire) expires = tile->tileset->auto_expire; instance = _couchbase_get_connection(ctx, tile); if (GC_HAS_ERROR(ctx)) { return MAPCACHE_FAILURE; } request.tileBuffer = tile->encoded_data; error = libcouchbase_mget(*instance, &request, 1, (const void * const*)key, keySize, &expires); if (error != LIBCOUCHBASE_SUCCESS) { ctx->set_error(ctx, 500, "couchbase cache returned error on mget %s", libcouchbase_strerror(*instance, error)); _couchbase_invalidate_connection(tile, instance); return MAPCACHE_FAILURE; } libcouchbase_wait(*instance); if(request.error != LIBCOUCHBASE_SUCCESS) { _couchbase_release_connection(tile, instance); return MAPCACHE_CACHE_MISS; } if (tile->encoded_data->size == 0) { _couchbase_release_connection(tile, instance); ctx->set_error(ctx, 500, "couchbase cache returned 0-length data for tile %d %d %d", tile->x, tile->y, tile->z); return MAPCACHE_FAILURE; } apr_time_t now = apr_time_now(); tile->mtime = now; _couchbase_release_connection(tile, instance); return MAPCACHE_SUCCESS; } /** * \brief push tile data to couchbase * * writes the content of mapcache_tile::data to the configured couchbased instance(s) * \private \memberof mapcache_cache_couchbase * \sa mapcache_cache::tile_set() */ static void _mapcache_cache_couchbase_set(mapcache_context *ctx, mapcache_tile *tile) { char *key; libcouchbase_t *instance; libcouchbase_error_t error; const int max_retries = 3; int retries = max_retries; apr_interval_time_t delay; /* set expiration to one day if not configured */ libcouchbase_time_t expires = 86400; if(tile->tileset->auto_expire) expires = tile->tileset->auto_expire; mapcache_cache_couchbase *cache = (mapcache_cache_couchbase*)tile->tileset->cache; key = mapcache_util_get_tile_key(ctx, tile, NULL, " \r\n\t\f\e\a\b", "#"); GC_CHECK_ERROR(ctx); if(!tile->encoded_data) { tile->encoded_data = tile->tileset->format->write(ctx, tile->raw_image, tile->tileset->format); GC_CHECK_ERROR(ctx); } instance = _couchbase_get_connection(ctx, tile); GC_CHECK_ERROR(ctx); do { error = libcouchbase_store(*instance, &error, LIBCOUCHBASE_SET, key, strlen(key), tile->encoded_data->buf, tile->encoded_data->size, 0, expires, 0); if (error != LIBCOUCHBASE_SUCCESS) { _couchbase_release_connection(tile, instance); ctx->set_error(ctx, 500, "failed to store tile %d %d %d to couchbase cache %s due to eror %s.", tile->x, tile->y, tile->z, cache->cache.name, libcouchbase_strerror(*instance, error)); return; } libcouchbase_wait(*instance); if (error == LIBCOUCHBASE_ETMPFAIL) { if (retries > 0) { delay = 100000 * (1 << (max_retries - retries)); // Do an exponential back off of starting at 100 milliseconds apr_sleep(delay); } else { _couchbase_release_connection(tile, instance); ctx->set_error(ctx, 500, "failed to store tile %d %d %d to couchbase cache %s due to %s. Maximum number of retries used.", tile->x, tile->y, tile->z, cache->cache.name, libcouchbase_strerror(*instance, error)); return; } --retries; } else if (error != LIBCOUCHBASE_SUCCESS) { _couchbase_release_connection(tile, instance); ctx->set_error(ctx, 500, "failed to store tile %d %d %d to couchbase cache %s due to error %s.", tile->x, tile->y, tile->z, cache->cache.name, libcouchbase_strerror(*instance, error)); return; } } while (error == LIBCOUCHBASE_ETMPFAIL); _couchbase_release_connection(tile, instance); } /** * \private \memberof mapcache_cache_couchbase */ static void _mapcache_cache_couchbase_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_cache *cache, mapcache_cfg *config) { ezxml_t cur_node; apr_status_t rv; mapcache_cache_couchbase *dcache = (mapcache_cache_couchbase*)cache; int servercount = 0; for(cur_node = ezxml_child(node,"server"); cur_node; cur_node = cur_node->next) { servercount++; } if(!servercount) { ctx->set_error(ctx, 400, "couchbase cache %s has no s configured", cache->name); return; } if(servercount > 1) { ctx->set_error(ctx, 400, "couchbase cache %s has more than 1 server configured", cache->name); return; } cur_node = ezxml_child(node, "server"); ezxml_t xhost = ezxml_child(cur_node, "host"); /* Host should contain server:port */ ezxml_t xusername = ezxml_child(cur_node, "username"); ezxml_t xpasswd = ezxml_child(cur_node, "password"); ezxml_t xbucket = ezxml_child(cur_node, "bucket"); if(!xhost || !xhost->txt || ! *xhost->txt) { ctx->set_error(ctx, 400, "cache %s: with no ", cache->name); return; } else { dcache->host = apr_pstrdup(ctx->pool, xhost->txt); if (dcache->host == NULL) { ctx->set_error(ctx, 400, "cache %s: failed to allocate host string!", cache->name); return; } } if(xusername && xusername->txt && *xusername->txt) { dcache->username = apr_pstrdup(ctx->pool, xusername->txt); } if(xpasswd && xpasswd->txt && *xpasswd->txt) { dcache->password = apr_pstrdup(ctx->pool, xpasswd->txt); } if(xbucket && xbucket->txt && *xbucket->txt) { dcache->bucket = apr_pstrdup(ctx->pool, xbucket->txt); } dcache->ctx = ctx; rv = apr_reslist_create(&(dcache->connection_pool), 0 /* min */, 10 /* soft max */, 200 /* hard max */, 60*1000000 /*60 seconds, ttl*/, _couchbase_reslist_get_connection, /* resource constructor */ _couchbase_reslist_free_connection, /* resource destructor */ dcache, ctx->pool); if(rv != APR_SUCCESS) { ctx->set_error(ctx, 500, "failed to create couchbase connection pool"); return; } } /** * \private \memberof mapcache_cache_couchbase */ static void _mapcache_cache_couchbase_configuration_post_config(mapcache_context *ctx, mapcache_cache *cache, mapcache_cfg *cfg) { } /** * \brief creates and initializes a mapcache_couchbase_cache */ mapcache_cache* mapcache_cache_couchbase_create(mapcache_context *ctx) { mapcache_cache_couchbase *cache = apr_pcalloc(ctx->pool,sizeof(mapcache_cache_couchbase)); if(!cache) { ctx->set_error(ctx, 500, "failed to allocate couchbase cache"); return NULL; } cache->cache.metadata = apr_table_make(ctx->pool, 3); cache->cache.type = MAPCACHE_CACHE_COUCHBASE; cache->cache.tile_get = _mapcache_cache_couchbase_get; cache->cache.tile_exists = _mapcache_cache_couchbase_has_tile; cache->cache.tile_set = _mapcache_cache_couchbase_set; cache->cache.tile_delete = _mapcache_cache_couchbase_delete; cache->cache.configuration_parse_xml = _mapcache_cache_couchbase_configuration_parse_xml; cache->cache.configuration_post_config = _mapcache_cache_couchbase_configuration_post_config; cache->host = NULL; cache->username = NULL; cache->password = NULL; cache->bucket = NULL; return (mapcache_cache*)cache; } #else mapcache_cache* mapcache_cache_couchbase_create(mapcache_context *ctx) { ctx->set_error(ctx,400,"COUCHBASE support not compiled in this version"); return NULL; } #endif /* vim: ai ts=3 sts=3 et sw=3 */ mapcache-rel-1-6-1/lib/cache_disk.c000066400000000000000000000671761316353564100170550ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching: filesytem cache backend. * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #include #include #include #include #include #include #ifdef HAVE_SYMLINK #include #endif /**\class mapcache_cache_disk * \brief a mapcache_cache on a filesytem * \implements mapcache_cache */ typedef struct mapcache_cache_disk mapcache_cache_disk; struct mapcache_cache_disk { mapcache_cache cache; char *base_directory; char *filename_template; int symlink_blank; int creation_retry; /** * Set filename for a given tile * \memberof mapcache_cache_disk */ void (*tile_key)(mapcache_context *ctx, mapcache_cache_disk *cache, mapcache_tile *tile, char **path); }; /** * \brief computes the relative path between two destinations * * \param tilename the absolute filename of the tile * \param blankname the absolute path of the blank tile image */ char* relative_path(mapcache_context *ctx, char* tilename, char* blankname) { int updir_cnt = 0; char *blank_rel = ""; /* work up the directory paths of the tile and blank filename to find the common root */ char *tile_it = tilename, *blank_it = blankname; if(*tile_it != *blank_it) { /* the two files have no common root. * This really shouldn't happen on a unix FS hierarchy, and symbolic linking * is enabled only on these platforms, so this case should in practice never * happen. * we return the absolute path, and should probably set a warning message */ return apr_pstrdup(ctx->pool, blankname); } while(*(tile_it+1) && *(blank_it+1) && *(tile_it+1) == *(blank_it+1)) { tile_it++; blank_it++; } /* tile_it and blank_it point on the last common character of the two filenames, which should be a '/'. If not, return the full blank name * (and set a warning message? )*/ if(*tile_it != *blank_it || *tile_it != '/') { return apr_pstrdup(ctx->pool, blankname); } blank_it++; while(*tile_it == '/') tile_it++; /*skip leading '/'s*/ /* blank_it now contains the path that must be appended after the relative part of the constructed path,e.g.: - tilename = "/basepath/tilesetname/gridname/03/000/05/08.png" - blankname = "/basepath/tilesetname/gridname/blanks/005599FF.png" then - tile_it is "03/000/05/08.png" - blank_it is "blanks/005599FF.png" */ /* we now count the number of '/' in the remaining tilename */ while(*tile_it) { if(*tile_it == '/') { updir_cnt++; /* also skip consecutive '/'s */ while(*(tile_it+1)=='/') tile_it++; } tile_it ++; } while(updir_cnt--) { blank_rel = apr_pstrcat(ctx->pool, blank_rel, "../", NULL); } blank_rel = apr_pstrcat(ctx->pool,blank_rel,blank_it,NULL); return blank_rel; } /** * \brief returns base path for given tile * * \param tile the tile to get base path from * \param path pointer to a char* that will contain the filename * \private \memberof mapcache_cache_disk */ static void _mapcache_cache_disk_base_tile_key(mapcache_context *ctx, mapcache_cache_disk *cache, mapcache_tile *tile, char **path) { *path = apr_pstrcat(ctx->pool, cache->base_directory,"/", tile->tileset->name,"/", tile->grid_link->grid->name, NULL); if(tile->dimensions) { int i = tile->dimensions->nelts; while(i--) { mapcache_requested_dimension *entry = APR_ARRAY_IDX(tile->dimensions,i,mapcache_requested_dimension*); char *dimval; if(!entry->cached_value) { ctx->set_error(ctx,500,"BUG: dimension (%s) not set",entry->dimension->name); return; } dimval = mapcache_util_str_sanitize(ctx->pool,entry->cached_value,"/.",'#'); *path = apr_pstrcat(ctx->pool,*path,"/",dimval,NULL); } } } static void _mapcache_cache_disk_blank_tile_key(mapcache_context *ctx, mapcache_cache_disk *cache, mapcache_tile *tile, unsigned char *color, char **path) { /* not implemented for template caches, as symlink_blank will never be set */ *path = apr_psprintf(ctx->pool,"%s/%s/%s/blanks/%02X%02X%02X%02X.%s", cache->base_directory, tile->tileset->name, tile->grid_link->grid->name, color[0], color[1], color[2], color[3], tile->tileset->format?tile->tileset->format->extension:"png"); if(!*path) { ctx->set_error(ctx,500, "failed to allocate blank tile key"); } } /** * \brief return filename for given tile * * \param tile the tile to get the key from * \param path pointer to a char* that will contain the filename * \param r * \private \memberof mapcache_cache_disk */ static void _mapcache_cache_disk_tilecache_tile_key(mapcache_context *ctx, mapcache_cache_disk *cache, mapcache_tile *tile, char **path) { if(cache->base_directory) { char *start; _mapcache_cache_disk_base_tile_key(ctx, cache, tile, &start); *path = apr_psprintf(ctx->pool,"%s/%02d/%03d/%03d/%03d/%03d/%03d/%03d.%s", start, tile->z, tile->x / 1000000, (tile->x / 1000) % 1000, tile->x % 1000, tile->y / 1000000, (tile->y / 1000) % 1000, tile->y % 1000, tile->tileset->format?tile->tileset->format->extension:"png"); } else { *path = cache->filename_template; *path = mapcache_util_str_replace(ctx->pool,*path, "{tileset}", tile->tileset->name); *path = mapcache_util_str_replace(ctx->pool,*path, "{grid}", tile->grid_link->grid->name); *path = mapcache_util_str_replace(ctx->pool,*path, "{ext}", tile->tileset->format?tile->tileset->format->extension:"png"); if(strstr(*path,"{x}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{x}", apr_psprintf(ctx->pool,"%d",tile->x)); else *path = mapcache_util_str_replace(ctx->pool,*path, "{inv_x}", apr_psprintf(ctx->pool,"%d", tile->grid_link->grid->levels[tile->z]->maxx - tile->x - 1)); if(strstr(*path,"{y}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{y}", apr_psprintf(ctx->pool,"%d",tile->y)); else *path = mapcache_util_str_replace(ctx->pool,*path, "{inv_y}", apr_psprintf(ctx->pool,"%d", tile->grid_link->grid->levels[tile->z]->maxy - tile->y - 1)); if(strstr(*path,"{z}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{z}", apr_psprintf(ctx->pool,"%d",tile->z)); else *path = mapcache_util_str_replace(ctx->pool,*path, "{inv_z}", apr_psprintf(ctx->pool,"%d", tile->grid_link->grid->nlevels - tile->z - 1)); if(tile->dimensions && strstr(*path,"{dim")) { char *dimstring=""; int i = tile->dimensions->nelts; while(i--) { mapcache_requested_dimension *entry = APR_ARRAY_IDX(tile->dimensions,i, mapcache_requested_dimension*); char *dimval; char *single_dim; char *iter; if(!entry->cached_value) { ctx->set_error(ctx,500,"BUG: dimension (%s) not set",entry->dimension->name); return; } dimval = apr_pstrdup(ctx->pool,entry->cached_value); iter = dimval; while(*iter) { /* replace dangerous characters by '#' */ if(*iter == '.' || *iter == '/') { *iter = '#'; } iter++; } dimstring = apr_pstrcat(ctx->pool,dimstring,"#",entry->dimension->name,"#",dimval,NULL); single_dim = apr_pstrcat(ctx->pool,"{dim:",entry->dimension->name,"}",NULL); if(strstr(*path,single_dim)) { *path = mapcache_util_str_replace(ctx->pool,*path, single_dim, dimval); } } *path = mapcache_util_str_replace(ctx->pool,*path, "{dim}", dimstring); } } if(!*path) { ctx->set_error(ctx,500, "failed to allocate tile key"); } } static void _mapcache_cache_disk_template_tile_key(mapcache_context *ctx, mapcache_cache_disk *cache, mapcache_tile *tile, char **path) { *path = cache->filename_template; *path = mapcache_util_str_replace(ctx->pool,*path, "{tileset}", tile->tileset->name); *path = mapcache_util_str_replace(ctx->pool,*path, "{grid}", tile->grid_link->grid->name); *path = mapcache_util_str_replace(ctx->pool,*path, "{ext}", tile->tileset->format?tile->tileset->format->extension:"png"); if(strstr(*path,"{x}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{x}", apr_psprintf(ctx->pool,"%d",tile->x)); else *path = mapcache_util_str_replace(ctx->pool,*path, "{inv_x}", apr_psprintf(ctx->pool,"%d", tile->grid_link->grid->levels[tile->z]->maxx - tile->x - 1)); if(strstr(*path,"{y}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{y}", apr_psprintf(ctx->pool,"%d",tile->y)); else *path = mapcache_util_str_replace(ctx->pool,*path, "{inv_y}", apr_psprintf(ctx->pool,"%d", tile->grid_link->grid->levels[tile->z]->maxy - tile->y - 1)); if(strstr(*path,"{z}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{z}", apr_psprintf(ctx->pool,"%d",tile->z)); else *path = mapcache_util_str_replace(ctx->pool,*path, "{inv_z}", apr_psprintf(ctx->pool,"%d", tile->grid_link->grid->nlevels - tile->z - 1)); if(tile->dimensions && strstr(*path,"{dim")) { char *dimstring=""; int i = tile->dimensions->nelts; while(i--) { mapcache_requested_dimension *entry = APR_ARRAY_IDX(tile->dimensions,i, mapcache_requested_dimension*); char *dimval; char *single_dim; char *iter; if(!entry->cached_value) { ctx->set_error(ctx,500,"BUG: dimension (%s) not set",entry->dimension->name); return; } dimval = apr_pstrdup(ctx->pool,entry->cached_value); iter = dimval; while(*iter) { /* replace dangerous characters by '#' */ if(*iter == '.' || *iter == '/') { *iter = '#'; } iter++; } dimstring = apr_pstrcat(ctx->pool,dimstring,"#",entry->dimension->name,"#",dimval,NULL); single_dim = apr_pstrcat(ctx->pool,"{dim:",entry->dimension->name,"}",NULL); if(strstr(*path,single_dim)) { *path = mapcache_util_str_replace(ctx->pool,*path, single_dim, dimval); } } *path = mapcache_util_str_replace(ctx->pool,*path, "{dim}", dimstring); } if(!*path) { ctx->set_error(ctx,500, "failed to allocate tile key"); } } static void _mapcache_cache_disk_arcgis_tile_key(mapcache_context *ctx, mapcache_cache_disk *cache, mapcache_tile *tile, char **path) { if(cache->base_directory) { char *start; _mapcache_cache_disk_base_tile_key(ctx, cache, tile, &start); *path = apr_psprintf(ctx->pool,"%s/L%02d/R%08x/C%08x.%s" , start, tile->z, tile->y, tile->x, tile->tileset->format?tile->tileset->format->extension:"png"); } if(!*path) { ctx->set_error(ctx,500, "failed to allocate tile key"); } } static void _mapcache_cache_disk_worldwind_tile_key(mapcache_context *ctx, mapcache_cache_disk *cache, mapcache_tile *tile, char **path) { if(cache->base_directory) { *path = apr_psprintf(ctx->pool,"%s/%d/%04d/%04d_%04d.%s" , cache->base_directory, tile->z, tile->y, tile->y, tile->x, tile->tileset->format?tile->tileset->format->extension:"png"); } if(!*path) { ctx->set_error(ctx,500, "failed to allocate tile key"); } } static int _mapcache_cache_disk_has_tile(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { char *filename; apr_finfo_t finfo; int rv; mapcache_cache_disk *cache = (mapcache_cache_disk*)pcache; cache->tile_key(ctx, cache, tile, &filename); if(GC_HAS_ERROR(ctx)) { return MAPCACHE_FALSE; } rv = apr_stat(&finfo,filename,0,ctx->pool); if(rv != APR_SUCCESS) { return MAPCACHE_FALSE; } else { return MAPCACHE_TRUE; } } static void _mapcache_cache_disk_delete(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { apr_status_t ret; char errmsg[120]; char *filename; mapcache_cache_disk *cache = (mapcache_cache_disk*)pcache; cache->tile_key(ctx, cache, tile, &filename); GC_CHECK_ERROR(ctx); ret = apr_file_remove(filename,ctx->pool); if(ret != APR_SUCCESS && !APR_STATUS_IS_ENOENT(ret)) { ctx->set_error(ctx, 500, "failed to remove file %s: %s",filename, apr_strerror(ret,errmsg,120)); } } /** * \brief get file content of given tile * * fills the mapcache_tile::data of the given tile with content stored in the file * \private \memberof mapcache_cache_disk * \sa mapcache_cache::tile_get() */ static int _mapcache_cache_disk_get(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { char *filename; apr_file_t *f; apr_finfo_t finfo; apr_status_t rv; apr_size_t size; apr_mmap_t *tilemmap; mapcache_cache_disk *cache = (mapcache_cache_disk*)pcache; cache->tile_key(ctx, cache, tile, &filename); if(GC_HAS_ERROR(ctx)) { return MAPCACHE_FAILURE; } ctx->log(ctx,MAPCACHE_DEBUG,"checking for tile %s",filename); if((rv=apr_file_open(&f, filename, #ifndef NOMMAP APR_FOPEN_READ, APR_UREAD | APR_GREAD, #else APR_FOPEN_READ|APR_FOPEN_BUFFERED|APR_FOPEN_BINARY,APR_OS_DEFAULT, #endif ctx->pool)) == APR_SUCCESS) { rv = apr_file_info_get(&finfo, APR_FINFO_SIZE|APR_FINFO_MTIME, f); if(!finfo.size) { ctx->log(ctx, MAPCACHE_WARN, "tile %s has 0 length data",filename); return MAPCACHE_CACHE_MISS; } size = finfo.size; /* * at this stage, we have a handle to an open file that contains data. * idealy, we should aquire a read lock, in case the data contained inside the file * is incomplete (i.e. if another process is currently writing to the tile). * currently such a lock is not set, as we don't want to loose performance on tile accesses. * any error that might happen at this stage should only occur if the tile isn't already cached, * i.e. normally only once. */ tile->mtime = finfo.mtime; #ifndef NOMMAP tile->encoded_data = mapcache_buffer_create(0,ctx->pool); rv = apr_mmap_create(&tilemmap,f,0,finfo.size,APR_MMAP_READ,ctx->pool); if(rv != APR_SUCCESS) { char errmsg[120]; ctx->set_error(ctx, 500, "mmap error: %s",apr_strerror(rv,errmsg,120)); return MAPCACHE_FAILURE; } tile->encoded_data->buf = tilemmap->mm; tile->encoded_data->size = tile->encoded_data->avail = finfo.size; #else tile->encoded_data = mapcache_buffer_create(size,ctx->pool); //manually add the data to our buffer apr_file_read(f,(void*)tile->encoded_data->buf,&size); tile->encoded_data->size = size; tile->encoded_data->avail = size; #endif apr_file_close(f); if(tile->encoded_data->size != finfo.size) { ctx->set_error(ctx, 500, "failed to copy image data, got %d of %d bytes",(int)size, (int)finfo.size); return MAPCACHE_FAILURE; } return MAPCACHE_SUCCESS; } else { if(APR_STATUS_IS_ENOENT(rv)) { /* the file doesn't exist on the disk */ return MAPCACHE_CACHE_MISS; } else { char *error = strerror(rv); ctx->set_error(ctx, 500, "failed to open file %s: %s",filename, error); return MAPCACHE_FAILURE; } } } /** * \brief write tile data to disk * * writes the content of mapcache_tile::data to disk. * \returns MAPCACHE_FAILURE if there is no data to write, or if the tile isn't locked * \returns MAPCACHE_SUCCESS if the tile has been successfully written to disk * \private \memberof mapcache_cache_disk * \sa mapcache_cache::tile_set() */ static void _mapcache_cache_disk_set(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { apr_size_t bytes; apr_file_t *f; apr_status_t ret; char errmsg[120]; char *filename; mapcache_cache_disk *cache = (mapcache_cache_disk*)pcache; const int creation_retry = cache->creation_retry; int retry_count_create_file = 0; #ifdef DEBUG /* all this should be checked at a higher level */ if(!tile->encoded_data && !tile->raw_image) { ctx->set_error(ctx,500,"attempting to write empty tile to disk"); return; } if(!tile->encoded_data && !tile->tileset->format) { ctx->set_error(ctx,500,"received a raw tile image for a tileset with no format"); return; } #endif cache->tile_key(ctx, cache, tile, &filename); GC_CHECK_ERROR(ctx); mapcache_make_parent_dirs(ctx,filename); GC_CHECK_ERROR(ctx); ret = apr_file_remove(filename,ctx->pool); if(ret != APR_SUCCESS && !APR_STATUS_IS_ENOENT(ret)) { ctx->set_error(ctx, 500, "failed to remove file %s: %s",filename, apr_strerror(ret,errmsg,120)); } #ifdef HAVE_SYMLINK if(cache->symlink_blank) { if(!tile->raw_image) { tile->raw_image = mapcache_imageio_decode(ctx, tile->encoded_data); GC_CHECK_ERROR(ctx); } if(mapcache_image_blank_color(tile->raw_image) != MAPCACHE_FALSE) { char *blankname; int retry_count_create_symlink = 0; char *blankname_rel = NULL; _mapcache_cache_disk_blank_tile_key(ctx,cache,tile,tile->raw_image->data,&blankname); if(apr_file_open(&f, blankname, APR_FOPEN_READ, APR_OS_DEFAULT, ctx->pool) != APR_SUCCESS) { /* create the blank file */ int isLocked; void *lock; if(!tile->encoded_data) { tile->encoded_data = tile->tileset->format->write(ctx, tile->raw_image, tile->tileset->format); GC_CHECK_ERROR(ctx); } mapcache_make_parent_dirs(ctx,blankname); GC_CHECK_ERROR(ctx); /* aquire a lock on the blank file */ isLocked = mapcache_lock_or_wait_for_resource(ctx,ctx->config->locker,blankname, &lock); if(isLocked == MAPCACHE_TRUE) { if((ret = apr_file_open(&f, blankname, APR_FOPEN_CREATE|APR_FOPEN_WRITE|APR_FOPEN_BUFFERED|APR_FOPEN_BINARY, APR_OS_DEFAULT, ctx->pool)) != APR_SUCCESS) { ctx->set_error(ctx, 500, "failed to create file %s: %s",blankname, apr_strerror(ret,errmsg,120)); mapcache_unlock_resource(ctx,ctx->config->locker, lock); return; /* we could not create the file */ } bytes = (apr_size_t)tile->encoded_data->size; ret = apr_file_write(f,(void*)tile->encoded_data->buf,&bytes); if(ret != APR_SUCCESS) { ctx->set_error(ctx, 500, "failed to write data to file %s (wrote %d of %d bytes): %s",blankname, (int)bytes, (int)tile->encoded_data->size, apr_strerror(ret,errmsg,120)); mapcache_unlock_resource(ctx,ctx->config->locker, lock); return; /* we could not create the file */ } if(bytes != tile->encoded_data->size) { ctx->set_error(ctx, 500, "failed to write image data to %s, wrote %d of %d bytes", blankname, (int)bytes, (int)tile->encoded_data->size); mapcache_unlock_resource(ctx,ctx->config->locker, lock); return; } apr_file_close(f); mapcache_unlock_resource(ctx,ctx->config->locker, lock); #ifdef DEBUG ctx->log(ctx,MAPCACHE_DEBUG,"created blank tile %s",blankname); #endif } } else { apr_file_close(f); } /* * compute the relative path between tile and blank tile */ blankname_rel = relative_path(ctx,filename, blankname); GC_CHECK_ERROR(ctx); /* * depending on configuration symlink creation will retry if it fails. * this can happen on nfs mounted network storage. * the solution is to create the containing directory again and retry the symlink creation. */ while(symlink(blankname_rel, filename) != 0) { retry_count_create_symlink++; if(retry_count_create_symlink > creation_retry) { char *error = strerror(errno); ctx->set_error(ctx, 500, "failed to link tile %s to %s: %s",filename, blankname_rel, error); return; /* we could not create the file */ } mapcache_make_parent_dirs(ctx,filename); GC_CHECK_ERROR(ctx); } #ifdef DEBUG ctx->log(ctx, MAPCACHE_DEBUG, "linked blank tile %s to %s",filename,blankname); #endif return; } } #endif /*HAVE_SYMLINK*/ /* go the normal way: either we haven't configured blank tile detection, or the tile was not blank */ if(!tile->encoded_data) { tile->encoded_data = tile->tileset->format->write(ctx, tile->raw_image, tile->tileset->format); GC_CHECK_ERROR(ctx); } bytes = (apr_size_t)tile->encoded_data->size; if(bytes == 0) { ctx->set_error(ctx, 500, "attempting to write 0 length tile to %s",filename); return; /* we could not create the file */ } /* * depending on configuration file creation will retry if it fails. * this can happen on nfs mounted network storage. * the solution is to create the containing directory again and retry the file creation. */ while((ret = apr_file_open(&f, filename, APR_FOPEN_CREATE|APR_FOPEN_WRITE|APR_FOPEN_BUFFERED|APR_FOPEN_BINARY, APR_OS_DEFAULT, ctx->pool)) != APR_SUCCESS) { retry_count_create_file++; if(retry_count_create_file > creation_retry) { ctx->set_error(ctx, 500, "failed to create file %s: %s",filename, apr_strerror(ret,errmsg,120)); return; /* we could not create the file */ } mapcache_make_parent_dirs(ctx,filename); GC_CHECK_ERROR(ctx); } ret = apr_file_write(f,(void*)tile->encoded_data->buf,&bytes); if(ret != APR_SUCCESS) { ctx->set_error(ctx, 500, "failed to write data to file %s (wrote %d of %d bytes): %s",filename, (int)bytes, (int)tile->encoded_data->size, apr_strerror(ret,errmsg,120)); return; /* we could not create the file */ } ret = apr_file_close(f); if(ret != APR_SUCCESS) { ctx->set_error(ctx, 500, "failed to close file %s:%s",filename, apr_strerror(ret,errmsg,120)); } if(bytes != tile->encoded_data->size) { ctx->set_error(ctx, 500, "failed to write image data to %s, wrote %d of %d bytes", filename, (int)bytes, (int)tile->encoded_data->size); apr_file_remove(filename, ctx->pool); } } /** * \private \memberof mapcache_cache_disk */ static void _mapcache_cache_disk_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_cache *cache, mapcache_cfg *config) { ezxml_t cur_node; mapcache_cache_disk *dcache = (mapcache_cache_disk*)cache; char *layout = NULL; int template_layout = MAPCACHE_FALSE; layout = (char*)ezxml_attr(node,"layout"); if (!layout || !strlen(layout) || !strcmp(layout,"tilecache")) { dcache->tile_key = _mapcache_cache_disk_tilecache_tile_key; } else if(!strcmp(layout,"arcgis")) { dcache->tile_key = _mapcache_cache_disk_arcgis_tile_key; } else if(!strcmp(layout,"worldwind")) { dcache->tile_key = _mapcache_cache_disk_worldwind_tile_key; } else if (!strcmp(layout,"template")) { dcache->tile_key = _mapcache_cache_disk_template_tile_key; template_layout = MAPCACHE_TRUE; if ((cur_node = ezxml_child(node,"template")) != NULL) { dcache->filename_template = apr_pstrdup(ctx->pool,cur_node->txt); } else { ctx->set_error(ctx, 400, "no template specified for cache \"%s\"", cache->name); return; } } else { ctx->set_error(ctx, 400, "unknown layout type %s for cache \"%s\"", layout, cache->name); return; } if (!template_layout && (cur_node = ezxml_child(node,"base")) != NULL) { dcache->base_directory = apr_pstrdup(ctx->pool,cur_node->txt); } if (!template_layout && (cur_node = ezxml_child(node,"symlink_blank")) != NULL) { if(strcasecmp(cur_node->txt,"false")) { #ifdef HAVE_SYMLINK dcache->symlink_blank=1; #else ctx->set_error(ctx,400,"cache %s: host system does not support file symbolic linking",cache->name); return; #endif } } if ((cur_node = ezxml_child(node,"creation_retry")) != NULL) { dcache->creation_retry = atoi(cur_node->txt); } } /** * \private \memberof mapcache_cache_disk */ static void _mapcache_cache_disk_configuration_post_config(mapcache_context *ctx, mapcache_cache *cache, mapcache_cfg *cfg) { mapcache_cache_disk *dcache = (mapcache_cache_disk*)cache; /* check all required parameters are configured */ if((!dcache->base_directory || !strlen(dcache->base_directory)) && (!dcache->filename_template || !strlen(dcache->filename_template))) { ctx->set_error(ctx, 400, "disk cache %s has no base directory or template",dcache->cache.name); return; } } /** * \brief creates and initializes a mapcache_disk_cache */ mapcache_cache* mapcache_cache_disk_create(mapcache_context *ctx) { mapcache_cache_disk *cache = apr_pcalloc(ctx->pool,sizeof(mapcache_cache_disk)); if(!cache) { ctx->set_error(ctx, 500, "failed to allocate disk cache"); return NULL; } cache->symlink_blank = 0; cache->creation_retry = 0; cache->cache.metadata = apr_table_make(ctx->pool,3); cache->cache.type = MAPCACHE_CACHE_DISK; cache->cache._tile_delete = _mapcache_cache_disk_delete; cache->cache._tile_get = _mapcache_cache_disk_get; cache->cache._tile_exists = _mapcache_cache_disk_has_tile; cache->cache._tile_set = _mapcache_cache_disk_set; cache->cache.configuration_post_config = _mapcache_cache_disk_configuration_post_config; cache->cache.configuration_parse_xml = _mapcache_cache_disk_configuration_parse_xml; return (mapcache_cache*)cache; } /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/cache_fallback.c000066400000000000000000000202531316353564100176430ustar00rootroot00000000000000/****************************************************************************** * * Project: MapServer * Purpose: MapCache tile caching: fallback cache backend. * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 fallbackriction, 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" typedef struct mapcache_cache_fallback mapcache_cache_fallback; struct mapcache_cache_fallback { mapcache_cache cache; apr_array_header_t *caches; }; static int _mapcache_cache_fallback_tile_exists(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_fallback *cache = (mapcache_cache_fallback*)pcache; mapcache_cache *subcache = APR_ARRAY_IDX(cache->caches,0,mapcache_cache*); return mapcache_cache_tile_exists(ctx, subcache, tile); } static void _mapcache_cache_fallback_tile_delete(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_fallback *cache = (mapcache_cache_fallback*)pcache; int i; for(i=0; icaches->nelts; i++) { mapcache_cache *subcache = APR_ARRAY_IDX(cache->caches,i,mapcache_cache*); mapcache_cache_tile_delete(ctx, subcache, tile); ctx->clear_errors(ctx); /* ignore errors */ } } /** * \brief get content of given tile * * fills the mapcache_tile::data of the given tile with content stored on the fallback server * \private \memberof mapcache_cache_fallback * \sa mapcache_cache::tile_get() */ static int _mapcache_cache_fallback_tile_get(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_fallback *cache = (mapcache_cache_fallback*)pcache; mapcache_cache *subcache; int i,ret; subcache = APR_ARRAY_IDX(cache->caches,0,mapcache_cache*); ret = mapcache_cache_tile_get(ctx, subcache, tile); if(ret == MAPCACHE_FAILURE) { int first_error = ctx->get_error(ctx); char *first_error_message = ctx->get_error_message(ctx); ctx->log(ctx,MAPCACHE_DEBUG,"failed \"GET\" on primary cache \"%s\" for tile (z=%d,x=%d,y=%d) of tileset \"%s\". Falling back on secondary caches", APR_ARRAY_IDX(cache->caches,0,mapcache_cache*)->name,tile->z,tile->x,tile->y,tile->tileset->name); ctx->clear_errors(ctx); for(i=1; icaches->nelts; i++) { subcache = APR_ARRAY_IDX(cache->caches,i,mapcache_cache*); if((ret = mapcache_cache_tile_get(ctx, subcache, tile)) == MAPCACHE_FAILURE) { ctx->log(ctx,MAPCACHE_DEBUG,"failed \"GET\" on fallback cache \"%s\" for tile (z=%d,x=%d,y=%d) of tileset \"%s\". Continuing with other fallback caches if available", APR_ARRAY_IDX(cache->caches,0,mapcache_cache*)->name,tile->z,tile->x,tile->y,tile->tileset->name); ctx->clear_errors(ctx); continue; } else { return ret; } } /* all backends failed, return primary error message */ ctx->set_error(ctx,first_error,first_error_message); return MAPCACHE_FAILURE; } else { /* success or notfound */ return ret; } } static void _mapcache_cache_fallback_tile_set(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_fallback *cache = (mapcache_cache_fallback*)pcache; int i,first_error=0; char *first_error_message; for(i=0; icaches->nelts; i++) { mapcache_cache *subcache = APR_ARRAY_IDX(cache->caches,i,mapcache_cache*); mapcache_cache_tile_set(ctx, subcache, tile); if(GC_HAS_ERROR(ctx)) { if(!first_error) { first_error = ctx->get_error(ctx); first_error_message = ctx->get_error_message(ctx); } ctx->log(ctx,MAPCACHE_DEBUG,"failed \"SET\" on subcache \"%s\" for tile (z=%d,x=%d,y=%d) of tileset \"%s\"", APR_ARRAY_IDX(cache->caches,i,mapcache_cache*)->name,tile->z,tile->x,tile->y,tile->tileset->name); ctx->clear_errors(ctx); } } if(first_error) { ctx->set_error(ctx,first_error,first_error_message); } } static void _mapcache_cache_fallback_tile_multi_set(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tiles, int ntiles) { mapcache_cache_fallback *cache = (mapcache_cache_fallback*)pcache; int i,first_error=0; char *first_error_message; for(i=0; icaches->nelts; i++) { mapcache_cache *subcache = APR_ARRAY_IDX(cache->caches,i,mapcache_cache*); mapcache_cache_tile_multi_set(ctx, subcache, tiles, ntiles); if(GC_HAS_ERROR(ctx)) { if(!first_error) { first_error = ctx->get_error(ctx); first_error_message = ctx->get_error_message(ctx); } ctx->log(ctx,MAPCACHE_DEBUG,"failed \"MULTISET\" on subcache \"%s\" for tile (z=%d,x=%d,y=%d) of tileset \"%s\"", APR_ARRAY_IDX(cache->caches,i,mapcache_cache*)->name,tiles[0].z,tiles[0].x,tiles[0].y,tiles[0].tileset->name); ctx->clear_errors(ctx); } } if(first_error) { ctx->set_error(ctx,first_error,first_error_message); } } /** * \private \memberof mapcache_cache_fallback */ static void _mapcache_cache_fallback_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_cache *pcache, mapcache_cfg *config) { ezxml_t cur_node; mapcache_cache_fallback *cache = (mapcache_cache_fallback*)pcache; cache->caches = apr_array_make(ctx->pool,3,sizeof(mapcache_cache*)); for(cur_node = ezxml_child(node,"cache"); cur_node; cur_node = cur_node->next) { mapcache_cache *refcache = mapcache_configuration_get_cache(config, cur_node->txt); if(!refcache) { ctx->set_error(ctx, 400, "fallback cache \"%s\" references cache \"%s\"," " but it is not configured (hint:referenced caches must be declared before this fallback cache in the xml file)", pcache->name, cur_node->txt); return; } APR_ARRAY_PUSH(cache->caches,mapcache_cache*) = refcache; } if(cache->caches->nelts == 0) { ctx->set_error(ctx,400,"fallback cache \"%s\" does not reference any child caches", pcache->name); } } /** * \private \memberof mapcache_cache_fallback */ static void _mapcache_cache_fallback_configuration_post_config(mapcache_context *ctx, mapcache_cache *cache, mapcache_cfg *cfg) { } /** * \brief creates and initializes a mapcache_cache_fallback */ mapcache_cache* mapcache_cache_fallback_create(mapcache_context *ctx) { mapcache_cache_fallback *cache = apr_pcalloc(ctx->pool,sizeof(mapcache_cache_fallback)); if(!cache) { ctx->set_error(ctx, 500, "failed to allocate fallback cache"); return NULL; } cache->cache.metadata = apr_table_make(ctx->pool,3); cache->cache.type = MAPCACHE_CACHE_COMPOSITE; cache->cache._tile_delete = _mapcache_cache_fallback_tile_delete; cache->cache._tile_get = _mapcache_cache_fallback_tile_get; cache->cache._tile_exists = _mapcache_cache_fallback_tile_exists; cache->cache._tile_set = _mapcache_cache_fallback_tile_set; cache->cache._tile_multi_set = _mapcache_cache_fallback_tile_multi_set; cache->cache.configuration_post_config = _mapcache_cache_fallback_configuration_post_config; cache->cache.configuration_parse_xml = _mapcache_cache_fallback_configuration_parse_xml; return (mapcache_cache*)cache; } mapcache-rel-1-6-1/lib/cache_memcache.c000066400000000000000000000323641316353564100176540ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching support file: memcache cache backend. * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #ifdef USE_MEMCACHE #include typedef struct mapcache_cache_memcache mapcache_cache_memcache; /**\class mapcache_cache_memcache * \brief a mapcache_cache on memcached servers * \implements mapcache_cache */ struct mapcache_cache_memcache_server { char* host; int port; }; struct mapcache_cache_memcache { mapcache_cache cache; int nservers; struct mapcache_cache_memcache_server *servers; int detect_blank; }; struct mapcache_memcache_conn_param { mapcache_cache_memcache *cache; }; struct mapcache_memcache_pooled_connection { apr_memcache_t *memcache; apr_pool_t *pool; }; void mapcache_memcache_connection_constructor(mapcache_context *ctx, void **conn_, void *params) { struct mapcache_memcache_conn_param *param = params; mapcache_cache_memcache *cache = param->cache; struct mapcache_memcache_pooled_connection *pc; int i; pc = calloc(1,sizeof(struct mapcache_memcache_pooled_connection)); apr_pool_create(&pc->pool,NULL); if(APR_SUCCESS != apr_memcache_create(pc->pool, cache->nservers, 0, &(pc->memcache))) { ctx->set_error(ctx,500,"cache %s: failed to create memcache backend", cache->cache.name); return; } for(i=0; icache->nservers; i++) { apr_memcache_server_t *server; if(APR_SUCCESS != apr_memcache_server_create(pc->pool,cache->servers[i].host,cache->servers[i].port,4,5,50,10000,&server)) { ctx->set_error(ctx,500,"cache %s: failed to create server %s:%d",cache->cache.name,cache->servers[i].host,cache->servers[i].port); return; } if(APR_SUCCESS != apr_memcache_add_server(pc->memcache,server)) { ctx->set_error(ctx,500,"cache %s: failed to add server %s:%d",cache->cache.name,cache->servers[i].host,cache->servers[i].port); return; } } *conn_ = pc; } void mapcache_memcache_connection_destructor(void *conn_) { struct mapcache_memcache_pooled_connection *pc = conn_; apr_pool_destroy(pc->pool); free(pc); } static mapcache_pooled_connection* _mapcache_memcache_get_conn(mapcache_context *ctx, mapcache_cache_memcache *cache, mapcache_tile *tile) { mapcache_pooled_connection *pc; struct mapcache_memcache_conn_param param; param.cache = cache; pc = mapcache_connection_pool_get_connection(ctx,cache->cache.name, mapcache_memcache_connection_constructor, mapcache_memcache_connection_destructor, ¶m); return pc; } static void _mapcache_memcache_release_conn(mapcache_context *ctx, mapcache_pooled_connection *con) { mapcache_connection_pool_release_connection(ctx, con); } static int _mapcache_cache_memcache_has_tile(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { char *key; char *tmpdata; int rv; size_t tmpdatasize; mapcache_cache_memcache *cache = (mapcache_cache_memcache*)pcache; mapcache_pooled_connection *pc; struct mapcache_memcache_pooled_connection *mpc; pc = _mapcache_memcache_get_conn(ctx,cache,tile); if(GC_HAS_ERROR(ctx)) return MAPCACHE_FALSE; mpc = pc->connection; key = mapcache_util_get_tile_key(ctx, tile, NULL, " \r\n\t\f\e\a\b","#"); if(GC_HAS_ERROR(ctx)) { rv = MAPCACHE_FALSE; goto cleanup; } rv = apr_memcache_getp(mpc->memcache,ctx->pool,key,&tmpdata,&tmpdatasize,NULL); if(rv != APR_SUCCESS) { rv = MAPCACHE_FALSE; goto cleanup; } if(tmpdatasize == 0) { rv = MAPCACHE_FALSE; goto cleanup; } rv = MAPCACHE_TRUE; cleanup: _mapcache_memcache_release_conn(ctx,pc); return rv; } static void _mapcache_cache_memcache_delete(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { char *key; int rv; char errmsg[120]; mapcache_cache_memcache *cache = (mapcache_cache_memcache*)pcache; mapcache_pooled_connection *pc; struct mapcache_memcache_pooled_connection *mpc; pc = _mapcache_memcache_get_conn(ctx,cache,tile); GC_CHECK_ERROR(ctx); mpc = pc->connection; key = mapcache_util_get_tile_key(ctx, tile,NULL," \r\n\t\f\e\a\b","#"); if(GC_HAS_ERROR(ctx)) goto cleanup; rv = apr_memcache_delete(mpc->memcache,key,0); if(rv != APR_SUCCESS && rv!= APR_NOTFOUND) { ctx->set_error(ctx,500,"memcache: failed to delete key %s: %s", key, apr_strerror(rv,errmsg,120)); goto cleanup; } cleanup: _mapcache_memcache_release_conn(ctx,pc); } /** * \brief get content of given tile * * fills the mapcache_tile::data of the given tile with content stored on the memcache server * \private \memberof mapcache_cache_memcache * \sa mapcache_cache::tile_get() */ static int _mapcache_cache_memcache_get(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { char *key; int rv; mapcache_cache_memcache *cache = (mapcache_cache_memcache*)pcache; mapcache_pooled_connection *pc; mapcache_buffer *encoded_data; struct mapcache_memcache_pooled_connection *mpc; pc = _mapcache_memcache_get_conn(ctx,cache,tile); if(GC_HAS_ERROR(ctx)) { return MAPCACHE_FAILURE; } mpc = pc->connection; key = mapcache_util_get_tile_key(ctx, tile,NULL," \r\n\t\f\e\a\b","#"); if(GC_HAS_ERROR(ctx)) { rv = MAPCACHE_FAILURE; goto cleanup; } encoded_data = mapcache_buffer_create(0,ctx->pool); rv = apr_memcache_getp(mpc->memcache,ctx->pool,key,(char**)&encoded_data->buf,&encoded_data->size,NULL); if(rv != APR_SUCCESS) { rv = MAPCACHE_CACHE_MISS; goto cleanup; } if(encoded_data->size == 0) { ctx->set_error(ctx,500,"memcache cache returned 0-length data for tile %d %d %d\n",tile->x,tile->y,tile->z); rv = MAPCACHE_FAILURE; goto cleanup; } /* extract the tile modification time from the end of the data returned */ memcpy( &tile->mtime, &(((char*)encoded_data->buf)[encoded_data->size-sizeof(apr_time_t)]), sizeof(apr_time_t)); ((char*)encoded_data->buf)[encoded_data->size-sizeof(apr_time_t)]='\0'; encoded_data->avail = encoded_data->size; encoded_data->size -= sizeof(apr_time_t); if(((char*)encoded_data->buf)[0] == '#' && encoded_data->size > 1) { tile->encoded_data = mapcache_empty_png_decode(ctx,tile->grid_link->grid->tile_sx, tile->grid_link->grid->tile_sy ,encoded_data->buf,&tile->nodata); } else { tile->encoded_data = encoded_data; } rv = MAPCACHE_SUCCESS; cleanup: _mapcache_memcache_release_conn(ctx,pc); return rv; } /** * \brief push tile data to memcached * * writes the content of mapcache_tile::data to the configured memcached instance(s) * \returns MAPCACHE_FAILURE if there is no data to write, or if the tile isn't locked * \returns MAPCACHE_SUCCESS if the tile has been successfully written * \private \memberof mapcache_cache_memcache * \sa mapcache_cache::tile_set() */ static void _mapcache_cache_memcache_set(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { char *key, *data; int rv; /* set no expiration if not configured */ int expires =0; apr_time_t now; mapcache_buffer *encoded_data = NULL; mapcache_cache_memcache *cache = (mapcache_cache_memcache*)pcache; mapcache_pooled_connection *pc; struct mapcache_memcache_pooled_connection *mpc; pc = _mapcache_memcache_get_conn(ctx,cache,tile); GC_CHECK_ERROR(ctx); mpc = pc->connection; key = mapcache_util_get_tile_key(ctx, tile,NULL," \r\n\t\f\e\a\b","#"); if(GC_HAS_ERROR(ctx)) goto cleanup; if(tile->tileset->auto_expire) expires = tile->tileset->auto_expire; if(cache->detect_blank) { if(!tile->raw_image) { tile->raw_image = mapcache_imageio_decode(ctx, tile->encoded_data); GC_CHECK_ERROR(ctx); } if(mapcache_image_blank_color(tile->raw_image) != MAPCACHE_FALSE) { encoded_data = mapcache_buffer_create(5,ctx->pool); ((char*)encoded_data->buf)[0] = '#'; memcpy(((char*)encoded_data->buf)+1,tile->raw_image->data,4); encoded_data->size = 5; } } if(!encoded_data) { if(!tile->encoded_data) { tile->encoded_data = tile->tileset->format->write(ctx, tile->raw_image, tile->tileset->format); if(GC_HAS_ERROR(ctx)) goto cleanup; } encoded_data = tile->encoded_data; } /* concatenate the current time to the end of the memcache data so we can extract it out * when we re-get the tile */ data = calloc(1,encoded_data->size+sizeof(apr_time_t)); now = apr_time_now(); apr_pool_cleanup_register(ctx->pool, data, (void*)free, apr_pool_cleanup_null); memcpy(data,encoded_data->buf,encoded_data->size); memcpy(&(data[encoded_data->size]),&now,sizeof(apr_time_t)); rv = apr_memcache_set(mpc->memcache,key,data,encoded_data->size+sizeof(apr_time_t),expires,0); if(rv != APR_SUCCESS) { ctx->set_error(ctx,500,"failed to store tile %d %d %d to memcache cache %s", tile->x,tile->y,tile->z,cache->cache.name); goto cleanup; } cleanup: _mapcache_memcache_release_conn(ctx,pc); } /** * \private \memberof mapcache_cache_memcache */ static void _mapcache_cache_memcache_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_cache *cache, mapcache_cfg *config) { ezxml_t cur_node; int i = 0; mapcache_cache_memcache *dcache = (mapcache_cache_memcache*)cache; for(cur_node = ezxml_child(node,"server"); cur_node; cur_node = cur_node->next) { dcache->nservers++; } if(!dcache->nservers) { ctx->set_error(ctx,400,"memcache cache %s has no s configured",cache->name); return; } dcache->servers = apr_pcalloc(ctx->pool, dcache->nservers * sizeof(struct mapcache_cache_memcache_server)); for(cur_node = ezxml_child(node,"server"); cur_node; cur_node = cur_node->next) { ezxml_t xhost = ezxml_child(cur_node,"host"); ezxml_t xport = ezxml_child(cur_node,"port"); if(!xhost || !xhost->txt || ! *xhost->txt) { ctx->set_error(ctx,400,"cache %s: with no ",cache->name); return; } else { dcache->servers[i].host = apr_pstrdup(ctx->pool,xhost->txt); } if(!xport || !xport->txt || ! *xport->txt) { ctx->set_error(ctx,400,"cache %s: with no ", cache->name); return; } else { char *endptr; int iport = (int)strtol(xport->txt,&endptr,10); if(*endptr != 0) { ctx->set_error(ctx,400,"failed to parse value %s for memcache cache %s", xport->txt,cache->name); return; } dcache->servers[i].port = iport; } i++; } dcache->detect_blank = 0; if ((cur_node = ezxml_child(node, "detect_blank")) != NULL) { if(!strcasecmp(cur_node->txt,"true")) { dcache->detect_blank = 1; } } } /** * \private \memberof mapcache_cache_memcache */ static void _mapcache_cache_memcache_configuration_post_config(mapcache_context *ctx, mapcache_cache *cache, mapcache_cfg *cfg) { mapcache_cache_memcache *dcache = (mapcache_cache_memcache*)cache; if(!dcache->nservers) { ctx->set_error(ctx,400,"cache %s has no servers configured",cache->name); } } /** * \brief creates and initializes a mapcache_memcache_cache */ mapcache_cache* mapcache_cache_memcache_create(mapcache_context *ctx) { mapcache_cache_memcache *cache = apr_pcalloc(ctx->pool,sizeof(mapcache_cache_memcache)); if(!cache) { ctx->set_error(ctx, 500, "failed to allocate memcache cache"); return NULL; } cache->cache.metadata = apr_table_make(ctx->pool,3); cache->cache.type = MAPCACHE_CACHE_MEMCACHE; cache->cache._tile_get = _mapcache_cache_memcache_get; cache->cache._tile_exists = _mapcache_cache_memcache_has_tile; cache->cache._tile_set = _mapcache_cache_memcache_set; cache->cache._tile_delete = _mapcache_cache_memcache_delete; cache->cache.configuration_post_config = _mapcache_cache_memcache_configuration_post_config; cache->cache.configuration_parse_xml = _mapcache_cache_memcache_configuration_parse_xml; return (mapcache_cache*)cache; } #else mapcache_cache* mapcache_cache_memcache_create(mapcache_context *ctx) { ctx->set_error(ctx,400,"MEMCACHE support not compiled in this version"); return NULL; } #endif /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/cache_multitier.c000066400000000000000000000160061316353564100201230ustar00rootroot00000000000000/****************************************************************************** * * Project: MapServer * Purpose: MapCache tile caching: multitier cache backend. * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 multitierriction, 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" typedef struct mapcache_cache_multitier mapcache_cache_multitier; struct mapcache_cache_multitier { mapcache_cache cache; apr_array_header_t *caches; }; static int _mapcache_cache_multitier_tile_exists(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_multitier *cache = (mapcache_cache_multitier*)pcache; int i; for(i=0; icaches->nelts; i++) { mapcache_cache *subcache = APR_ARRAY_IDX(cache->caches,i,mapcache_cache*); if(mapcache_cache_tile_exists(ctx, subcache, tile) == MAPCACHE_TRUE) { return MAPCACHE_TRUE; } } return MAPCACHE_FALSE; } static void _mapcache_cache_multitier_tile_delete(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_multitier *cache = (mapcache_cache_multitier*)pcache; int i; for(i=0; icaches->nelts; i++) { mapcache_cache *subcache = APR_ARRAY_IDX(cache->caches,i,mapcache_cache*); mapcache_cache_tile_delete(ctx, subcache, tile); ctx->clear_errors(ctx); /* ignore errors */ } } /** * \brief get content of given tile * * fills the mapcache_tile::data of the given tile with content stored on the multitier server * \private \memberof mapcache_cache_multitier * \sa mapcache_cache::tile_get() */ static int _mapcache_cache_multitier_tile_get(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_multitier *cache = (mapcache_cache_multitier*)pcache; mapcache_cache *subcache; int i,ret; subcache = APR_ARRAY_IDX(cache->caches,0,mapcache_cache*); ret = mapcache_cache_tile_get(ctx, subcache, tile); if(ret == MAPCACHE_CACHE_MISS) { for(i=1; icaches->nelts; i++) { subcache = APR_ARRAY_IDX(cache->caches,i,mapcache_cache*); if(mapcache_cache_tile_get(ctx, subcache, tile) == MAPCACHE_SUCCESS) { ctx->log(ctx,MAPCACHE_DEBUG,"got tile (%s,z=%d,y=%d,x=%d) from secondary cache (%s)",tile->tileset->name, tile->z, tile->y, tile->x, subcache->name); for(--i;i>=0;i--) { subcache = APR_ARRAY_IDX(cache->caches,i,mapcache_cache*); mapcache_cache_tile_set(ctx, subcache, tile); ctx->clear_errors(ctx); /* silently ignore these errors */ ctx->log(ctx,MAPCACHE_DEBUG,"transferring tile (%s,z=%d,y=%d,x=%d) to cache (%s)",tile->tileset->name, tile->z, tile->y, tile->x, subcache->name); } return MAPCACHE_SUCCESS; } } return MAPCACHE_CACHE_MISS; } else { //ctx->log(ctx,MAPCACHE_DEBUG,"got tile (%s,z=%d,y=%d,x=%d) from primary cache (%s)",tile->tileset->name, tile->z, tile->y, tile->x, subcache->name); return ret; } } static void _mapcache_cache_multitier_tile_set(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_multitier *cache = (mapcache_cache_multitier*)pcache; mapcache_cache *subcache = APR_ARRAY_IDX(cache->caches,cache->caches->nelts-1,mapcache_cache*); return mapcache_cache_tile_set(ctx, subcache, tile); } static void _mapcache_cache_multitier_tile_multi_set(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tiles, int ntiles) { mapcache_cache_multitier *cache = (mapcache_cache_multitier*)pcache; mapcache_cache *subcache = APR_ARRAY_IDX(cache->caches,cache->caches->nelts-1,mapcache_cache*); return mapcache_cache_tile_multi_set(ctx, subcache, tiles, ntiles); } /** * \private \memberof mapcache_cache_multitier */ static void _mapcache_cache_multitier_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_cache *pcache, mapcache_cfg *config) { ezxml_t cur_node; mapcache_cache_multitier *cache = (mapcache_cache_multitier*)pcache; cache->caches = apr_array_make(ctx->pool,3,sizeof(mapcache_cache*)); for(cur_node = ezxml_child(node,"cache"); cur_node; cur_node = cur_node->next) { mapcache_cache *refcache = mapcache_configuration_get_cache(config, cur_node->txt); if(!refcache) { ctx->set_error(ctx, 400, "multitier cache \"%s\" references cache \"%s\"," " but it is not configured (hint:referenced caches must be declared before this multitier cache in the xml file)", pcache->name, cur_node->txt); return; } APR_ARRAY_PUSH(cache->caches,mapcache_cache*) = refcache; } if(cache->caches->nelts == 0) { ctx->set_error(ctx,400,"multitier cache \"%s\" does not reference any child caches", pcache->name); } } /** * \private \memberof mapcache_cache_multitier */ static void _mapcache_cache_multitier_configuration_post_config(mapcache_context *ctx, mapcache_cache *cache, mapcache_cfg *cfg) { } /** * \brief creates and initializes a mapcache_cache_multitier */ mapcache_cache* mapcache_cache_multitier_create(mapcache_context *ctx) { mapcache_cache_multitier *cache = apr_pcalloc(ctx->pool,sizeof(mapcache_cache_multitier)); if(!cache) { ctx->set_error(ctx, 500, "failed to allocate multitier cache"); return NULL; } cache->cache.metadata = apr_table_make(ctx->pool,3); cache->cache.type = MAPCACHE_CACHE_COMPOSITE; cache->cache._tile_delete = _mapcache_cache_multitier_tile_delete; cache->cache._tile_get = _mapcache_cache_multitier_tile_get; cache->cache._tile_exists = _mapcache_cache_multitier_tile_exists; cache->cache._tile_set = _mapcache_cache_multitier_tile_set; cache->cache._tile_multi_set = _mapcache_cache_multitier_tile_multi_set; cache->cache.configuration_post_config = _mapcache_cache_multitier_configuration_post_config; cache->cache.configuration_parse_xml = _mapcache_cache_multitier_configuration_parse_xml; return (mapcache_cache*)cache; } mapcache-rel-1-6-1/lib/cache_rest.c000066400000000000000000001506001316353564100170610ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching: HTTP Rest cache backend. * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 2014 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #include #include #include #include #include #include #include #include #include typedef struct mapcache_cache_rest mapcache_cache_rest; typedef struct mapcache_cache_s3 mapcache_cache_s3; typedef struct mapcache_cache_azure mapcache_cache_azure; typedef struct mapcache_cache_google mapcache_cache_google; typedef enum { MAPCACHE_REST_METHOD_GET, MAPCACHE_REST_METHOD_HEAD, MAPCACHE_REST_METHOD_PUT, MAPCACHE_REST_METHOD_POST, MAPCACHE_REST_METHOD_DELETE } mapcache_rest_method; typedef enum { MAPCACHE_REST_PROVIDER_NONE, MAPCACHE_REST_PROVIDER_S3, MAPCACHE_REST_PROVIDER_AZURE, MAPCACHE_REST_PROVIDER_GOOGLE } mapcache_rest_provider; void sha256(const unsigned char *message, unsigned int len, unsigned char *digest); void hmac_sha256(const unsigned char *message, unsigned int message_len, const unsigned char *key, unsigned int key_size, unsigned char *mac, unsigned mac_size); void hmac_sha1(const char *message, unsigned int message_len, const unsigned char *key, unsigned int key_size, void *mac); void sha_hex_encode(unsigned char *sha, unsigned int sha_size); char *base64_encode(apr_pool_t *pool, const unsigned char *data, size_t input_length); typedef struct mapcache_rest_operation mapcache_rest_operation; struct mapcache_rest_operation { apr_table_t *headers; mapcache_rest_method method; char *tile_url; char *header_file; void (*add_headers)(mapcache_context *ctx, mapcache_cache_rest *pcache, mapcache_tile *tile, char *url, apr_table_t *headers); }; typedef struct mapcache_rest_configuration mapcache_rest_configuration; struct mapcache_rest_configuration { apr_table_t *common_headers; char *tile_url; char *header_file; mapcache_rest_operation has_tile; mapcache_rest_operation get_tile; mapcache_rest_operation set_tile; mapcache_rest_operation multi_set_tile; mapcache_rest_operation delete_tile; void (*add_headers)(mapcache_context *ctx, mapcache_cache_rest *pcache, mapcache_tile *tile, char *url, apr_table_t *headers); }; /**\class mapcache_cache_rest * \brief a mapcache_cache on a 3rd party HTTP Rest API * \implements mapcache_cache */ struct mapcache_cache_rest { mapcache_cache cache; mapcache_rest_configuration rest; int use_redirects; int timeout; int connection_timeout; int detect_blank; mapcache_rest_provider provider; }; struct mapcache_cache_s3 { mapcache_cache_rest cache; char *id; char *secret; char *region; char *credentials_file; }; struct mapcache_cache_azure { mapcache_cache_rest cache; char *id; char *secret; char *container; }; struct mapcache_cache_google { mapcache_cache_rest cache; char *access; char *secret; }; typedef struct { mapcache_buffer *buffer; size_t offset; } buffer_struct; struct rest_conn_params { mapcache_cache_rest *cache; }; void mapcache_rest_connection_constructor(mapcache_context *ctx, void **conn_, void *params) { CURL *curl_handle = curl_easy_init(); if(!curl_handle) { ctx->set_error(ctx,500,"failed to create curl handle"); *conn_ = NULL; return; } *conn_ = curl_handle; } void mapcache_rest_connection_destructor(void *conn_) { CURL *curl_handle = (CURL*) conn_; curl_easy_cleanup(curl_handle); } static mapcache_pooled_connection* _rest_get_connection(mapcache_context *ctx, mapcache_cache_rest *cache, mapcache_tile *tile) { mapcache_pooled_connection *pc; struct rest_conn_params params; params.cache = cache; pc = mapcache_connection_pool_get_connection(ctx,cache->cache.name,mapcache_rest_connection_constructor, mapcache_rest_connection_destructor, ¶ms); if(!GC_HAS_ERROR(ctx) && pc && pc->connection) { CURL *curl_handle = (CURL*)pc->connection; curl_easy_reset(curl_handle); curl_easy_setopt(curl_handle, CURLOPT_CONNECTTIMEOUT, cache->connection_timeout); curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, cache->timeout); } return pc; } static size_t buffer_read_callback(void *ptr, size_t size, size_t nmemb, void *stream) { buffer_struct *buffer = (buffer_struct*)stream; void *start = ((char*)(buffer->buffer->buf)) + buffer->offset; size_t bytes = MAPCACHE_MIN((buffer->buffer->size-buffer->offset),(size * nmemb)); if(bytes) { memcpy(ptr,start,bytes); buffer->offset += bytes; } return bytes; } size_t buffer_write_callback(void *ptr, size_t size, size_t nmemb, void *data) { mapcache_buffer *buffer = (mapcache_buffer*)data; size_t realsize = size * nmemb; return mapcache_buffer_append(buffer, realsize, ptr); } static void _set_headers(mapcache_context *ctx, CURL *curl, apr_table_t *headers) { if(!headers) { return; } else { struct curl_slist *curl_headers=NULL; const apr_array_header_t *array = apr_table_elts(headers); apr_table_entry_t *elts = (apr_table_entry_t *) array->elts; int i; for (i = 0; i < array->nelts; i++) { if(strlen(elts[i].val) > 0) { curl_headers = curl_slist_append(curl_headers, apr_pstrcat(ctx->pool,elts[i].key,": ",elts[i].val,NULL)); } else { curl_headers = curl_slist_append(curl_headers, apr_pstrcat(ctx->pool,elts[i].key,":",NULL)); } } curl_easy_setopt(curl, CURLOPT_HTTPHEADER, curl_headers); } } static void _put_request(mapcache_context *ctx, CURL *curl, mapcache_buffer *buffer, char *url, apr_table_t *headers) { CURLcode res; buffer_struct data; mapcache_buffer *response; data.buffer = buffer; data.offset = 0; response = mapcache_buffer_create(10,ctx->pool); #if LIBCURL_VERSION_NUM < 0x071700 /* * hack around a bug in curl <= 7.22 where the content-length is added * a second time even if ti was present in the manually set headers */ apr_table_unset(headers, "Content-Length"); #endif curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); /* we want to use our own read function */ curl_easy_setopt(curl, CURLOPT_READFUNCTION, buffer_read_callback); /* enable uploading */ curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); /* HTTP PUT please */ curl_easy_setopt(curl, CURLOPT_PUT, 1L); /* don't use an Expect: 100 Continue header */ apr_table_set(headers, "Expect", ""); _set_headers(ctx, curl, headers); /* specify target URL, and note that this URL should include a file * name, not only a directory */ curl_easy_setopt(curl, CURLOPT_URL, url); /* now specify which file to upload */ curl_easy_setopt(curl, CURLOPT_READDATA, &data); /* provide the size of the upload, we specicially typecast the value * to curl_off_t since we must be sure to use the correct data size */ curl_easy_setopt(curl, CURLOPT_INFILESIZE, buffer->size); /* send all data to this function */ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, buffer_write_callback); /* we pass our mapcache_buffer struct to the callback function */ curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)response); /* Now run off and do what you've been told! */ res = curl_easy_perform(curl); /* Check for errors */ if(res != CURLE_OK) { ctx->set_error(ctx, 500, "curl_easy_perform() failed in rest put: %s",curl_easy_strerror(res)); } else { long http_code; curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code); if(http_code != 200 && http_code != 201 && http_code != 204) { char *msg = response->buf; msg[response->size]=0; ctx->set_error(ctx, 500, "curl_easy_perform() failed in rest put with code %ld: %s", http_code, msg); } } } static int _head_request(mapcache_context *ctx, CURL *curl, char *url, apr_table_t *headers) { CURLcode res; long http_code; _set_headers(ctx, curl, headers); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); /* specify target URL, and note that this URL should include a file * name, not only a directory */ curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_NOBODY, 1); /* Now run off and do what you've been told! */ res = curl_easy_perform(curl); /* Check for errors */ if(res != CURLE_OK) { ctx->set_error(ctx, 500, "curl_easy_perform() failed in rest head %s",curl_easy_strerror(res)); http_code = 500; } else { curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code); } return (int)http_code; } static int _delete_request(mapcache_context *ctx, CURL *curl, char *url, apr_table_t *headers) { CURLcode res; long http_code; _set_headers(ctx, curl, headers); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); /* specify target URL, and note that this URL should include a file * name, not only a directory */ curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE"); curl_easy_setopt(curl, CURLOPT_NOBODY, 1); /* Now run off and do what you've been told! */ res = curl_easy_perform(curl); /* Check for errors */ if(res != CURLE_OK) { ctx->set_error(ctx, 500, "curl_easy_perform() failed in rest delete %s",curl_easy_strerror(res)); http_code = 500; } else { curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code); } return (int)http_code; } static mapcache_buffer* _get_request(mapcache_context *ctx, CURL *curl, char *url, apr_table_t *headers) { CURLcode res; mapcache_buffer *data = NULL; long http_code; _set_headers(ctx, curl, headers); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); data = mapcache_buffer_create(4000, ctx->pool); /* send all data to this function */ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, buffer_write_callback); /* we pass our mapcache_buffer struct to the callback function */ curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)data); /* specify target URL, and note that this URL should include a file * name, not only a directory */ curl_easy_setopt(curl, CURLOPT_URL, url); /* Now run off and do what you've been told! */ res = curl_easy_perform(curl); /* Check for errors */ if(res != CURLE_OK) { ctx->set_error(ctx, 500, "curl_easy_perform() failed in rest get: %s",curl_easy_strerror(res)); data = NULL; } else { curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code); /* handle special behavior of s3 */ if(http_code == 403) { char *msg = data->buf; while(msg && *msg) { if(!strncmp(msg,"NoSuchKey",strlen("NoSuchKey"))) { ctx->set_error(ctx, 500, "curl_easy_perform() failed in rest get with code %ld: %s", http_code, msg); http_code = 404; data = NULL; break; } msg++; } } if(http_code != 200 && http_code != 404) { char *msg = data->buf; msg[data->size]=0; ctx->set_error(ctx, 500, "curl_easy_perform() failed in rest get with code %ld: %s", http_code, msg); } if(http_code == 404) { data = NULL; /* not an error */ } } return data; } /** * @brief _mapcache_cache_rest_add_headers_from_file populate header table from entries found in file * @param ctx * @param file the file from which headers should be read * @param headers the output table which will be populated */ void _mapcache_cache_rest_add_headers_from_file(mapcache_context *ctx, char *file, apr_table_t *headers) { apr_status_t rv; apr_file_t *f; if((rv=apr_file_open(&f, file, APR_FOPEN_READ|APR_FOPEN_BUFFERED|APR_FOPEN_BINARY,APR_OS_DEFAULT, ctx->pool)) == APR_SUCCESS) { char line[8096]; while( (rv = apr_file_gets(line,8096,f))== APR_SUCCESS) { char *header_name=line, *header_val=line, *header_endval; int found_token = MAPCACHE_FALSE; /*search for header delimiter (:)*/ while(header_val && *header_val) { if(*header_val == ':') { *header_val = '\0'; found_token = MAPCACHE_TRUE; break; } header_val++; } if(!found_token) { /* malformed line, silently skip it */ continue; } header_val++; if(!*header_val) { /* malformed/empty line, skip it */ continue; } header_endval = header_val; while(*header_endval) { if(*header_endval == '\r' || *header_endval == '\n') { *header_endval = '\0'; break; } header_endval++; } if(!*header_val) { /* empty header value, skip it */ continue; } apr_table_set(headers, header_name, header_val); } apr_file_close(f); } else { ctx->set_error(ctx,500,"rest cache: failed to access header file"); } } apr_table_t* _mapcache_cache_rest_headers(mapcache_context *ctx, mapcache_tile *tile, mapcache_rest_configuration *config, mapcache_rest_operation *operation) { apr_table_t *ret = apr_table_make(ctx->pool,3); const apr_array_header_t *array; if(config->common_headers) { apr_table_entry_t *elts; int i; array = apr_table_elts(config->common_headers); elts = (apr_table_entry_t *) array->elts; for (i = 0; i < array->nelts; i++) { apr_table_set(ret, elts[i].key,elts[i].val); } } if(config->header_file) { _mapcache_cache_rest_add_headers_from_file(ctx,config->header_file,ret); if(GC_HAS_ERROR(ctx)) { return NULL; } } if(operation->headers) { apr_table_entry_t *elts; int i; array = apr_table_elts(operation->headers); elts = (apr_table_entry_t *) array->elts; for (i = 0; i < array->nelts; i++) { apr_table_set(ret, elts[i].key,elts[i].val); } } if(operation->header_file) { _mapcache_cache_rest_add_headers_from_file(ctx,operation->header_file,ret); if(GC_HAS_ERROR(ctx)) { return NULL; } } return ret; } /* Converts an integer value to its hex character*/ static char to_hex(char code) { static char hex[] = "0123456789ABCDEF"; return hex[code & 15]; } /* Returns a url-encoded version of str */ static char *url_encode(apr_pool_t *pool, char *str) { char *pstr = str, *buf = apr_pcalloc(pool, strlen(str) * 3 + 1), *pbuf = buf; while (*pstr) { if (isalnum(*pstr) || *pstr == '-' || *pstr == '_' || *pstr == '.' || *pstr == '~' || *pstr=='/') *pbuf++ = *pstr; else if (*pstr == ' ') *pbuf++ = '+'; else *pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15); pstr++; } *pbuf = '\0'; return buf; } /** * \brief return url for given tile given a template * * \param tile the tile to get the key from * \param template the template to build the url from * \param path pointer to a char* that will contain the url * \param r * \private \memberof mapcache_cache_rest */ static void _mapcache_cache_rest_tile_url(mapcache_context *ctx, mapcache_tile *tile, mapcache_rest_configuration *config, mapcache_rest_operation *operation, char **url) { char *slashptr,*path; int cnt=0; if(operation && operation->tile_url) { *url = apr_pstrdup(ctx->pool, operation->tile_url); } else { *url = apr_pstrdup(ctx->pool, config->tile_url); } *url = mapcache_util_str_replace(ctx->pool, *url, "{tileset}", tile->tileset->name); *url = mapcache_util_str_replace(ctx->pool, *url, "{grid}", tile->grid_link->grid->name); *url = mapcache_util_str_replace(ctx->pool, *url, "{ext}", tile->tileset->format?tile->tileset->format->extension:"png"); if(strstr(*url,"{x}")) *url = mapcache_util_str_replace(ctx->pool,*url, "{x}", apr_psprintf(ctx->pool,"%d",tile->x)); else *url = mapcache_util_str_replace(ctx->pool,*url, "{inv_x}", apr_psprintf(ctx->pool,"%d", tile->grid_link->grid->levels[tile->z]->maxx - tile->x - 1)); if(strstr(*url,"{y}")) *url = mapcache_util_str_replace(ctx->pool,*url, "{y}", apr_psprintf(ctx->pool,"%d",tile->y)); else *url = mapcache_util_str_replace(ctx->pool,*url, "{inv_y}", apr_psprintf(ctx->pool,"%d", tile->grid_link->grid->levels[tile->z]->maxy - tile->y - 1)); if(strstr(*url,"{z}")) *url = mapcache_util_str_replace(ctx->pool,*url, "{z}", apr_psprintf(ctx->pool,"%d",tile->z)); else *url = mapcache_util_str_replace(ctx->pool,*url, "{inv_z}", apr_psprintf(ctx->pool,"%d", tile->grid_link->grid->nlevels - tile->z - 1)); if(tile->dimensions) { int i; if(strstr(*url,"{dim")) { char *dimstring=""; i = tile->dimensions->nelts; while(i--) { char *single_dim; mapcache_requested_dimension *entry = APR_ARRAY_IDX(tile->dimensions,i,mapcache_requested_dimension*); if(!entry->cached_value) { ctx->set_error(ctx,500,"BUG: dimension (%s) not defined",entry->dimension->name); return; } dimstring = apr_pstrcat(ctx->pool,dimstring,"#",entry->dimension->name,"#",entry->cached_value,NULL); single_dim = apr_pstrcat(ctx->pool,"{dim:",entry->dimension->name,"}",NULL); if(strstr(*url,single_dim)) { *url = mapcache_util_str_replace(ctx->pool,*url, single_dim, entry->cached_value); } } *url = mapcache_util_str_replace(ctx->pool,*url, "{dim}", dimstring); } } /* url-encode everything after the host name */ /* find occurence of third "/" in url */ slashptr = *url; while(*slashptr) { if(*slashptr == '/') cnt++; if(cnt == 3) break; slashptr++; } if(!*slashptr) { ctx->set_error(ctx,500,"invalid rest url provided, expecting http(s)://server/path format"); return; } path=slashptr; path = url_encode(ctx->pool,path); *slashptr=0; *url = apr_pstrcat(ctx->pool,*url,path,NULL); /*ctx->log(ctx,MAPCACHE_DEBUG,"rest url: %s",*url);*/ } // Simple comparison function for comparing two HTTP header names that are // embedded within an HTTP header line, returning true if header1 comes // before header2 alphabetically, false if not static int headerle(const char *header1, const char *header2) { while (1) { if (*header1 == ':') { return (*header2 == ':'); } else if (*header2 == ':') { return 0; } else if (*header2 < *header1) { return 0; } else if (*header2 > *header1) { return 1; } header1++, header2++; } } // Replace this with merge sort eventually, it's the best stable sort. But // since typically the number of elements being sorted is small, it doesn't // matter that much which sort is used, and gnome sort is the world's simplest // stable sort. Added a slight twist to the standard gnome_sort - don't go // forward +1, go forward to the last highest index considered. This saves // all the string comparisons that would be done "going forward", and thus // only does the necessary string comparisons to move values back into their // sorted position. static void header_gnome_sort(char **headers, int size) { int i = 0, last_highest = 0; while (i < size) { if ((i == 0) || headerle(headers[i - 1], headers[i])) { i = ++last_highest; } else { char *tmp = headers[i]; headers[i] = headers[i - 1]; headers[--i] = tmp; } } } static const char* my_apr_table_get(apr_table_t *t, char *key) { const char *val = apr_table_get(t,key); if(!val) val = ""; return val; } static void _mapcache_cache_google_headers_add(mapcache_context *ctx, const char* method, mapcache_cache_rest *rcache, mapcache_tile *tile, char *url, apr_table_t *headers) { char *stringToSign, **aheaders, *resource = url, x_amz_date[64]; const char *head; const apr_array_header_t *ahead; apr_table_entry_t *elts; mapcache_cache_google *google; time_t now; struct tm *tnow; unsigned char sha[65]; char b64[150]; int i,nCanonicalHeaders=0,cnt=0; assert(rcache->provider == MAPCACHE_REST_PROVIDER_GOOGLE); google = (mapcache_cache_google*)rcache; now = time(NULL); tnow = gmtime(&now); sha[64]=0; strftime(x_amz_date, 64 , "%a, %d %b %Y %H:%M:%S GMT", tnow); apr_table_set(headers,"x-amz-date",x_amz_date); if(!strcmp(method,"PUT")) { assert(tile->encoded_data); apr_md5(sha,tile->encoded_data->buf,tile->encoded_data->size); apr_base64_encode(b64, (char*)sha, 16); apr_table_set(headers, "Content-MD5", b64); } head = my_apr_table_get(headers, "Content-MD5"); stringToSign=apr_pstrcat(ctx->pool, method, "\n", head, "\n", NULL); head = my_apr_table_get(headers, "Content-Type"); stringToSign=apr_pstrcat(ctx->pool, stringToSign, head, "\n", NULL); /* Date: header, left empty as we are using x-amz-date */ stringToSign=apr_pstrcat(ctx->pool, stringToSign, "\n", NULL); ahead = apr_table_elts(headers); aheaders = apr_pcalloc(ctx->pool, ahead->nelts * sizeof(char*)); elts = (apr_table_entry_t *) ahead->elts; for (i = 0; i < ahead->nelts; i++) { if(!strncmp(elts[i].key,"x-amz-",6)) { char *k = aheaders[nCanonicalHeaders] = apr_pstrdup(ctx->pool, elts[i].key); while(*k) { *k = tolower(*k); k++; } nCanonicalHeaders++; } } header_gnome_sort(aheaders, nCanonicalHeaders); for(i=0; ipool, stringToSign, aheaders[i],":",apr_table_get(headers,aheaders[i]),"\n",NULL); } /* find occurence of third "/" in url */ while(*resource) { if(*resource == '/') cnt++; if(cnt == 3) break; resource++; } if(!*resource) { ctx->set_error(ctx,500,"invalid google url provided"); return; } stringToSign = apr_pstrcat(ctx->pool, stringToSign, resource, NULL); hmac_sha1(stringToSign, strlen(stringToSign), (unsigned char*)google->secret, strlen(google->secret), sha); apr_base64_encode(b64, (char*)sha, 20); apr_table_set( headers, "Authorization", apr_pstrcat(ctx->pool,"AWS ", google->access, ":", b64, NULL)); } static void _mapcache_cache_azure_headers_add(mapcache_context *ctx, const char* method, mapcache_cache_rest *rcache, mapcache_tile *tile, char *url, apr_table_t *headers) { char *stringToSign, **aheaders, *canonical_headers="", *canonical_resource=NULL, *resource = url, x_ms_date[64]; const char *head; const apr_array_header_t *ahead; apr_table_entry_t *elts; mapcache_cache_azure *azure; time_t now; struct tm *tnow; unsigned char sha[65]; char *b64sign,*keyub64; int i,nCanonicalHeaders=0,cnt=0; assert(rcache->provider == MAPCACHE_REST_PROVIDER_AZURE); azure = (mapcache_cache_azure*)rcache; now = time(NULL); tnow = gmtime(&now); sha[64]=0; strftime(x_ms_date, sizeof(x_ms_date), "%a, %d %b %Y %H:%M:%S GMT", tnow); apr_table_set(headers,"x-ms-date",x_ms_date); apr_table_set(headers,"x-ms-version","2009-09-19"); apr_table_set(headers,"x-ms-blob-type","BlockBlob"); stringToSign = apr_pstrcat(ctx->pool, method, "\n", NULL); head = my_apr_table_get(headers, "Content-Encoding"); stringToSign=apr_pstrcat(ctx->pool, stringToSign, head, "\n", NULL); head = my_apr_table_get(headers, "Content-Language"); stringToSign=apr_pstrcat(ctx->pool, stringToSign, head, "\n", NULL); head = my_apr_table_get(headers, "Content-Length"); stringToSign=apr_pstrcat(ctx->pool, stringToSign, head, "\n", NULL); head = my_apr_table_get(headers, "Content-MD5"); stringToSign=apr_pstrcat(ctx->pool, stringToSign, head, "\n", NULL); head = my_apr_table_get(headers, "Content-Type"); stringToSign=apr_pstrcat(ctx->pool, stringToSign, head, "\n", NULL); head = my_apr_table_get(headers, "Date"); stringToSign=apr_pstrcat(ctx->pool, stringToSign, head, "\n", NULL); head = my_apr_table_get(headers, "If-Modified-Since"); stringToSign=apr_pstrcat(ctx->pool, stringToSign, head, "\n", NULL); head = my_apr_table_get(headers, "If-Match"); stringToSign=apr_pstrcat(ctx->pool, stringToSign, head, "\n", NULL); head = my_apr_table_get(headers, "If-None-Match"); stringToSign=apr_pstrcat(ctx->pool, stringToSign, head, "\n", NULL); head = my_apr_table_get(headers, "If-Unmodified-Since"); stringToSign=apr_pstrcat(ctx->pool, stringToSign, head, "\n", NULL); head = my_apr_table_get(headers, "Range"); stringToSign=apr_pstrcat(ctx->pool, stringToSign, head, "\n", NULL); ahead = apr_table_elts(headers); aheaders = apr_pcalloc(ctx->pool, ahead->nelts * sizeof(char*)); elts = (apr_table_entry_t *) ahead->elts; for (i = 0; i < ahead->nelts; i++) { char *k; if(strncmp(elts[i].key,"x-ms-",5) || elts[i].key[5]==0) continue; k = aheaders[nCanonicalHeaders] = apr_pstrdup(ctx->pool, elts[i].key); while(*k) { *k = tolower(*k); k++; } nCanonicalHeaders++; } header_gnome_sort(aheaders, nCanonicalHeaders); for(i=0; ipool, canonical_headers, aheaders[i],":",apr_table_get(headers,aheaders[i]),"\n",NULL); } /* find occurence of third "/" in url */ while(*resource) { if(*resource == '/') cnt++; if(cnt == 3) break; resource++; } if(!*resource) { ctx->set_error(ctx,500,"invalid azure url provided"); return; } canonical_resource = apr_pstrcat(ctx->pool, "/", azure->id, resource, NULL); stringToSign = apr_pstrcat(ctx->pool, stringToSign, canonical_headers, canonical_resource, NULL); keyub64 = (char*)apr_pcalloc(ctx->pool, apr_base64_decode_len(azure->secret)); apr_base64_decode(keyub64, azure->secret); hmac_sha256((unsigned char*)stringToSign, strlen(stringToSign), (unsigned char*)keyub64, strlen(keyub64), sha, 32); b64sign = (char*)apr_pcalloc(ctx->pool, apr_base64_encode_len(32)); apr_base64_encode(b64sign, (char*)sha, 32); apr_table_set( headers, "Authorization", apr_pstrcat(ctx->pool,"SharedKey ", azure->id, ":", b64sign, NULL)); } static void _remove_lineends(char *str) { if(str) { size_t len = strlen(str); while(len>0) { if(str[len-1] == '\n' || str[len-1] == '\r') { str[len-1] = '\0'; len--; } else { break; } } } } static void _mapcache_cache_s3_headers_add(mapcache_context *ctx, const char* method, mapcache_cache_rest *rcache, mapcache_tile *tile, char *url, apr_table_t *headers) { unsigned char sha1[65],sha2[65]; int cnt=0,i; time_t now = time(NULL); struct tm *tnow = gmtime(&now); const apr_array_header_t *ahead; char *tosign, *key, *canonical_request, x_amz_date[64], *resource = url, **aheaders, *auth; apr_table_entry_t *elts; mapcache_cache_s3 *s3; char *aws_access_key_id = NULL, *aws_secret_access_key = NULL, *aws_security_token = NULL; sha1[64]=sha2[64]=0; assert(rcache->provider == MAPCACHE_REST_PROVIDER_S3); s3 = (mapcache_cache_s3*)rcache; if(s3->credentials_file) { apr_status_t rv; apr_file_t *f; if((rv=apr_file_open(&f, s3->credentials_file, APR_FOPEN_READ|APR_FOPEN_BUFFERED|APR_FOPEN_BINARY,APR_OS_DEFAULT, ctx->pool)) == APR_SUCCESS) { char line[1024]; if( (rv = apr_file_gets(line,1024,f))== APR_SUCCESS) { _remove_lineends(line); aws_access_key_id = apr_pstrdup(ctx->pool,line); } if( (rv = apr_file_gets(line,1024,f))== APR_SUCCESS) { _remove_lineends(line); aws_secret_access_key = apr_pstrdup(ctx->pool,line); } if( (rv = apr_file_gets(line,1024,f))== APR_SUCCESS) { _remove_lineends(line); aws_security_token = apr_pstrdup(ctx->pool,line); } apr_file_close(f); if(!aws_access_key_id || !*aws_access_key_id|| !aws_secret_access_key ||!*aws_secret_access_key) { ctx->set_error(ctx,500,"failed to read access or secret key from credentials file"); } if(aws_security_token && !*aws_security_token) { aws_security_token = NULL; } } else { ctx->set_error(ctx,500,"failed to access S3 credential config"); } } else { aws_access_key_id = s3->id; aws_secret_access_key = s3->secret; aws_security_token = NULL; } if(!strcmp(method,"PUT")) { assert(tile->encoded_data); sha256((unsigned char*)tile->encoded_data->buf, tile->encoded_data->size, sha1); sha_hex_encode(sha1,32); } else { /* sha256 hash of empty string */ memcpy(sha1,"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",64); } apr_table_set(headers,"x-amz-content-sha256", (char*)sha1); /* sha1 contains the hash of the payload */ /* find occurence of third "/" in url */ while(*resource) { if(*resource == '/') cnt++; if(cnt == 3) break; resource++; } if(!*resource) { ctx->set_error(ctx,500,"invalid s3 url provided"); return; } strftime(x_amz_date, sizeof(x_amz_date), "%Y%m%dT%H%M%SZ", tnow); apr_table_set(headers, "x-amz-date", x_amz_date); if(aws_security_token) { apr_table_set(headers, "x-amz-security-token", aws_security_token); } canonical_request = apr_pstrcat(ctx->pool, method, "\n" ,resource, "\n\n",NULL); ahead = apr_table_elts(headers); aheaders = apr_pcalloc(ctx->pool, ahead->nelts * sizeof(char*)); elts = (apr_table_entry_t *) ahead->elts; for (i = 0; i < ahead->nelts; i++) { char *k = aheaders[i] = apr_pstrdup(ctx->pool, elts[i].key); while(*k) { *k = tolower(*k); k++; } } header_gnome_sort(aheaders, ahead->nelts); for(i=0; inelts; i++) { canonical_request = apr_pstrcat(ctx->pool, canonical_request, aheaders[i],":",apr_table_get(headers,aheaders[i]),"\n",NULL); } canonical_request = apr_pstrcat(ctx->pool, canonical_request, "\n", NULL); for(i=0; inelts; i++) { if(i==ahead->nelts-1) { canonical_request = apr_pstrcat(ctx->pool, canonical_request, aheaders[i],NULL); } else { canonical_request = apr_pstrcat(ctx->pool, canonical_request, aheaders[i],";",NULL); } } canonical_request = apr_pstrcat(ctx->pool, canonical_request, "\n", sha1, NULL); //printf("canonical request: %s\n",canonical_request); tosign = apr_pstrcat(ctx->pool, "AWS4-HMAC-SHA256\n",x_amz_date,"\n",NULL); x_amz_date[8]=0; sha256((unsigned char*)canonical_request, strlen(canonical_request), sha1); sha_hex_encode(sha1,32); tosign = apr_pstrcat(ctx->pool, tosign, x_amz_date, "/", s3->region, "/s3/aws4_request\n", sha1,NULL); //printf("key to sign: %s\n",tosign); key = apr_pstrcat(ctx->pool, "AWS4", aws_secret_access_key, NULL); hmac_sha256((unsigned char*)x_amz_date, 8, (unsigned char*)key, strlen(key), sha1, 32); hmac_sha256((unsigned char*)s3->region, strlen(s3->region), sha1, 32, sha2, 32); hmac_sha256((unsigned char*)"s3", 2, sha2, 32, sha1, 32); hmac_sha256((unsigned char*)"aws4_request", 12, sha1, 32, sha2, 32); hmac_sha256((unsigned char*)tosign, strlen(tosign), sha2, 32, sha1, 32); sha_hex_encode(sha1,32); auth = apr_pstrcat(ctx->pool, "AWS4-HMAC-SHA256 Credential=",aws_access_key_id,"/",x_amz_date,"/",s3->region,"/s3/aws4_request,SignedHeaders=",NULL); for(i=0; inelts; i++) { if(i==ahead->nelts-1) { auth = apr_pstrcat(ctx->pool, auth, aheaders[i],NULL); } else { auth = apr_pstrcat(ctx->pool, auth, aheaders[i],";",NULL); } } auth = apr_pstrcat(ctx->pool, auth, ",Signature=", sha1, NULL); apr_table_set(headers, "Authorization", auth); } static void _mapcache_cache_s3_put_headers_add(mapcache_context *ctx, mapcache_cache_rest *pcache, mapcache_tile *tile, char *url, apr_table_t *headers) { _mapcache_cache_s3_headers_add(ctx, "PUT", pcache, tile, url, headers); } static void _mapcache_cache_s3_get_headers_add(mapcache_context *ctx, mapcache_cache_rest *pcache, mapcache_tile *tile, char *url, apr_table_t *headers) { _mapcache_cache_s3_headers_add(ctx, "GET", pcache, tile, url, headers); } static void _mapcache_cache_s3_head_headers_add(mapcache_context *ctx, mapcache_cache_rest *pcache, mapcache_tile *tile, char *url, apr_table_t *headers) { _mapcache_cache_s3_headers_add(ctx, "HEAD", pcache, tile, url, headers); } static void _mapcache_cache_s3_delete_headers_add(mapcache_context *ctx, mapcache_cache_rest *pcache, mapcache_tile *tile, char *url, apr_table_t *headers) { _mapcache_cache_s3_headers_add(ctx, "DELETE", pcache, tile, url, headers); } static void _mapcache_cache_azure_put_headers_add(mapcache_context *ctx, mapcache_cache_rest *pcache, mapcache_tile *tile, char *url, apr_table_t *headers) { _mapcache_cache_azure_headers_add(ctx, "PUT", pcache, tile, url, headers); } static void _mapcache_cache_azure_get_headers_add(mapcache_context *ctx, mapcache_cache_rest *pcache, mapcache_tile *tile, char *url, apr_table_t *headers) { _mapcache_cache_azure_headers_add(ctx, "GET", pcache, tile, url, headers); } static void _mapcache_cache_azure_head_headers_add(mapcache_context *ctx, mapcache_cache_rest *pcache, mapcache_tile *tile, char *url, apr_table_t *headers) { _mapcache_cache_azure_headers_add(ctx, "HEAD", pcache, tile, url, headers); } static void _mapcache_cache_azure_delete_headers_add(mapcache_context *ctx, mapcache_cache_rest *pcache, mapcache_tile *tile, char *url, apr_table_t *headers) { _mapcache_cache_azure_headers_add(ctx, "DELETE", pcache, tile, url, headers); } static void _mapcache_cache_google_put_headers_add(mapcache_context *ctx, mapcache_cache_rest *pcache, mapcache_tile *tile, char *url, apr_table_t *headers) { _mapcache_cache_google_headers_add(ctx, "PUT", pcache, tile, url, headers); } static void _mapcache_cache_google_get_headers_add(mapcache_context *ctx, mapcache_cache_rest *pcache, mapcache_tile *tile, char *url, apr_table_t *headers) { _mapcache_cache_google_headers_add(ctx, "GET", pcache, tile, url, headers); } static void _mapcache_cache_google_head_headers_add(mapcache_context *ctx, mapcache_cache_rest *pcache, mapcache_tile *tile, char *url, apr_table_t *headers) { _mapcache_cache_google_headers_add(ctx, "HEAD", pcache, tile, url, headers); } static void _mapcache_cache_google_delete_headers_add(mapcache_context *ctx, mapcache_cache_rest *pcache, mapcache_tile *tile, char *url, apr_table_t *headers) { _mapcache_cache_google_headers_add(ctx, "DELETE", pcache, tile, url, headers); } static int _mapcache_cache_rest_has_tile(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_rest *rcache = (mapcache_cache_rest*)pcache; char *url; apr_table_t *headers; int status; mapcache_pooled_connection *pc; CURL *curl; _mapcache_cache_rest_tile_url(ctx, tile, &rcache->rest, &rcache->rest.has_tile, &url); headers = _mapcache_cache_rest_headers(ctx, tile, &rcache->rest, &rcache->rest.has_tile); if(GC_HAS_ERROR(ctx)) return MAPCACHE_FAILURE; if(rcache->rest.add_headers) { rcache->rest.add_headers(ctx,rcache,tile,url,headers); } if(rcache->rest.has_tile.add_headers) { rcache->rest.has_tile.add_headers(ctx,rcache,tile,url,headers); } pc = _rest_get_connection(ctx, rcache, tile); if(GC_HAS_ERROR(ctx)) return MAPCACHE_FAILURE; curl = pc->connection; status = _head_request(ctx, curl, url, headers); if(GC_HAS_ERROR(ctx)) { mapcache_connection_pool_invalidate_connection(ctx,pc); return MAPCACHE_FAILURE; } mapcache_connection_pool_release_connection(ctx,pc); if( status == 200) return MAPCACHE_TRUE; else return MAPCACHE_FALSE; } static void _mapcache_cache_rest_delete(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_rest *rcache = (mapcache_cache_rest*)pcache; char *url; apr_table_t *headers; int status; mapcache_pooled_connection *pc; CURL *curl; _mapcache_cache_rest_tile_url(ctx, tile, &rcache->rest, &rcache->rest.delete_tile, &url); headers = _mapcache_cache_rest_headers(ctx, tile, &rcache->rest, &rcache->rest.delete_tile); GC_CHECK_ERROR(ctx); if(rcache->rest.add_headers) { rcache->rest.add_headers(ctx,rcache,tile,url,headers); } if(rcache->rest.delete_tile.add_headers) { rcache->rest.delete_tile.add_headers(ctx,rcache,tile,url,headers); } pc = _rest_get_connection(ctx, rcache, tile); GC_CHECK_ERROR(ctx); curl = pc->connection; status = _delete_request(ctx, curl, url, headers); if(GC_HAS_ERROR(ctx)) { mapcache_connection_pool_invalidate_connection(ctx,pc); return; } mapcache_connection_pool_release_connection(ctx,pc); if(status!=200 && status!=202 && status!=204 && status!=404 && status!=410) { //ctx->set_error(ctx,500,"rest delete returned code %d", status); } } /** * \brief get file content of given tile * * fills the mapcache_tile::data of the given tile with content stored in the file * \private \memberof mapcache_cache_rest * \sa mapcache_cache::tile_get() */ static int _mapcache_cache_rest_get(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_rest *rcache = (mapcache_cache_rest*)pcache; char *url; apr_table_t *headers; mapcache_pooled_connection *pc; CURL *curl; _mapcache_cache_rest_tile_url(ctx, tile, &rcache->rest, &rcache->rest.get_tile, &url); if(tile->allow_redirect && rcache->use_redirects) { tile->redirect = url; return MAPCACHE_SUCCESS; } headers = _mapcache_cache_rest_headers(ctx, tile, &rcache->rest, &rcache->rest.get_tile); if(GC_HAS_ERROR(ctx)) return MAPCACHE_FAILURE; if(rcache->rest.add_headers) { rcache->rest.add_headers(ctx,rcache,tile,url,headers); } if(rcache->rest.get_tile.add_headers) { rcache->rest.get_tile.add_headers(ctx,rcache,tile,url,headers); } pc = _rest_get_connection(ctx, rcache, tile); if(GC_HAS_ERROR(ctx)) return MAPCACHE_FAILURE; curl = pc->connection; tile->encoded_data = _get_request(ctx, curl, url, headers); if(GC_HAS_ERROR(ctx)) { mapcache_connection_pool_invalidate_connection(ctx,pc); return MAPCACHE_FAILURE; } mapcache_connection_pool_release_connection(ctx,pc); if(!tile->encoded_data) return MAPCACHE_CACHE_MISS; return MAPCACHE_SUCCESS; } static void _mapcache_cache_rest_set(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_rest *rcache = (mapcache_cache_rest*)pcache; char *url; apr_table_t *headers; mapcache_pooled_connection *pc; CURL *curl; if(rcache->detect_blank) { if(tile->nodata) { return; } if(!tile->raw_image) { tile->raw_image = mapcache_imageio_decode(ctx, tile->encoded_data); GC_CHECK_ERROR(ctx); } if(mapcache_image_blank_color(tile->raw_image) != MAPCACHE_FALSE) { if(tile->raw_image->data[3] == 0) { /* We have a blank (uniform) image who's first pixel is fully transparent, thus the whole image is transparent */ tile->nodata = 1; return; } } } _mapcache_cache_rest_tile_url(ctx, tile, &rcache->rest, &rcache->rest.set_tile, &url); headers = _mapcache_cache_rest_headers(ctx, tile, &rcache->rest, &rcache->rest.set_tile); GC_CHECK_ERROR(ctx); if(!tile->encoded_data) { tile->encoded_data = tile->tileset->format->write(ctx, tile->raw_image, tile->tileset->format); GC_CHECK_ERROR(ctx); } apr_table_set(headers,"Content-Length",apr_psprintf(ctx->pool,"%lu",tile->encoded_data->size)); if(tile->tileset->format && tile->tileset->format->mime_type) apr_table_set(headers, "Content-Type", tile->tileset->format->mime_type); else { mapcache_image_format_type imgfmt = mapcache_imageio_header_sniff(ctx,tile->encoded_data); if(imgfmt == GC_JPEG) { apr_table_set(headers, "Content-Type", "image/jpeg"); } else if (imgfmt == GC_PNG) { apr_table_set(headers, "Content-Type", "image/png"); } } if(rcache->rest.add_headers) { rcache->rest.add_headers(ctx,rcache,tile,url,headers); } if(rcache->rest.set_tile.add_headers) { rcache->rest.set_tile.add_headers(ctx,rcache,tile,url,headers); } pc = _rest_get_connection(ctx, rcache, tile); GC_CHECK_ERROR(ctx); curl = pc->connection; _put_request(ctx, curl, tile->encoded_data, url, headers); if(GC_HAS_ERROR(ctx)) { mapcache_connection_pool_invalidate_connection(ctx,pc); return; } mapcache_connection_pool_release_connection(ctx,pc); } static void _mapcache_cache_rest_operation_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_cache *cache, mapcache_rest_operation *op) { ezxml_t cur_node; if ((cur_node = ezxml_child(node,"headers")) != NULL) { ezxml_t header_node; op->headers = apr_table_make(ctx->pool,3); for(header_node = cur_node->child; header_node; header_node = header_node->sibling) { apr_table_set(op->headers, header_node->name, header_node->txt); } } if ((cur_node = ezxml_child(node,"header_file")) != NULL) { op->header_file = apr_pstrdup(ctx->pool, cur_node->txt); } } /** * \private \memberof mapcache_cache_rest */ static void _mapcache_cache_rest_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_cache *cache, mapcache_cfg *config) { ezxml_t cur_node; mapcache_cache_rest *dcache = (mapcache_cache_rest*)cache; if ((cur_node = ezxml_child(node,"url")) != NULL) { dcache->rest.tile_url = apr_pstrdup(ctx->pool,cur_node->txt); } if ((cur_node = ezxml_child(node,"use_redirects")) != NULL) { if(!strcasecmp(cur_node->txt,"true")) { dcache->use_redirects = 1; } } if ((cur_node = ezxml_child(node,"connection_timeout")) != NULL) { char *endptr; dcache->connection_timeout = (int)strtol(cur_node->txt,&endptr,10); if(*endptr != 0 || dcache->connection_timeout<1) { ctx->set_error(ctx,400,"invalid rest cache \"%s\" (positive integer expected)", cur_node->txt); return; } } else { dcache->connection_timeout = 30; } if ((cur_node = ezxml_child(node,"timeout")) != NULL) { char *endptr; dcache->timeout = (int)strtol(cur_node->txt,&endptr,10); if(*endptr != 0 || dcache->timeout<1) { ctx->set_error(ctx,400,"invalid rest cache \"%s\" (positive integer expected)", cur_node->txt); return; } } else { dcache->timeout = 120; } dcache->detect_blank = 0; if ((cur_node = ezxml_child(node, "detect_blank")) != NULL) { if(strcasecmp(cur_node->txt,"false")) { dcache->detect_blank = 1; } } if ((cur_node = ezxml_child(node,"headers")) != NULL) { ezxml_t header_node; dcache->rest.common_headers = apr_table_make(ctx->pool,3); for(header_node = cur_node->child; header_node; header_node = header_node->sibling) { apr_table_set(dcache->rest.common_headers, header_node->name, header_node->txt); } } if ((cur_node = ezxml_child(node,"header_file")) != NULL) { dcache->rest.header_file = apr_pstrdup(ctx->pool, cur_node->txt); } for(cur_node = ezxml_child(node,"operation"); cur_node; cur_node = cur_node->next) { char *type = (char*)ezxml_attr(cur_node,"type"); if(!type) { ctx->set_error(ctx,400," with no \"type\" attribute in cache (%s)", cache->name); return; } if(!strcasecmp(type,"put")) { _mapcache_cache_rest_operation_parse_xml(ctx,cur_node,cache,&dcache->rest.set_tile); GC_CHECK_ERROR(ctx); } else if(!strcasecmp(type,"get")) { _mapcache_cache_rest_operation_parse_xml(ctx,cur_node,cache,&dcache->rest.get_tile); GC_CHECK_ERROR(ctx); } else if(!strcasecmp(type,"head")) { _mapcache_cache_rest_operation_parse_xml(ctx,cur_node,cache,&dcache->rest.has_tile); GC_CHECK_ERROR(ctx); } else if(!strcasecmp(type,"delete")) { _mapcache_cache_rest_operation_parse_xml(ctx,cur_node,cache,&dcache->rest.delete_tile); GC_CHECK_ERROR(ctx); } else { ctx->set_error(ctx,400," with unknown \"type\" (%s) attribute in cache (%s) (expecting put, get, head or delete)", type, cache->name); return; } } } static void _mapcache_cache_google_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_cache *cache, mapcache_cfg *config) { ezxml_t cur_node; mapcache_cache_google *google = (mapcache_cache_google*)cache; _mapcache_cache_rest_configuration_parse_xml(ctx, node, cache, config); GC_CHECK_ERROR(ctx); if ((cur_node = ezxml_child(node,"access")) != NULL) { google->access = apr_pstrdup(ctx->pool, cur_node->txt); } else { ctx->set_error(ctx,400,"google cache (%s) is missing required child", cache->name); return; } if ((cur_node = ezxml_child(node,"secret")) != NULL) { google->secret = apr_pstrdup(ctx->pool, cur_node->txt); } else { ctx->set_error(ctx,400,"google cache (%s) is missing required child", cache->name); return; } } static void _mapcache_cache_s3_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_cache *cache, mapcache_cfg *config) { ezxml_t cur_node; mapcache_cache_s3 *s3 = (mapcache_cache_s3*)cache; _mapcache_cache_rest_configuration_parse_xml(ctx, node, cache, config); GC_CHECK_ERROR(ctx); if ((cur_node = ezxml_child(node,"credentials_file")) != NULL) { s3->credentials_file = apr_pstrdup(ctx->pool, cur_node->txt); } else { if ((cur_node = ezxml_child(node,"id")) != NULL) { s3->id = apr_pstrdup(ctx->pool, cur_node->txt); } else if ( getenv("AWS_ACCESS_KEY_ID")) { s3->id = apr_pstrdup(ctx->pool,getenv("AWS_ACCESS_KEY_ID")); } else { ctx->set_error(ctx,400,"s3 cache (%s) is missing required child or AWS_ACCESS_KEY_ID environment", cache->name); return; } if ((cur_node = ezxml_child(node,"secret")) != NULL) { s3->secret = apr_pstrdup(ctx->pool, cur_node->txt); } else if ( getenv("AWS_SECRET_ACCESS_KEY")) { s3->secret = apr_pstrdup(ctx->pool,getenv("AWS_SECRET_ACCESS_KEY")); } else { ctx->set_error(ctx,400,"s3 cache (%s) is missing required child or AWS_SECRET_ACCESS_KEY environment", cache->name); return; } } if ((cur_node = ezxml_child(node,"region")) != NULL) { s3->region = apr_pstrdup(ctx->pool, cur_node->txt); } else { ctx->set_error(ctx,400,"s3 cache (%s) is missing required child", cache->name); return; } } static void _mapcache_cache_azure_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_cache *cache, mapcache_cfg *config) { ezxml_t cur_node; mapcache_cache_azure *azure = (mapcache_cache_azure*)cache; _mapcache_cache_rest_configuration_parse_xml(ctx, node, cache, config); GC_CHECK_ERROR(ctx); if ((cur_node = ezxml_child(node,"id")) != NULL) { azure->id = apr_pstrdup(ctx->pool, cur_node->txt); } else { ctx->set_error(ctx,400,"azure cache (%s) is missing required child", cache->name); return; } if ((cur_node = ezxml_child(node,"secret")) != NULL) { azure->secret = apr_pstrdup(ctx->pool, cur_node->txt); } else { ctx->set_error(ctx,400,"azure cache (%s) is missing required child", cache->name); return; } if ((cur_node = ezxml_child(node,"container")) != NULL) { azure->container = apr_pstrdup(ctx->pool, cur_node->txt); } else { ctx->set_error(ctx,400,"azure cache (%s) is missing required child", cache->name); return; } } /** * \private \memberof mapcache_cache_rest */ static void _mapcache_cache_rest_configuration_post_config(mapcache_context *ctx, mapcache_cache *cache, mapcache_cfg *cfg) { mapcache_cache_rest *dcache = (mapcache_cache_rest*)cache; if(!dcache->rest.tile_url) { if(!dcache->rest.delete_tile.tile_url) { ctx->set_error(ctx,400, "rest cache (%s) has no global and no for delete_tile operation", cache->name); return; } if(!dcache->rest.get_tile.tile_url) { ctx->set_error(ctx,400, "rest cache (%s) has no global and no for get_tile operation", cache->name); return; } if(!dcache->rest.set_tile.tile_url) { ctx->set_error(ctx,400, "rest cache (%s) has no global and no for set_tile operation", cache->name); return; } } } void mapcache_cache_rest_init(mapcache_context *ctx, mapcache_cache_rest *cache) { cache->use_redirects = 0; cache->rest.get_tile.method = MAPCACHE_REST_METHOD_GET; cache->rest.set_tile.method = MAPCACHE_REST_METHOD_PUT; cache->rest.delete_tile.method = MAPCACHE_REST_METHOD_DELETE; cache->rest.multi_set_tile.method = MAPCACHE_REST_METHOD_PUT; cache->rest.has_tile.method = MAPCACHE_REST_METHOD_HEAD; cache->cache.metadata = apr_table_make(ctx->pool,3); cache->cache.type = MAPCACHE_CACHE_REST; cache->cache._tile_delete = _mapcache_cache_rest_delete; cache->cache._tile_get = _mapcache_cache_rest_get; cache->cache._tile_exists = _mapcache_cache_rest_has_tile; cache->cache._tile_set = _mapcache_cache_rest_set; cache->cache.configuration_post_config = _mapcache_cache_rest_configuration_post_config; cache->cache.configuration_parse_xml = _mapcache_cache_rest_configuration_parse_xml; } /** * \brief creates and initializes a mapcache_rest_cache */ mapcache_cache* mapcache_cache_rest_create(mapcache_context *ctx) { mapcache_cache_rest *cache = apr_pcalloc(ctx->pool,sizeof(mapcache_cache_rest)); if(!cache) { ctx->set_error(ctx, 500, "failed to allocate rest cache"); return NULL; } mapcache_cache_rest_init(ctx,cache); cache->provider = MAPCACHE_REST_PROVIDER_NONE; return (mapcache_cache*)cache; } /** * \brief creates and initializes a mapcache_s3_cache */ mapcache_cache* mapcache_cache_s3_create(mapcache_context *ctx) { mapcache_cache_s3 *cache = apr_pcalloc(ctx->pool,sizeof(mapcache_cache_s3)); if(!cache) { ctx->set_error(ctx, 500, "failed to allocate s3 cache"); return NULL; } mapcache_cache_rest_init(ctx,&cache->cache); cache->cache.provider = MAPCACHE_REST_PROVIDER_S3; cache->cache.cache.configuration_parse_xml = _mapcache_cache_s3_configuration_parse_xml; cache->cache.rest.get_tile.add_headers = _mapcache_cache_s3_get_headers_add; cache->cache.rest.has_tile.add_headers = _mapcache_cache_s3_head_headers_add; cache->cache.rest.set_tile.add_headers = _mapcache_cache_s3_put_headers_add; cache->cache.rest.delete_tile.add_headers = _mapcache_cache_s3_delete_headers_add; return (mapcache_cache*)cache; } /** * \brief creates and initializes a mapcache_azure_cache */ mapcache_cache* mapcache_cache_azure_create(mapcache_context *ctx) { mapcache_cache_azure *cache = apr_pcalloc(ctx->pool,sizeof(mapcache_cache_azure)); if(!cache) { ctx->set_error(ctx, 500, "failed to allocate azure cache"); return NULL; } mapcache_cache_rest_init(ctx,&cache->cache); cache->cache.provider = MAPCACHE_REST_PROVIDER_AZURE; cache->cache.cache.configuration_parse_xml = _mapcache_cache_azure_configuration_parse_xml; cache->cache.rest.get_tile.add_headers = _mapcache_cache_azure_get_headers_add; cache->cache.rest.has_tile.add_headers = _mapcache_cache_azure_head_headers_add; cache->cache.rest.set_tile.add_headers = _mapcache_cache_azure_put_headers_add; cache->cache.rest.delete_tile.add_headers = _mapcache_cache_azure_delete_headers_add; return (mapcache_cache*)cache; } /** * \brief creates and initializes a mapcache_google_cache */ mapcache_cache* mapcache_cache_google_create(mapcache_context *ctx) { mapcache_cache_google *cache = apr_pcalloc(ctx->pool,sizeof(mapcache_cache_google)); if(!cache) { ctx->set_error(ctx, 500, "failed to allocate google cache"); return NULL; } mapcache_cache_rest_init(ctx,&cache->cache); cache->cache.provider = MAPCACHE_REST_PROVIDER_GOOGLE; cache->cache.cache.configuration_parse_xml = _mapcache_cache_google_configuration_parse_xml; cache->cache.rest.get_tile.add_headers = _mapcache_cache_google_get_headers_add; cache->cache.rest.has_tile.add_headers = _mapcache_cache_google_head_headers_add; cache->cache.rest.set_tile.add_headers = _mapcache_cache_google_put_headers_add; cache->cache.rest.delete_tile.add_headers = _mapcache_cache_google_delete_headers_add; return (mapcache_cache*)cache; } /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/cache_riak.c000066400000000000000000000352531316353564100170400ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching support file: riak cache backend. * Author: Michael Downey and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2013 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #ifdef USE_RIAK #include #include #include #include #include #include typedef struct mapcache_cache_riak mapcache_cache_riak; /**\class mapcache_cache_riak * \brief a mapcache_cache for riak servers * \implements mapcache_cache */ struct mapcache_cache_riak { mapcache_cache cache; char *host; int port; char *key_template; char *bucket_template; }; struct riak_conn_params { mapcache_cache_riak *cache; }; void mapcache_riak_connection_constructor(mapcache_context *ctx, void **conn_, void *params) { mapcache_cache_riak *cache = ((struct riak_conn_params*)params)->cache; struct RIACK_CONNECTION_OPTIONS options; struct RIACK_CLIENT *client = riack_new_client(0); if (client == NULL) { ctx->set_error(ctx,500,"failed to riack_new_client(0)"); return; } options.recv_timeout_ms = 2000; options.send_timeout_ms = 2000; if (riack_connect(client, cache->host, cache->port, &options) != RIACK_SUCCESS) { riack_free(client); ctx->set_error(ctx,500,"failed to riack_connect()"); return; } if (riack_ping(client) != RIACK_SUCCESS) { riack_free(client); ctx->set_error(ctx,500,"failed to riack_ping()"); return; } *conn_ = client; } void mapcache_riak_connection_destructor(void *conn_) { struct RIACK_CLIENT *client = (struct RIACK_CLIENT *)conn_; riack_free(client); } static mapcache_pooled_connection* _riak_get_connection(mapcache_context *ctx, mapcache_cache_riak *cache, mapcache_tile *tile) { mapcache_pooled_connection *pc; struct riak_conn_params params; params.cache = cache; pc = mapcache_connection_pool_get_connection(ctx,cache->cache.name,mapcache_riak_connection_constructor, mapcache_riak_connection_destructor, ¶ms); return pc; } static int _mapcache_cache_riak_has_tile(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { int error; RIACK_STRING key,bucket; struct RIACK_GET_OBJECT obj; struct RIACK_CLIENT *client; mapcache_pooled_connection *pc; mapcache_cache_riak *cache = (mapcache_cache_riak*)pcache; key.value = mapcache_util_get_tile_key(ctx, tile, cache->key_template, " \r\n\t\f\e\a\b", "#"); if (GC_HAS_ERROR(ctx)) { return MAPCACHE_FALSE; } key.len = strlen(key.value); if(strchr(cache->bucket_template,'{')) { bucket.value = mapcache_util_get_tile_key(ctx, tile, cache->bucket_template, " \r\n\t\f\e\a\b", "#"); } else { bucket.value = cache->bucket_template; } bucket.len = strlen(bucket.value); pc = _riak_get_connection(ctx, cache, tile); if (GC_HAS_ERROR(ctx)) { return MAPCACHE_FALSE; } client = pc->connection; error = riack_get(client, bucket, key, 0, &obj); if (error != RIACK_SUCCESS) { mapcache_connection_pool_invalidate_connection(ctx,pc); ctx->set_error(ctx, 500, "riak: failed to get key %s: %d", key, error); return MAPCACHE_FALSE; } if (obj.object.content_count < 1 || obj.object.content[0].data_len == 0) { error = MAPCACHE_FALSE; } else { error = MAPCACHE_TRUE; } riack_free_get_object(client, &obj); // riack_get allocates the returned object so we need to deallocate it. mapcache_connection_pool_release_connection(ctx,pc); return error; } static void _mapcache_cache_riak_delete(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { int error; RIACK_STRING key,bucket; struct RIACK_CLIENT *client; struct RIACK_DEL_PROPERTIES properties; mapcache_pooled_connection *pc; mapcache_cache_riak *cache = (mapcache_cache_riak*)pcache; memset(&properties, 0, sizeof(struct RIACK_DEL_PROPERTIES)); key.value = mapcache_util_get_tile_key(ctx, tile, cache->key_template, " \r\n\t\f\e\a\b", "#"); GC_CHECK_ERROR(ctx); key.len = strlen(key.value); if(strchr(cache->bucket_template,'{')) { bucket.value = mapcache_util_get_tile_key(ctx, tile, cache->bucket_template, " \r\n\t\f\e\a\b", "#"); } else { bucket.value = cache->bucket_template; } bucket.len = strlen(bucket.value); pc = _riak_get_connection(ctx, cache, tile); GC_CHECK_ERROR(ctx); client = pc->connection; properties.rw_use = 1; properties.rw = (4294967295 - 3); // Special value meaning "ALL" error = riack_delete(client, bucket, key, &properties); mapcache_connection_pool_release_connection(ctx,pc); if (error != RIACK_SUCCESS) { ctx->set_error(ctx, 500, "riak: failed to delete key %s: %d", key, error); } } /** * \brief get content of given tile * * fills the mapcache_tile::data of the given tile with content stored on the riak server * \private \memberof mapcache_cache_riak * \sa mapcache_cache::tile_get() */ static int _mapcache_cache_riak_get(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { int error; RIACK_STRING key,bucket; struct RIACK_GET_OBJECT obj; struct RIACK_GET_PROPERTIES properties; struct RIACK_CLIENT *client; mapcache_pooled_connection *pc; mapcache_cache_riak *cache = (mapcache_cache_riak*)pcache; memset(&properties, 0, sizeof(struct RIACK_GET_PROPERTIES)); //Use Buckets defaults instead of setting the read/write attributes /* properties.r_use = 1; properties.r = 1; */ key.value = mapcache_util_get_tile_key(ctx, tile, cache->key_template, " \r\n\t\f\e\a\b", "#"); if (GC_HAS_ERROR(ctx)) { return MAPCACHE_FAILURE; } key.len = strlen(key.value); if(strchr(cache->bucket_template,'{')) { bucket.value = mapcache_util_get_tile_key(ctx, tile, cache->bucket_template, " \r\n\t\f\e\a\b", "#"); } else { bucket.value = cache->bucket_template; } bucket.len = strlen(bucket.value); pc = _riak_get_connection(ctx, cache, tile); if (GC_HAS_ERROR(ctx)) { return MAPCACHE_FAILURE; } client = pc->connection; error = riack_get(client, bucket, key, &properties, &obj); if (error != RIACK_SUCCESS) { mapcache_connection_pool_invalidate_connection(ctx,pc); ctx->set_error(ctx, 500, "Failed to get tile %s from cache %s due to error %d", key.value, cache->cache.name, error); return MAPCACHE_FAILURE; } // Check if tile exists. If it doesn't we need to return CACHE_MISS or things go wrong. // Mapcache doesn't appear to use the has_tile function and uses _get instead so we need // to do this sort of test here instead of erroring. if (obj.object.content_count < 1 || obj.object.content[0].data_len == 0) { riack_free_get_object(client, &obj); // Need to free the object here as well. mapcache_connection_pool_release_connection(ctx,pc); return MAPCACHE_CACHE_MISS; } // Copy the data into the buffer tile->encoded_data = mapcache_buffer_create(0, ctx->pool); mapcache_buffer_append(tile->encoded_data, obj.object.content[0].data_len, obj.object.content[0].data); riack_free_get_object(client, &obj); // riack_get allocates the returned object so we need to deallocate it. mapcache_connection_pool_release_connection(ctx,pc); return MAPCACHE_SUCCESS; } /** * \brief push tile data to riak * * writes the content of mapcache_tile::data to the configured riak instance(s) * \private \memberof mapcache_cache_riak * \sa mapcache_cache::tile_set() */ static void _mapcache_cache_riak_set(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { char *key,*content_type; int error; struct RIACK_OBJECT object; struct RIACK_CONTENT content; struct RIACK_PUT_PROPERTIES properties; struct RIACK_CLIENT *client; RIACK_STRING bucket; mapcache_pooled_connection *pc; mapcache_cache_riak *cache = (mapcache_cache_riak*)pcache; memset(&content, 0, sizeof(struct RIACK_CONTENT)); memset(&object, 0, sizeof(struct RIACK_OBJECT)); memset(&properties, 0, sizeof(struct RIACK_PUT_PROPERTIES)); //Use Buckets defaults instead of setting the read/write attributes /* properties.w_use = 1; properties.w = 1; properties.dw_use = 1; properties.dw = 0;*/ key = mapcache_util_get_tile_key(ctx, tile, cache->key_template, " \r\n\t\f\e\a\b", "#"); GC_CHECK_ERROR(ctx); if(strchr(cache->bucket_template,'{')) { bucket.value = mapcache_util_get_tile_key(ctx, tile, cache->bucket_template, " \r\n\t\f\e\a\b", "#"); } else { bucket.value = cache->bucket_template; } bucket.len = strlen(bucket.value); if (!tile->encoded_data) { tile->encoded_data = tile->tileset->format->write(ctx, tile->raw_image, tile->tileset->format); GC_CHECK_ERROR(ctx); } content_type = tile->tileset->format?(tile->tileset->format->mime_type?tile->tileset->format->mime_type:NULL):NULL; if(!content_type) { /* compute the content-type */ mapcache_image_format_type t = mapcache_imageio_header_sniff(ctx,tile->encoded_data); if(t == GC_PNG) content_type = "image/png"; else if(t == GC_JPEG) content_type = "image/jpeg"; } pc = _riak_get_connection(ctx, cache, tile); GC_CHECK_ERROR(ctx); client = pc->connection; // Set up the riak object to put. Need to do this after we get the client connection object.bucket = bucket; object.key.value = key; object.key.len = strlen(key); object.vclock.len = 0; object.content_count = 1; object.content = &content; content.content_type.value = content_type; content.content_type.len = content_type?strlen(content_type):0; content.data = (uint8_t*)tile->encoded_data->buf; content.data_len = tile->encoded_data->size; error = riack_put(client, object, 0, &properties); if (error != RIACK_SUCCESS) mapcache_connection_pool_invalidate_connection(ctx,pc); else mapcache_connection_pool_release_connection(ctx,pc); if (error != RIACK_SUCCESS) { ctx->set_error(ctx, 500, "failed to store tile %s to cache %s due to error %d.", key, cache->cache.name, error); } } /** * \private \memberof mapcache_cache_riak */ static void _mapcache_cache_riak_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_cache *cache, mapcache_cfg *config) { ezxml_t cur_node,xhost,xport,xbucket,xkey; mapcache_cache_riak *dcache = (mapcache_cache_riak*)cache; int servercount = 0; for (cur_node = ezxml_child(node,"server"); cur_node; cur_node = cur_node->next) { servercount++; } if (!servercount) { ctx->set_error(ctx, 400, "riak cache %s has no s configured", cache->name); return; } if (servercount > 1) { ctx->set_error(ctx, 400, "riak cache %s has more than 1 server configured", cache->name); return; } cur_node = ezxml_child(node, "server"); xhost = ezxml_child(cur_node, "host"); /* Host should contain just server */ xport = ezxml_child(cur_node, "port"); xbucket = ezxml_child(cur_node, "bucket"); xkey = ezxml_child(cur_node, "key"); if (!xhost || !xhost->txt || ! *xhost->txt) { ctx->set_error(ctx, 400, "cache %s: with no ", cache->name); return; } else { dcache->host = apr_pstrdup(ctx->pool, xhost->txt); } if (!xport || !xport->txt || ! *xport->txt) { ctx->set_error(ctx, 400, "cache %s: with no ", cache->name); return; } else { dcache->port = atoi(xport->txt); } if (!xbucket || !xbucket->txt || ! *xbucket->txt) { ctx->set_error(ctx, 400, "cache %s: with no ", cache->name); return; } else { dcache->bucket_template = apr_pstrdup(ctx->pool, xbucket->txt); } if(xkey && xkey->txt && *xkey->txt) { dcache->key_template = apr_pstrdup(ctx->pool, xkey->txt); } } /** * \private \memberof mapcache_cache_riak */ static void _mapcache_cache_riak_configuration_post_config(mapcache_context *ctx, mapcache_cache *cache, mapcache_cfg *cfg) { riack_init(); } /** * \brief creates and initializes a mapcache_riak_cache */ mapcache_cache* mapcache_cache_riak_create(mapcache_context *ctx) { mapcache_cache_riak *cache = apr_pcalloc(ctx->pool,sizeof(mapcache_cache_riak)); if (!cache) { ctx->set_error(ctx, 500, "failed to allocate riak cache"); return NULL; } cache->cache.metadata = apr_table_make(ctx->pool, 3); cache->cache.type = MAPCACHE_CACHE_RIAK; cache->cache._tile_get = _mapcache_cache_riak_get; cache->cache._tile_exists = _mapcache_cache_riak_has_tile; cache->cache._tile_set = _mapcache_cache_riak_set; cache->cache._tile_delete = _mapcache_cache_riak_delete; cache->cache.configuration_parse_xml = _mapcache_cache_riak_configuration_parse_xml; cache->cache.configuration_post_config = _mapcache_cache_riak_configuration_post_config; cache->host = NULL; cache->port = 8087; // Default RIAK port used for protobuf cache->bucket_template = NULL; cache->key_template = NULL; return (mapcache_cache*)cache; } #else mapcache_cache* mapcache_cache_riak_create(mapcache_context *ctx) { ctx->set_error(ctx,400,"RIAK support not compiled in this version"); return NULL; } #endif mapcache-rel-1-6-1/lib/cache_sqlite.c000066400000000000000000001205741316353564100174140ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching support file: sqlite cache backend * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #ifdef USE_SQLITE #include #include #include #include #include #include #ifdef APR_HAS_THREADS #include #endif #ifndef _WIN32 #include #endif #include /**\class mapcache_cache_sqlite * \brief a mapcache_cache on a filesytem * \implements mapcache_cache */ typedef struct mapcache_cache_sqlite mapcache_cache_sqlite; typedef struct mapcache_cache_sqlite_stmt mapcache_cache_sqlite_stmt; struct mapcache_cache_sqlite_stmt { char *sql; }; struct sqlite_conn; struct mapcache_cache_sqlite { mapcache_cache cache; char *dbfile; mapcache_cache_sqlite_stmt create_stmt; mapcache_cache_sqlite_stmt exists_stmt; mapcache_cache_sqlite_stmt get_stmt; mapcache_cache_sqlite_stmt set_stmt; mapcache_cache_sqlite_stmt delete_stmt; apr_table_t *pragmas; void (*bind_stmt)(mapcache_context *ctx, void *stmt, mapcache_cache_sqlite *cache, mapcache_tile *tile); int n_prepared_statements; int detect_blank; char *x_fmt,*y_fmt,*z_fmt,*inv_x_fmt,*inv_y_fmt,*div_x_fmt,*div_y_fmt,*inv_div_x_fmt,*inv_div_y_fmt; int count_x, count_y; }; struct sqlite_conn_params { mapcache_cache_sqlite *cache; char *dbfile; int readonly; }; struct sqlite_conn { sqlite3 *handle; int nstatements; sqlite3_stmt **prepared_statements; }; #define SQLITE_CONN(pooled_connection) ((struct sqlite_conn*)((pooled_connection)->connection)) #define HAS_TILE_STMT_IDX 0 #define GET_TILE_STMT_IDX 1 #define SQLITE_SET_TILE_STMT_IDX 2 #define SQLITE_DEL_TILE_STMT_IDX 3 #define MBTILES_SET_EMPTY_TILE_STMT1_IDX 2 #define MBTILES_SET_EMPTY_TILE_STMT2_IDX 3 #define MBTILES_SET_TILE_STMT1_IDX 4 #define MBTILES_SET_TILE_STMT2_IDX 5 #define MBTILES_DEL_TILE_SELECT_STMT_IDX 6 #define MBTILES_DEL_TILE_STMT1_IDX 7 #define MBTILES_DEL_TILE_STMT2_IDX 8 static void _mapcache_cache_sqlite_filename_for_tile(mapcache_context *ctx, mapcache_cache_sqlite *dcache, mapcache_tile *tile, char **path); static void _sqlite_set_pragmas(mapcache_context *ctx, mapcache_cache_sqlite* cache, struct sqlite_conn *conn) { if (cache->pragmas && !apr_is_empty_table(cache->pragmas)) { const apr_array_header_t *elts = apr_table_elts(cache->pragmas); /* FIXME dynamically allocate this string */ int i,ret; char *pragma_stmt; for (i = 0; i < elts->nelts; i++) { apr_table_entry_t entry = APR_ARRAY_IDX(elts, i, apr_table_entry_t); pragma_stmt = apr_psprintf(ctx->pool,"PRAGMA %s=%s",entry.key,entry.val); do { ret = sqlite3_exec(conn->handle, pragma_stmt, 0, 0, NULL); if (ret != SQLITE_OK && ret != SQLITE_BUSY && ret != SQLITE_LOCKED) { break; } } while (ret == SQLITE_BUSY || ret == SQLITE_LOCKED); if (ret != SQLITE_OK) { ctx->set_error(ctx, 500, "failed to execute pragma statement %s",pragma_stmt); return; } } } return; } static void mapcache_sqlite_release_conn(mapcache_context *ctx, mapcache_pooled_connection *conn) { mapcache_connection_pool_release_connection(ctx,conn); } void mapcache_sqlite_connection_constructor(mapcache_context *ctx, void **conn_, void *params) { int ret; int flags; struct sqlite_conn_params *sq_params = (struct sqlite_conn_params*)params; struct sqlite_conn *conn = calloc(1, sizeof (struct sqlite_conn)); *conn_ = conn; if(sq_params->readonly) { flags = SQLITE_OPEN_READONLY | SQLITE_OPEN_NOMUTEX; } else { flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_CREATE; mapcache_make_parent_dirs(ctx,sq_params->dbfile); GC_CHECK_ERROR(ctx); } ret = sqlite3_open_v2(sq_params->dbfile, &conn->handle, flags, NULL); if (ret != SQLITE_OK) { ctx->set_error(ctx,500,"sqlite backend failed to open db %s: %s", sq_params->dbfile, sqlite3_errmsg(conn->handle)); return; } sqlite3_busy_timeout(conn->handle, 300000); do { ret = sqlite3_exec(conn->handle, sq_params->cache->create_stmt.sql, 0, 0, NULL); if (ret != SQLITE_OK && ret != SQLITE_BUSY && ret != SQLITE_LOCKED) { break; } } while (ret == SQLITE_BUSY || ret == SQLITE_LOCKED); if (ret != SQLITE_OK) { ctx->set_error(ctx,500, "sqlite backend failed to create db schema on %s: %s", sq_params->dbfile, sqlite3_errmsg(conn->handle)); sqlite3_close(conn->handle); return; } _sqlite_set_pragmas(ctx, sq_params->cache, conn); if(GC_HAS_ERROR(ctx)) { sqlite3_close(conn->handle); return; } conn->prepared_statements = calloc(sq_params->cache->n_prepared_statements,sizeof(sqlite3_stmt*)); conn->nstatements = sq_params->cache->n_prepared_statements; } void mapcache_sqlite_connection_destructor(void *conn_) { struct sqlite_conn *conn = (struct sqlite_conn*) conn_; int i; for(i=0; instatements; i++) { if(conn->prepared_statements[i]) { sqlite3_finalize(conn->prepared_statements[i]); } } free(conn->prepared_statements); sqlite3_close(conn->handle); } static mapcache_pooled_connection* mapcache_sqlite_get_conn(mapcache_context *ctx, mapcache_cache_sqlite *cache, mapcache_tile *tile, int readonly) { struct sqlite_conn_params params; mapcache_pooled_connection *pc; char *key; _mapcache_cache_sqlite_filename_for_tile(ctx,cache,tile,¶ms.dbfile); params.cache = cache; params.readonly = readonly; if(!strstr(cache->dbfile,"{")) { key = apr_pstrcat(ctx->pool,readonly?"ro_":"rw_",cache->cache.name,NULL); } else { key = apr_pstrcat(ctx->pool,readonly?"ro_":"rw_",params.dbfile,NULL); } pc = mapcache_connection_pool_get_connection(ctx,key,mapcache_sqlite_connection_constructor,mapcache_sqlite_connection_destructor,¶ms); return pc; } /** * \brief return sqlite db filename for given tile * * \param tile the tile to get the key from * \param path pointer to a char* that will contain the filename * \param r * \private \memberof mapcache_cache_sqlite */ static void _mapcache_cache_sqlite_filename_for_tile(mapcache_context *ctx, mapcache_cache_sqlite *dcache, mapcache_tile *tile, char **path) { *path = dcache->dbfile; if(strstr(*path,"{")) { /* * generic template substitutions */ if(strstr(*path,"{tileset}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{tileset}", tile->tileset->name); if(strstr(*path,"{grid}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{grid}", tile->grid_link->grid->name); if(tile->dimensions && strstr(*path,"{dim")) { char *dimstring=""; int i = tile->dimensions->nelts; while(i--) { mapcache_requested_dimension *entry = APR_ARRAY_IDX(tile->dimensions,i,mapcache_requested_dimension*); const char *dimval = mapcache_util_str_sanitize(ctx->pool,entry->cached_value,"/.",'#'); char *single_dim = apr_pstrcat(ctx->pool,"{dim:",entry->dimension->name,"}",NULL); dimstring = apr_pstrcat(ctx->pool,dimstring,"#",dimval,NULL); if(strstr(*path,single_dim)) { *path = mapcache_util_str_replace(ctx->pool,*path, single_dim, dimval); } } *path = mapcache_util_str_replace(ctx->pool,*path, "{dim}", dimstring); } while(strstr(*path,"{z}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{z}", apr_psprintf(ctx->pool,dcache->z_fmt,tile->z)); if(dcache->count_x > 0) { while(strstr(*path,"{div_x}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{div_x}", apr_psprintf(ctx->pool,dcache->div_x_fmt,tile->x/dcache->count_x)); while(strstr(*path,"{inv_div_x}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{inv_div_x}", apr_psprintf(ctx->pool,dcache->inv_div_x_fmt,(tile->grid_link->grid->levels[tile->z]->maxx - tile->x - 1)/dcache->count_x)); while(strstr(*path,"{x}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{x}", apr_psprintf(ctx->pool,dcache->x_fmt,tile->x/dcache->count_x*dcache->count_x)); while(strstr(*path,"{inv_x}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{inv_x}", apr_psprintf(ctx->pool,dcache->inv_x_fmt,(tile->grid_link->grid->levels[tile->z]->maxx - tile->x - 1)/dcache->count_x*dcache->count_x)); } if(dcache->count_y > 0) { while(strstr(*path,"{div_y}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{div_y}", apr_psprintf(ctx->pool,dcache->div_y_fmt,tile->y/dcache->count_y)); while(strstr(*path,"{inv_div_y}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{inv_div_y}", apr_psprintf(ctx->pool,dcache->inv_div_y_fmt,(tile->grid_link->grid->levels[tile->z]->maxy - tile->y - 1)/dcache->count_y)); while(strstr(*path,"{y}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{y}", apr_psprintf(ctx->pool,dcache->y_fmt,tile->y/dcache->count_y*dcache->count_y)); while(strstr(*path,"{inv_y}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{inv_y}", apr_psprintf(ctx->pool,dcache->inv_y_fmt,(tile->grid_link->grid->levels[tile->z]->maxy - tile->y - 1)/dcache->count_y*dcache->count_y)); } } if(!*path) { ctx->set_error(ctx,500, "failed to allocate tile key"); } } /** * \brief apply appropriate tile properties to the sqlite statement */ static void _bind_sqlite_params(mapcache_context *ctx, void *vstmt, mapcache_cache_sqlite *cache, mapcache_tile *tile) { sqlite3_stmt *stmt = vstmt; int paramidx; /* tile->x */ paramidx = sqlite3_bind_parameter_index(stmt, ":x"); if (paramidx) sqlite3_bind_int(stmt, paramidx, tile->x); /* tile->y */ paramidx = sqlite3_bind_parameter_index(stmt, ":y"); if (paramidx) sqlite3_bind_int(stmt, paramidx, tile->y); /* tile->y */ paramidx = sqlite3_bind_parameter_index(stmt, ":z"); if (paramidx) sqlite3_bind_int(stmt, paramidx, tile->z); /* eventual dimensions */ paramidx = sqlite3_bind_parameter_index(stmt, ":dim"); if (paramidx) { if (tile->dimensions) { char *dim = mapcache_util_get_tile_dimkey(ctx, tile, NULL, NULL); sqlite3_bind_text(stmt, paramidx, dim, -1, SQLITE_STATIC); } else { sqlite3_bind_text(stmt, paramidx, "", -1, SQLITE_STATIC); } } /* grid */ paramidx = sqlite3_bind_parameter_index(stmt, ":grid"); if (paramidx) sqlite3_bind_text(stmt, paramidx, tile->grid_link->grid->name, -1, SQLITE_STATIC); /* tileset */ paramidx = sqlite3_bind_parameter_index(stmt, ":tileset"); if (paramidx) sqlite3_bind_text(stmt, paramidx, tile->tileset->name, -1, SQLITE_STATIC); /* tile blob data */ paramidx = sqlite3_bind_parameter_index(stmt, ":data"); if (paramidx) { int written = 0; if(cache->detect_blank) { if(!tile->raw_image) { tile->raw_image = mapcache_imageio_decode(ctx, tile->encoded_data); GC_CHECK_ERROR(ctx); } if(mapcache_image_blank_color(tile->raw_image) != MAPCACHE_FALSE) { char *buf = apr_palloc(ctx->pool, 5* sizeof(char)); buf[0] = '#'; memcpy(buf+1,tile->raw_image->data,4); written = 1; sqlite3_bind_blob(stmt, paramidx, buf, 5, SQLITE_STATIC); } } if(!written) { if (!tile->encoded_data) { tile->encoded_data = tile->tileset->format->write(ctx, tile->raw_image, tile->tileset->format); GC_CHECK_ERROR(ctx); } if (tile->encoded_data && tile->encoded_data->size) { sqlite3_bind_blob(stmt, paramidx, tile->encoded_data->buf, tile->encoded_data->size, SQLITE_STATIC); } else { sqlite3_bind_text(stmt, paramidx, "", -1, SQLITE_STATIC); } } } } static void _bind_mbtiles_params(mapcache_context *ctx, void *vstmt, mapcache_cache_sqlite *cache, mapcache_tile *tile) { sqlite3_stmt *stmt = vstmt; int paramidx; paramidx = sqlite3_bind_parameter_index(stmt, ":x"); if (paramidx) sqlite3_bind_int(stmt, paramidx, tile->x); /* tile->y */ paramidx = sqlite3_bind_parameter_index(stmt, ":y"); if (paramidx) sqlite3_bind_int(stmt, paramidx, tile->y); /* tile->y */ paramidx = sqlite3_bind_parameter_index(stmt, ":z"); if (paramidx) sqlite3_bind_int(stmt, paramidx, tile->z); /* mbtiles foreign key */ paramidx = sqlite3_bind_parameter_index(stmt, ":key"); if (paramidx) { char *key = apr_psprintf(ctx->pool,"%d-%d-%d",tile->x,tile->y,tile->z); sqlite3_bind_text(stmt, paramidx, key, -1, SQLITE_STATIC); } paramidx = sqlite3_bind_parameter_index(stmt, ":color"); if (paramidx) { char *key; assert(tile->raw_image); key = apr_psprintf(ctx->pool,"#%02x%02x%02x%02x", tile->raw_image->data[0], tile->raw_image->data[1], tile->raw_image->data[2], tile->raw_image->data[3]); sqlite3_bind_text(stmt, paramidx, key, -1, SQLITE_STATIC); } /* tile blob data */ paramidx = sqlite3_bind_parameter_index(stmt, ":data"); if (paramidx) { if (!tile->encoded_data) { tile->encoded_data = tile->tileset->format->write(ctx, tile->raw_image, tile->tileset->format); GC_CHECK_ERROR(ctx); } if (tile->encoded_data && tile->encoded_data->size) { sqlite3_bind_blob(stmt, paramidx, tile->encoded_data->buf, tile->encoded_data->size, SQLITE_STATIC); } else { sqlite3_bind_text(stmt, paramidx, "", -1, SQLITE_STATIC); } } } static int _mapcache_cache_sqlite_has_tile(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_sqlite *cache = (mapcache_cache_sqlite*) pcache; mapcache_pooled_connection *pc; struct sqlite_conn *conn; sqlite3_stmt *stmt; int ret; pc = mapcache_sqlite_get_conn(ctx,cache,tile,1); if (GC_HAS_ERROR(ctx)) { if(pc) mapcache_sqlite_release_conn(ctx, pc); if(!tile->tileset->read_only && tile->tileset->source) { /* not an error in this case, as the db file may not have been created yet */ ctx->clear_errors(ctx); } return MAPCACHE_FALSE; } conn = SQLITE_CONN(pc); stmt = conn->prepared_statements[HAS_TILE_STMT_IDX]; if(!stmt) { sqlite3_prepare(conn->handle, cache->exists_stmt.sql, -1, &conn->prepared_statements[HAS_TILE_STMT_IDX], NULL); stmt = conn->prepared_statements[HAS_TILE_STMT_IDX]; } cache->bind_stmt(ctx, stmt, cache, tile); ret = sqlite3_step(stmt); if (ret != SQLITE_DONE && ret != SQLITE_ROW) { ctx->set_error(ctx, 500, "sqlite backend failed on has_tile: %s", sqlite3_errmsg(conn->handle)); } if (ret == SQLITE_DONE) { ret = MAPCACHE_FALSE; } else if (ret == SQLITE_ROW) { ret = MAPCACHE_TRUE; } sqlite3_reset(stmt); mapcache_sqlite_release_conn(ctx, pc); return ret; } static void _mapcache_cache_sqlite_delete(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_sqlite *cache = (mapcache_cache_sqlite*) pcache; mapcache_pooled_connection *pc; struct sqlite_conn *conn; sqlite3_stmt *stmt; int ret; pc = mapcache_sqlite_get_conn(ctx,cache,tile,0); if (GC_HAS_ERROR(ctx)) { mapcache_sqlite_release_conn(ctx, pc); return; } conn = SQLITE_CONN(pc); stmt = conn->prepared_statements[SQLITE_DEL_TILE_STMT_IDX]; if(!stmt) { sqlite3_prepare(conn->handle, cache->delete_stmt.sql, -1, &conn->prepared_statements[SQLITE_DEL_TILE_STMT_IDX], NULL); stmt = conn->prepared_statements[SQLITE_DEL_TILE_STMT_IDX]; } cache->bind_stmt(ctx, stmt, cache, tile); ret = sqlite3_step(stmt); if (ret != SQLITE_DONE && ret != SQLITE_ROW) { ctx->set_error(ctx, 500, "sqlite backend failed on delete: %s", sqlite3_errmsg(conn->handle)); } sqlite3_reset(stmt); mapcache_sqlite_release_conn(ctx, pc); } static void _mapcache_cache_mbtiles_delete(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_sqlite *cache = (mapcache_cache_sqlite*) pcache; mapcache_pooled_connection *pc; struct sqlite_conn *conn; sqlite3_stmt *stmt1,*stmt2,*stmt3; int ret; const char *tile_id; size_t tile_id_size; pc = mapcache_sqlite_get_conn(ctx,cache,tile,0); if (GC_HAS_ERROR(ctx)) { mapcache_sqlite_release_conn(ctx, pc); return; } conn = SQLITE_CONN(pc); stmt1 = conn->prepared_statements[MBTILES_DEL_TILE_SELECT_STMT_IDX]; stmt2 = conn->prepared_statements[MBTILES_DEL_TILE_STMT1_IDX]; stmt3 = conn->prepared_statements[MBTILES_DEL_TILE_STMT2_IDX]; if(!stmt1) { sqlite3_prepare(conn->handle, "select tile_id from map where tile_col=:x and tile_row=:y and zoom_level=:z",-1,&conn->prepared_statements[MBTILES_DEL_TILE_SELECT_STMT_IDX], NULL); sqlite3_prepare(conn->handle, "delete from map where tile_col=:x and tile_row=:y and zoom_level=:z", -1, &conn->prepared_statements[MBTILES_DEL_TILE_STMT1_IDX], NULL); sqlite3_prepare(conn->handle, "delete from images where tile_id=:foobar", -1, &conn->prepared_statements[MBTILES_DEL_TILE_STMT2_IDX], NULL); stmt1 = conn->prepared_statements[MBTILES_DEL_TILE_SELECT_STMT_IDX]; stmt2 = conn->prepared_statements[MBTILES_DEL_TILE_STMT1_IDX]; stmt3 = conn->prepared_statements[MBTILES_DEL_TILE_STMT2_IDX]; } /* first extract tile_id from the tile we will delete. We need this because we do not know * if the tile is empty or not. * If it is empty, we will not delete the image blob data from the images table */ cache->bind_stmt(ctx, stmt1, cache, tile); do { ret = sqlite3_step(stmt1); if (ret != SQLITE_DONE && ret != SQLITE_ROW && ret != SQLITE_BUSY && ret != SQLITE_LOCKED) { ctx->set_error(ctx, 500, "sqlite backend failed on mbtile del 1: %s", sqlite3_errmsg(conn->handle)); sqlite3_reset(stmt1); mapcache_sqlite_release_conn(ctx, pc); return; } } while (ret == SQLITE_BUSY || ret == SQLITE_LOCKED); if (ret == SQLITE_DONE) { /* tile does not exist, ignore */ sqlite3_reset(stmt1); mapcache_sqlite_release_conn(ctx, pc); return; } else { tile_id = (const char*) sqlite3_column_text(stmt1, 0); tile_id_size = sqlite3_column_bytes(stmt1, 0); } /* delete the tile from the "map" table */ cache->bind_stmt(ctx,stmt2, cache, tile); ret = sqlite3_step(stmt2); if (ret != SQLITE_DONE && ret != SQLITE_ROW) { ctx->set_error(ctx, 500, "sqlite backend failed on mbtile del 2: %s", sqlite3_errmsg(conn->handle)); sqlite3_reset(stmt1); sqlite3_reset(stmt2); mapcache_sqlite_release_conn(ctx, pc); return; } if(tile_id[0] != '#') { /* the tile isn't empty, we must also delete from the images table */ int paramidx = sqlite3_bind_parameter_index(stmt3, ":foobar"); if (paramidx) { sqlite3_bind_text(stmt3, paramidx, tile_id, tile_id_size, SQLITE_STATIC); } ret = sqlite3_step(stmt3); if (ret != SQLITE_DONE && ret != SQLITE_ROW) { ctx->set_error(ctx, 500, "sqlite backend failed on mbtile del 3: %s", sqlite3_errmsg(conn->handle)); sqlite3_reset(stmt1); sqlite3_reset(stmt2); sqlite3_reset(stmt3); mapcache_sqlite_release_conn(ctx, pc); return; } } sqlite3_reset(stmt1); sqlite3_reset(stmt2); sqlite3_reset(stmt3); mapcache_sqlite_release_conn(ctx, pc); } static void _single_mbtile_set(mapcache_context *ctx, mapcache_cache_sqlite *cache, mapcache_tile *tile, struct sqlite_conn *conn) { sqlite3_stmt *stmt1,*stmt2; int ret; if(!tile->raw_image) { tile->raw_image = mapcache_imageio_decode(ctx, tile->encoded_data); GC_CHECK_ERROR(ctx); } if(mapcache_image_blank_color(tile->raw_image) != MAPCACHE_FALSE) { stmt1 = conn->prepared_statements[MBTILES_SET_EMPTY_TILE_STMT1_IDX]; stmt2 = conn->prepared_statements[MBTILES_SET_EMPTY_TILE_STMT2_IDX]; if(!stmt1) { sqlite3_prepare(conn->handle, "insert or ignore into images(tile_id,tile_data) values (:color,:data);", -1, &conn->prepared_statements[MBTILES_SET_EMPTY_TILE_STMT1_IDX], NULL); sqlite3_prepare(conn->handle, "insert or replace into map(tile_column,tile_row,zoom_level,tile_id) values (:x,:y,:z,:color);", -1, &conn->prepared_statements[MBTILES_SET_EMPTY_TILE_STMT2_IDX], NULL); stmt1 = conn->prepared_statements[MBTILES_SET_EMPTY_TILE_STMT1_IDX]; stmt2 = conn->prepared_statements[MBTILES_SET_EMPTY_TILE_STMT2_IDX]; } cache->bind_stmt(ctx, stmt1, cache, tile); cache->bind_stmt(ctx, stmt2, cache, tile); } else { stmt1 = conn->prepared_statements[MBTILES_SET_TILE_STMT1_IDX]; stmt2 = conn->prepared_statements[MBTILES_SET_TILE_STMT2_IDX]; if(!stmt1) { sqlite3_prepare(conn->handle, "insert or replace into images(tile_id,tile_data) values (:key,:data);", -1, &conn->prepared_statements[MBTILES_SET_TILE_STMT1_IDX], NULL); sqlite3_prepare(conn->handle, "insert or replace into map(tile_column,tile_row,zoom_level,tile_id) values (:x,:y,:z,:key);", -1, &conn->prepared_statements[MBTILES_SET_TILE_STMT2_IDX], NULL); stmt1 = conn->prepared_statements[MBTILES_SET_TILE_STMT1_IDX]; stmt2 = conn->prepared_statements[MBTILES_SET_TILE_STMT2_IDX]; } cache->bind_stmt(ctx, stmt1, cache, tile); cache->bind_stmt(ctx, stmt2, cache, tile); } do { ret = sqlite3_step(stmt1); if (ret != SQLITE_DONE && ret != SQLITE_ROW && ret != SQLITE_BUSY && ret != SQLITE_LOCKED) { ctx->set_error(ctx, 500, "mbtiles backend failed on image set: %s (%d)", sqlite3_errmsg(conn->handle), ret); break; } if (ret == SQLITE_BUSY) { sqlite3_reset(stmt1); } } while (ret == SQLITE_BUSY || ret == SQLITE_LOCKED); if(ret == SQLITE_DONE) { do { ret = sqlite3_step(stmt2); if (ret != SQLITE_DONE && ret != SQLITE_ROW && ret != SQLITE_BUSY && ret != SQLITE_LOCKED) { ctx->set_error(ctx, 500, "mbtiles backend failed on map set: %s (%d)", sqlite3_errmsg(conn->handle), ret); break; } if (ret == SQLITE_BUSY) { sqlite3_reset(stmt2); } } while (ret == SQLITE_BUSY || ret == SQLITE_LOCKED); } sqlite3_reset(stmt1); sqlite3_reset(stmt2); } static int _mapcache_cache_sqlite_get(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_sqlite *cache = (mapcache_cache_sqlite*) pcache; struct sqlite_conn *conn; sqlite3_stmt *stmt; int ret; mapcache_pooled_connection *pc = mapcache_sqlite_get_conn(ctx,cache,tile,1); if (GC_HAS_ERROR(ctx)) { if(tile->tileset->read_only || !tile->tileset->source) { mapcache_sqlite_release_conn(ctx, pc); return MAPCACHE_FAILURE; } else { /* not an error in this case, as the db file may not have been created yet */ ctx->clear_errors(ctx); mapcache_sqlite_release_conn(ctx, pc); return MAPCACHE_CACHE_MISS; } } conn = SQLITE_CONN(pc); stmt = conn->prepared_statements[GET_TILE_STMT_IDX]; if(!stmt) { sqlite3_prepare(conn->handle, cache->get_stmt.sql, -1, &conn->prepared_statements[GET_TILE_STMT_IDX], NULL); stmt = conn->prepared_statements[GET_TILE_STMT_IDX]; } cache->bind_stmt(ctx, stmt, cache, tile); do { ret = sqlite3_step(stmt); if (ret != SQLITE_DONE && ret != SQLITE_ROW && ret != SQLITE_BUSY && ret != SQLITE_LOCKED) { ctx->set_error(ctx, 500, "sqlite backend failed on get: %s", sqlite3_errmsg(conn->handle)); sqlite3_reset(stmt); mapcache_sqlite_release_conn(ctx, pc); return MAPCACHE_FAILURE; } } while (ret == SQLITE_BUSY || ret == SQLITE_LOCKED); if (ret == SQLITE_DONE) { sqlite3_reset(stmt); mapcache_sqlite_release_conn(ctx, pc); return MAPCACHE_CACHE_MISS; } else { const void *blob = sqlite3_column_blob(stmt, 0); int size = sqlite3_column_bytes(stmt, 0); if(size>0 && ((char*)blob)[0] == '#') { tile->encoded_data = mapcache_empty_png_decode(ctx,tile->grid_link->grid->tile_sx, tile->grid_link->grid->tile_sy ,blob,&tile->nodata); } else { tile->encoded_data = mapcache_buffer_create(size, ctx->pool); memcpy(tile->encoded_data->buf, blob, size); tile->encoded_data->size = size; } if (sqlite3_column_count(stmt) > 1) { time_t mtime = sqlite3_column_int64(stmt, 1); apr_time_ansi_put(&(tile->mtime), mtime); } sqlite3_reset(stmt); mapcache_sqlite_release_conn(ctx, pc); return MAPCACHE_SUCCESS; } } static void _single_sqlitetile_set(mapcache_context *ctx, mapcache_cache_sqlite *cache, mapcache_tile *tile, struct sqlite_conn *conn) { sqlite3_stmt *stmt = conn->prepared_statements[SQLITE_SET_TILE_STMT_IDX]; int ret; if(!stmt) { sqlite3_prepare(conn->handle, cache->set_stmt.sql, -1, &conn->prepared_statements[SQLITE_SET_TILE_STMT_IDX], NULL); stmt = conn->prepared_statements[SQLITE_SET_TILE_STMT_IDX]; } cache->bind_stmt(ctx, stmt, cache, tile); do { ret = sqlite3_step(stmt); if (ret != SQLITE_DONE && ret != SQLITE_ROW && ret != SQLITE_BUSY && ret != SQLITE_LOCKED) { ctx->set_error(ctx, 500, "sqlite backend failed on set: %s (%d)", sqlite3_errmsg(conn->handle), ret); break; } if (ret == SQLITE_BUSY) { sqlite3_reset(stmt); } } while (ret == SQLITE_BUSY || ret == SQLITE_LOCKED); sqlite3_reset(stmt); } static void _mapcache_cache_sqlite_set(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_sqlite *cache = (mapcache_cache_sqlite*)pcache; struct sqlite_conn *conn; mapcache_pooled_connection *pc = mapcache_sqlite_get_conn(ctx,cache,tile,0); if (GC_HAS_ERROR(ctx)) { mapcache_sqlite_release_conn(ctx, pc); return; } conn = SQLITE_CONN(pc); sqlite3_exec(conn->handle, "BEGIN TRANSACTION", 0, 0, 0); _single_sqlitetile_set(ctx,cache, tile,conn); if (GC_HAS_ERROR(ctx)) { sqlite3_exec(conn->handle, "ROLLBACK TRANSACTION", 0, 0, 0); } else { sqlite3_exec(conn->handle, "END TRANSACTION", 0, 0, 0); } mapcache_sqlite_release_conn(ctx, pc); } static void _mapcache_cache_sqlite_multi_set(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tiles, int ntiles) { mapcache_cache_sqlite *cache = (mapcache_cache_sqlite*)pcache; int i; struct sqlite_conn *conn; mapcache_pooled_connection *pc = mapcache_sqlite_get_conn(ctx,cache,&tiles[0],0); if (GC_HAS_ERROR(ctx)) { mapcache_sqlite_release_conn(ctx, pc); return; } conn = SQLITE_CONN(pc); sqlite3_exec(conn->handle, "BEGIN TRANSACTION", 0, 0, 0); for (i = 0; i < ntiles; i++) { mapcache_tile *tile = &tiles[i]; _single_sqlitetile_set(ctx,cache, tile,conn); if(GC_HAS_ERROR(ctx)) break; } if (GC_HAS_ERROR(ctx)) { sqlite3_exec(conn->handle, "ROLLBACK TRANSACTION", 0, 0, 0); } else { sqlite3_exec(conn->handle, "END TRANSACTION", 0, 0, 0); } mapcache_sqlite_release_conn(ctx, pc); } static void _mapcache_cache_mbtiles_set(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { mapcache_cache_sqlite *cache = (mapcache_cache_sqlite*)pcache; struct sqlite_conn *conn; mapcache_pooled_connection *pc = mapcache_sqlite_get_conn(ctx,cache,tile,0); if (GC_HAS_ERROR(ctx)) { mapcache_sqlite_release_conn(ctx, pc); return; } conn = SQLITE_CONN(pc); if(!tile->raw_image) { tile->raw_image = mapcache_imageio_decode(ctx, tile->encoded_data); if(GC_HAS_ERROR(ctx)) { mapcache_sqlite_release_conn(ctx, pc); return; } } sqlite3_exec(conn->handle, "BEGIN TRANSACTION", 0, 0, 0); _single_mbtile_set(ctx, cache, tile,conn); if (GC_HAS_ERROR(ctx)) { sqlite3_exec(conn->handle, "ROLLBACK TRANSACTION", 0, 0, 0); } else { sqlite3_exec(conn->handle, "END TRANSACTION", 0, 0, 0); } mapcache_sqlite_release_conn(ctx, pc); } static void _mapcache_cache_mbtiles_multi_set(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tiles, int ntiles) { int i; mapcache_cache_sqlite *cache = (mapcache_cache_sqlite*)pcache; mapcache_pooled_connection *pc; struct sqlite_conn *conn; /* decode/encode image data before going into the sqlite write lock */ for (i = 0; i < ntiles; i++) { mapcache_tile *tile = &tiles[i]; if(!tile->raw_image) { tile->raw_image = mapcache_imageio_decode(ctx, tile->encoded_data); GC_CHECK_ERROR(ctx); } /* only encode to image format if tile is not blank */ if (mapcache_image_blank_color(tile->raw_image) != MAPCACHE_TRUE && !tile->encoded_data) { tile->encoded_data = tile->tileset->format->write(ctx, tile->raw_image, tile->tileset->format); GC_CHECK_ERROR(ctx); } } pc = mapcache_sqlite_get_conn(ctx,cache,&tiles[0],0); if (GC_HAS_ERROR(ctx)) { mapcache_sqlite_release_conn(ctx, pc); return; } conn = SQLITE_CONN(pc); sqlite3_exec(conn->handle, "BEGIN TRANSACTION", 0, 0, 0); for (i = 0; i < ntiles; i++) { mapcache_tile *tile = &tiles[i]; _single_mbtile_set(ctx,cache,tile,conn); if(GC_HAS_ERROR(ctx)) break; } if (GC_HAS_ERROR(ctx)) { sqlite3_exec(conn->handle, "ROLLBACK TRANSACTION", 0, 0, 0); } else { sqlite3_exec(conn->handle, "END TRANSACTION", 0, 0, 0); } mapcache_sqlite_release_conn(ctx, pc); } static void _mapcache_cache_sqlite_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_cache *pcache, mapcache_cfg *config) { ezxml_t cur_node; mapcache_cache_sqlite *cache; sqlite3_initialize(); sqlite3_config(SQLITE_CONFIG_MULTITHREAD); cache = (mapcache_cache_sqlite*) pcache; if ((cur_node = ezxml_child(node, "base")) != NULL) { ctx->set_error(ctx, 500, "sqlite config not supported anymore, use "); return; } if ((cur_node = ezxml_child(node, "dbname_template")) != NULL) { ctx->set_error(ctx, 500, "sqlite config not supported anymore, use a \"multi-sqlite3\" cache type"); return; } if ((cur_node = ezxml_child(node, "dbfile")) != NULL) { char *fmt; cache->dbfile = apr_pstrdup(ctx->pool, cur_node->txt); fmt = (char*)ezxml_attr(cur_node,"x_fmt"); if(fmt && *fmt) { cache->x_fmt = apr_pstrdup(ctx->pool,fmt); } fmt = (char*)ezxml_attr(cur_node,"y_fmt"); if(fmt && *fmt) { cache->y_fmt = apr_pstrdup(ctx->pool,fmt); } fmt = (char*)ezxml_attr(cur_node,"z_fmt"); if(fmt && *fmt) { cache->z_fmt = apr_pstrdup(ctx->pool,fmt); } fmt = (char*)ezxml_attr(cur_node,"inv_x_fmt"); if(fmt && *fmt) { cache->inv_x_fmt = apr_pstrdup(ctx->pool,fmt); } fmt = (char*)ezxml_attr(cur_node,"inv_y_fmt"); if(fmt && *fmt) { cache->inv_y_fmt = apr_pstrdup(ctx->pool,fmt); } fmt = (char*)ezxml_attr(cur_node,"div_x_fmt"); if(fmt && *fmt) { cache->div_x_fmt = apr_pstrdup(ctx->pool,fmt); } fmt = (char*)ezxml_attr(cur_node,"div_y_fmt"); if(fmt && *fmt) { cache->div_y_fmt = apr_pstrdup(ctx->pool,fmt); } fmt = (char*)ezxml_attr(cur_node,"inv_div_x_fmt"); if(fmt && *fmt) { cache->inv_div_x_fmt = apr_pstrdup(ctx->pool,fmt); } fmt = (char*)ezxml_attr(cur_node,"inv_div_y_fmt"); if(fmt && *fmt) { cache->inv_div_y_fmt = apr_pstrdup(ctx->pool,fmt); } } cache->detect_blank = 0; if ((cur_node = ezxml_child(node, "detect_blank")) != NULL) { if(strcasecmp(cur_node->txt,"false")) { cache->detect_blank = 1; } } if ((cur_node = ezxml_child(node, "hitstats")) != NULL) { if (!strcasecmp(cur_node->txt, "true")) { ctx->set_error(ctx, 500, "sqlite config not supported anymore"); } } if ((cur_node = ezxml_child(node, "pragma")) != NULL) { cache->pragmas = apr_table_make(ctx->pool,1); while(cur_node) { char *name = (char*)ezxml_attr(cur_node,"name"); if(!name || !cur_node->txt || !strlen(cur_node->txt)) { ctx->set_error(ctx,500," missing name attribute"); return; } apr_table_set(cache->pragmas,name,cur_node->txt); cur_node = cur_node->next; } } if ((cur_node = ezxml_child(node, "queries")) != NULL) { ezxml_t query_node; if ((query_node = ezxml_child(cur_node, "exists")) != NULL) { cache->exists_stmt.sql = apr_pstrdup(ctx->pool,query_node->txt); } if ((query_node = ezxml_child(cur_node, "get")) != NULL) { cache->get_stmt.sql = apr_pstrdup(ctx->pool,query_node->txt); } if ((query_node = ezxml_child(cur_node, "set")) != NULL) { cache->set_stmt.sql = apr_pstrdup(ctx->pool,query_node->txt); } if ((query_node = ezxml_child(cur_node, "delete")) != NULL) { cache->delete_stmt.sql = apr_pstrdup(ctx->pool,query_node->txt); } if ((query_node = ezxml_child(cur_node, "create")) != NULL) { cache->create_stmt.sql = apr_pstrdup(ctx->pool,query_node->txt); } } cur_node = ezxml_child(node,"xcount"); if(cur_node && cur_node->txt && *cur_node->txt) { char *endptr; cache->count_x = (int)strtol(cur_node->txt,&endptr,10); if(*endptr != 0) { ctx->set_error(ctx,400,"failed to parse xcount value %s for sqlite cache %s", cur_node->txt,cache->cache.name); return; } } cur_node = ezxml_child(node,"ycount"); if(cur_node && cur_node->txt && *cur_node->txt) { char *endptr; cache->count_y = (int)strtol(cur_node->txt,&endptr,10); if(*endptr != 0) { ctx->set_error(ctx,400,"failed to parse ycount value %s for sqlite cache %s", cur_node->txt,cache->cache.name); return; } } } /** * \private \memberof mapcache_cache_sqlite */ static void _mapcache_cache_sqlite_configuration_post_config(mapcache_context *ctx, mapcache_cache *pcache, mapcache_cfg *cfg) { mapcache_cache_sqlite *cache = (mapcache_cache_sqlite*)pcache; if (!cache->dbfile) { ctx->set_error(ctx, 500, "sqlite cache \"%s\" is missing entry", pcache->name); return; } } /** * \private \memberof mapcache_cache_sqlite */ static void _mapcache_cache_mbtiles_configuration_post_config(mapcache_context *ctx, mapcache_cache *pcache, mapcache_cfg *cfg) { /* check that only one tileset/grid references this cache, as mbtiles does not support multiple tilesets/grids per cache */ #ifdef FIXME int nrefs = 0; apr_hash_index_t *tileseti = apr_hash_first(ctx->pool,cfg->tilesets); while(tileseti) { mapcache_tileset *tileset; const void *key; apr_ssize_t keylen; apr_hash_this(tileseti,&key,&keylen,(void**)&tileset); if(tileset->cache == cache) { nrefs++; if(nrefs>1) { ctx->set_error(ctx,500,"mbtiles cache %s is referenced by more than 1 tileset, which is not supported",cache->name); return; } if(tileset->grid_links->nelts > 1) { ctx->set_error(ctx,500,"mbtiles cache %s is referenced by tileset %s which has more than 1 grid, which is not supported",cache->name,tileset->name); return; } } tileseti = apr_hash_next(tileseti); } #endif } mapcache_cache* mapcache_cache_sqlite_create(mapcache_context *ctx) { mapcache_cache_sqlite *cache = apr_pcalloc(ctx->pool, sizeof (mapcache_cache_sqlite)); if (!cache) { ctx->set_error(ctx, 500, "failed to allocate sqlite cache"); return NULL; } cache->cache.metadata = apr_table_make(ctx->pool, 3); cache->cache.type = MAPCACHE_CACHE_SQLITE; cache->cache._tile_delete = _mapcache_cache_sqlite_delete; cache->cache._tile_get = _mapcache_cache_sqlite_get; cache->cache._tile_exists = _mapcache_cache_sqlite_has_tile; cache->cache._tile_set = _mapcache_cache_sqlite_set; cache->cache._tile_multi_set = _mapcache_cache_sqlite_multi_set; cache->cache.configuration_post_config = _mapcache_cache_sqlite_configuration_post_config; cache->cache.configuration_parse_xml = _mapcache_cache_sqlite_configuration_parse_xml; cache->create_stmt.sql = apr_pstrdup(ctx->pool, "create table if not exists tiles(tileset text, grid text, x integer, y integer, z integer, data blob, dim text, ctime datetime, primary key(tileset,grid,x,y,z,dim))"); cache->exists_stmt.sql = apr_pstrdup(ctx->pool, "select 1 from tiles where x=:x and y=:y and z=:z and dim=:dim and tileset=:tileset and grid=:grid"); cache->get_stmt.sql = apr_pstrdup(ctx->pool, "select data,strftime(\"%s\",ctime) from tiles where tileset=:tileset and grid=:grid and x=:x and y=:y and z=:z and dim=:dim"); cache->set_stmt.sql = apr_pstrdup(ctx->pool, "insert or replace into tiles(tileset,grid,x,y,z,data,dim,ctime) values (:tileset,:grid,:x,:y,:z,:data,:dim,datetime('now'))"); cache->delete_stmt.sql = apr_pstrdup(ctx->pool, "delete from tiles where x=:x and y=:y and z=:z and dim=:dim and tileset=:tileset and grid=:grid"); cache->n_prepared_statements = 4; cache->bind_stmt = _bind_sqlite_params; cache->detect_blank = 1; cache->x_fmt = cache->y_fmt = cache->z_fmt = cache->inv_x_fmt = cache->inv_y_fmt = cache->div_x_fmt = cache->div_y_fmt = cache->inv_div_x_fmt = cache->inv_div_y_fmt = apr_pstrdup(ctx->pool,"%d"); cache->count_x = cache->count_y = -1; return (mapcache_cache*)cache; } /** * \brief creates and initializes a mapcache_sqlite_cache */ mapcache_cache* mapcache_cache_mbtiles_create(mapcache_context *ctx) { mapcache_cache_sqlite *cache = (mapcache_cache_sqlite*) mapcache_cache_sqlite_create(ctx); if (!cache) { return NULL; } cache->cache.configuration_post_config = _mapcache_cache_mbtiles_configuration_post_config; cache->cache._tile_set = _mapcache_cache_mbtiles_set; cache->cache._tile_multi_set = _mapcache_cache_mbtiles_multi_set; cache->cache._tile_delete = _mapcache_cache_mbtiles_delete; cache->create_stmt.sql = apr_pstrdup(ctx->pool, "create table if not exists images(tile_id text, tile_data blob, primary key(tile_id));"\ "CREATE TABLE IF NOT EXISTS map (zoom_level integer, tile_column integer, tile_row integer, tile_id text, foreign key(tile_id) references images(tile_id), primary key(tile_row,tile_column,zoom_level));"\ "create table if not exists metadata(name text, value text);"\ "create view if not exists tiles AS SELECT map.zoom_level AS zoom_level, map.tile_column AS tile_column, map.tile_row AS tile_row, images.tile_data AS tile_data FROM map JOIN images ON images.tile_id = map.tile_id;" ); cache->exists_stmt.sql = apr_pstrdup(ctx->pool, "select 1 from tiles where tile_column=:x and tile_row=:y and zoom_level=:z"); cache->get_stmt.sql = apr_pstrdup(ctx->pool, "select tile_data from tiles where tile_column=:x and tile_row=:y and zoom_level=:z"); cache->delete_stmt.sql = apr_pstrdup(ctx->pool, "delete from tiles where tile_column=:x and tile_row=:y and zoom_level=:z"); cache->n_prepared_statements = 9; cache->bind_stmt = _bind_mbtiles_params; return (mapcache_cache*) cache; } #else mapcache_cache* mapcache_cache_sqlite_create(mapcache_context *ctx) { ctx->set_error(ctx,400,"SQLITE support not compiled in this version"); return NULL; } mapcache_cache* mapcache_cache_mbtiles_create(mapcache_context *ctx) { ctx->set_error(ctx,400,"SQLITE (MBtiles) support not compiled in this version"); return NULL; } #endif /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/cache_tiff.c000066400000000000000000001337611316353564100170450ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching: tiled tiff filesytem cache backend. * Author: Thomas Bonfort * Frank Warmerdam * Even Rouault * MapServer team. * ****************************************************************************** * Copyright (c) 2011-2017 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #ifdef USE_TIFF #include #include #include #include #include #include #include #ifdef USE_GDAL #include "cpl_vsi.h" #include "cpl_conv.h" #define CPL_SERV_H_INCLUDED #endif #ifdef USE_GEOTIFF #include "xtiffio.h" #include "geovalues.h" #include "geotiff.h" #include "geo_normalize.h" #include "geo_tiffp.h" #include "geo_keyp.h" #define MyTIFFOpen XTIFFOpen #define MyTIFFClose XTIFFClose #else #define MyTIFFOpen TIFFOpen #define MyTIFFClose TIFFClose #endif typedef enum { MAPCACHE_TIFF_STORAGE_FILE, MAPCACHE_TIFF_STORAGE_REST, MAPCACHE_TIFF_STORAGE_GOOGLE } mapcache_cache_tiff_storage_type; typedef struct mapcache_cache_tiff mapcache_cache_tiff; struct mapcache_cache_tiff { mapcache_cache cache; char *filename_template; char *x_fmt,*y_fmt,*z_fmt,*inv_x_fmt,*inv_y_fmt,*div_x_fmt,*div_y_fmt,*inv_div_x_fmt,*inv_div_y_fmt; int count_x; int count_y; mapcache_image_format_jpeg *format; mapcache_locker *locker; struct { mapcache_cache_tiff_storage_type type; int connection_timeout; int timeout; char *header_file; union { struct { char* access; char* secret; } google; } u; } storage; }; #ifdef USE_GDAL static tsize_t _tiffReadProc( thandle_t th, tdata_t buf, tsize_t size ) { VSILFILE* fp = (VSILFILE*)th; return VSIFReadL( buf, 1, size, fp ); } static tsize_t _tiffWriteProc( thandle_t th, tdata_t buf, tsize_t size ) { VSILFILE* fp = (VSILFILE*)th; return VSIFWriteL( buf, 1, size, fp ); } static toff_t _tiffSeekProc( thandle_t th, toff_t off, int whence ) { VSILFILE* fp = (VSILFILE*)th; if( VSIFSeekL( fp, off, whence ) != 0 ) { TIFFErrorExt( th, "_tiffSeekProc", "%s", VSIStrerror( errno ) ); return (toff_t)( -1 ); } return VSIFTellL( fp ); } static int _tiffCloseProc( thandle_t th ) { VSILFILE* fp = (VSILFILE*)th; VSIFCloseL(fp); return 0; } static toff_t _tiffSizeProc( thandle_t th ) { vsi_l_offset old_off; toff_t file_size; VSILFILE* fp = (VSILFILE*)th; old_off = VSIFTellL( fp ); (void)VSIFSeekL( fp, 0, SEEK_END ); file_size = (toff_t) VSIFTellL( fp ); (void)VSIFSeekL( fp, old_off, SEEK_SET ); return file_size; } static int _tiffMapProc( thandle_t th, tdata_t* pbase, toff_t* psize ) { (void)th; (void)pbase; (void)psize; /* Unimplemented */ return 0; } static void _tiffUnmapProc( thandle_t th, tdata_t base, toff_t size ) { (void)th; (void)base; (void)size; /* Unimplemented */ } static char* set_conf_value(const char* key, const char* value) { const char* old_val_const; char* old_val = NULL; old_val_const = CPLGetConfigOption(key, NULL); if( old_val_const != NULL ) old_val = strdup(old_val_const); /* Prevent a directory listing to be done */ CPLSetConfigOption(key, value); return old_val; } static void restore_conf_value(const char* key, char* old_val) { CPLSetConfigOption(key, old_val); free(old_val); } typedef struct { char* old_val_disable_readdir; char* old_val_headerfile; char* old_val_secret; char* old_val_access; } mapache_gdal_env_context; static void set_gdal_context(mapcache_cache_tiff *cache, mapache_gdal_env_context* pcontext) { memset(pcontext, 0, sizeof(mapache_gdal_env_context)); /* Prevent a directory listing to be done */ pcontext->old_val_disable_readdir = set_conf_value("GDAL_DISABLE_READDIR_ON_OPEN", "YES"); if( cache->storage.header_file ) { pcontext->old_val_headerfile = set_conf_value("GDAL_HTTP_HEADER_FILE", cache->storage.header_file); } if( cache->storage.type == MAPCACHE_TIFF_STORAGE_GOOGLE ) { pcontext->old_val_secret = set_conf_value("GS_SECRET_ACCESS_KEY", cache->storage.u.google.secret); pcontext->old_val_access = set_conf_value("GS_ACCESS_KEY_ID", cache->storage.u.google.access); } } static void restore_gdal_context(mapcache_cache_tiff *cache, mapache_gdal_env_context* pcontext) { restore_conf_value("GDAL_DISABLE_READDIR_ON_OPEN", pcontext->old_val_disable_readdir); if( cache->storage.header_file ) { restore_conf_value("GDAL_HTTP_HEADER_FILE", pcontext->old_val_headerfile); } if( cache->storage.type == MAPCACHE_TIFF_STORAGE_GOOGLE ) { restore_conf_value("GS_SECRET_ACCESS_KEY", pcontext->old_val_secret); restore_conf_value("GS_ACCESS_KEY_ID", pcontext->old_val_access); } } static int mapcache_cache_tiff_vsi_stat( mapcache_cache_tiff *cache, const char* name, VSIStatBufL* pstat) { mapache_gdal_env_context context; int ret; set_gdal_context(cache, &context); ret = VSIStatL(name, pstat); restore_gdal_context(cache, &context); return ret; } static VSILFILE* mapcache_cache_tiff_vsi_open( mapcache_cache_tiff *cache, const char* name, const char* mode ) { mapache_gdal_env_context context; VSILFILE* fp; set_gdal_context(cache, &context); fp = VSIFOpenL(name, mode); restore_gdal_context(cache, &context); return fp; } static TIFF* mapcache_cache_tiff_open(mapcache_context *ctx, mapcache_cache_tiff *cache, const char* name, const char* mode ) { char chDummy; VSILFILE* fp; /* If writing or using a regular filename, then use standard */ /* libtiff/libgeotiff I/O layer */ if( strcmp(mode, "r") != 0 || strncmp(name, "/vsi", 4) != 0 ) { return MyTIFFOpen(name, mode); } fp = mapcache_cache_tiff_vsi_open(cache, name, mode); if( fp == NULL ) return NULL; if( strcmp(mode, "r") == 0 ) { /* But then the file descriptor may point to an invalid resource */ /* so try reading a byte from it */ if(VSIFReadL(&chDummy, 1, 1, fp) != 1) { VSIFCloseL(fp); return NULL; } VSIFSeekL(fp, 0, SEEK_SET); } return #ifdef USE_GEOTIFF XTIFFClientOpen #else TIFFClientOpen #endif ( name, mode, (thandle_t) fp, _tiffReadProc, _tiffWriteProc, _tiffSeekProc, _tiffCloseProc, _tiffSizeProc, _tiffMapProc, _tiffUnmapProc ); } static void CPL_STDCALL mapcache_cache_tiff_gdal_error_handler(CPLErr eErr, int error_num, const char* pszMsg) { #ifdef DEBUG mapcache_context *ctx = (mapcache_context *) CPLGetErrorHandlerUserData(); ctx->log(ctx,MAPCACHE_DEBUG,"GDAL %s, %d: %s", (eErr == CE_Failure) ? "Failure": (eErr == CE_Warning) ? "Warning": "Debug", error_num, pszMsg); #endif } #else static TIFF* mapcache_cache_tiff_open(mapcache_context *ctx, mapcache_cache_tiff *cache, const char* name, const char* mode ) { (void)ctx; (void)cache; return MyTIFFOpen(name, mode); } #endif /* USE_GDAL */ #undef MyTIFFOpen /** * \brief return filename for given tile * * \param tile the tile to get the key from * \param path pointer to a char* that will contain the filename * \param r * \private \memberof mapcache_cache_tiff */ static void _mapcache_cache_tiff_tile_key(mapcache_context *ctx, mapcache_cache_tiff *cache, mapcache_tile *tile, char **path) { if( cache->storage.type == MAPCACHE_TIFF_STORAGE_REST ) { *path = apr_pstrcat(ctx->pool, "/vsicurl/", cache->filename_template, NULL); } else if( cache->storage.type == MAPCACHE_TIFF_STORAGE_GOOGLE && strncmp(cache->filename_template, "https://storage.googleapis.com/", strlen("https://storage.googleapis.com/")) == 0) { *path = apr_pstrcat(ctx->pool, "/vsigs/", cache->filename_template + strlen("https://storage.googleapis.com/"), NULL); } else { *path = apr_pstrdup(ctx->pool, cache->filename_template); } /* * generic template substitutions */ if(strstr(*path,"{tileset}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{tileset}", tile->tileset->name); if(strstr(*path,"{grid}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{grid}", tile->grid_link->grid->name); if(tile->dimensions && strstr(*path,"{dim")) { char *dimstring=""; int i = tile->dimensions->nelts; while(i--) { mapcache_requested_dimension *rdim = APR_ARRAY_IDX(tile->dimensions,i,mapcache_requested_dimension*); const char *dimval = mapcache_util_str_sanitize(ctx->pool,rdim->cached_value,"/.",'#'); char *dim_key = apr_pstrcat(ctx->pool,"{dim:",rdim->dimension->name,"}",NULL); dimstring = apr_pstrcat(ctx->pool,dimstring,"#",dimval,NULL); if(strstr(*path,dim_key)) { *path = mapcache_util_str_replace(ctx->pool,*path, dim_key, dimval); } } *path = mapcache_util_str_replace(ctx->pool,*path, "{dim}", dimstring); } while(strstr(*path,"{z}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{z}", apr_psprintf(ctx->pool,cache->z_fmt,tile->z)); /* * x and y replacing, when the tiff files are numbered with an increasing * x,y scheme (adjacent tiffs have x-x'=1 or y-y'=1 */ while(strstr(*path,"{div_x}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{div_x}", apr_psprintf(ctx->pool,cache->div_x_fmt,tile->x/cache->count_x)); while(strstr(*path,"{div_y}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{div_y}", apr_psprintf(ctx->pool,cache->div_y_fmt,tile->y/cache->count_y)); while(strstr(*path,"{inv_div_y}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{inv_div_y}", apr_psprintf(ctx->pool,cache->inv_div_y_fmt,(tile->grid_link->grid->levels[tile->z]->maxy - tile->y - 1)/cache->count_y)); while(strstr(*path,"{inv_div_x}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{inv_div_x}", apr_psprintf(ctx->pool,cache->inv_div_x_fmt,(tile->grid_link->grid->levels[tile->z]->maxx - tile->x - 1)/cache->count_x)); /* * x and y replacing, when the tiff files are numbered with the index * of their bottom-left tile * adjacent tiffs have x-x'=count_x or y-y'=count_y */ while(strstr(*path,"{x}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{x}", apr_psprintf(ctx->pool,cache->x_fmt,tile->x/cache->count_x*cache->count_x)); while(strstr(*path,"{y}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{y}", apr_psprintf(ctx->pool,cache->y_fmt,tile->y/cache->count_y*cache->count_y)); while(strstr(*path,"{inv_y}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{inv_y}", apr_psprintf(ctx->pool,cache->inv_y_fmt,(tile->grid_link->grid->levels[tile->z]->maxy - tile->y - 1)/cache->count_y*cache->count_y)); while(strstr(*path,"{inv_x}")) *path = mapcache_util_str_replace(ctx->pool,*path, "{inv_x}", apr_psprintf(ctx->pool,cache->inv_x_fmt,(tile->grid_link->grid->levels[tile->z]->maxx - tile->x - 1)/cache->count_x*cache->count_y)); if(!*path) { ctx->set_error(ctx,500, "failed to allocate tile key"); } } #ifdef DEBUG static void check_tiff_format(mapcache_context *ctx, mapcache_cache_tiff *cache, mapcache_tile *tile, TIFF *hTIFF, const char *filename) { uint32 imwidth,imheight,tilewidth,tileheight; int16 planarconfig,orientation; uint16 compression; uint16 photometric; int rv; mapcache_grid_level *level; int ntilesx; int ntilesy; TIFFGetField( hTIFF, TIFFTAG_IMAGEWIDTH, &imwidth ); TIFFGetField( hTIFF, TIFFTAG_IMAGELENGTH, &imheight ); TIFFGetField( hTIFF, TIFFTAG_TILEWIDTH, &tilewidth ); TIFFGetField( hTIFF, TIFFTAG_TILELENGTH, &tileheight ); /* Test that the TIFF is tiled and not stripped */ if(!TIFFIsTiled(hTIFF)) { ctx->set_error(ctx,500,"TIFF file \"%s\" is not tiled", filename); return; } /* check we have jpeg compression */ rv = TIFFGetField( hTIFF, TIFFTAG_COMPRESSION, &compression ); if(rv == 1 && compression != COMPRESSION_JPEG) { ctx->set_error(ctx,500,"TIFF file \"%s\" is not jpeg compressed", filename); return; } /* tiff must be pixel interleaved, not with a single image per band */ rv = TIFFGetField( hTIFF, TIFFTAG_PLANARCONFIG, &planarconfig ); if(rv == 1 && planarconfig != PLANARCONFIG_CONTIG) { ctx->set_error(ctx,500,"TIFF file \"%s\" is not pixel interleaved", filename); return; } /* is this test needed once we now we have JPEG ? */ rv = TIFFGetField( hTIFF, TIFFTAG_PHOTOMETRIC, &photometric ); if(rv == 1 && (photometric != PHOTOMETRIC_RGB && photometric != PHOTOMETRIC_YCBCR)) { ctx->set_error(ctx,500,"TIFF file \"%s\" is not RGB: %d", filename); return; } /* the default is top-left, but check just in case */ rv = TIFFGetField( hTIFF, TIFFTAG_ORIENTATION, &orientation ); if(rv == 1 && orientation != ORIENTATION_TOPLEFT) { ctx->set_error(ctx,500,"TIFF file \"%s\" is not top-left oriented", filename); return; } /* check that the tiff internal tiling aligns with the mapcache_grid we are using: * - the tiff tile size must match the grid tile size * - the number of tiles in each direction in the tiff must match what has been * configured for the cache */ level = tile->grid_link->grid->levels[tile->z]; ntilesx = MAPCACHE_MIN(cache->count_x, level->maxx); ntilesy = MAPCACHE_MIN(cache->count_y, level->maxy); if( tilewidth != tile->grid_link->grid->tile_sx || tileheight != tile->grid_link->grid->tile_sy || imwidth != tile->grid_link->grid->tile_sx * ntilesx || imheight != tile->grid_link->grid->tile_sy * ntilesy ) { ctx->set_error(ctx,500,"TIFF file %s imagesize (%d,%d) and tilesize (%d,%d).\ Expected (%d,%d),(%d,%d)",filename,imwidth,imheight,tilewidth,tileheight, tile->grid_link->grid->tile_sx * ntilesx, tile->grid_link->grid->tile_sy * ntilesy, tile->grid_link->grid->tile_sx, tile->grid_link->grid->tile_sy); return; } /* TODO: more tests ? */ /* ok, success */ } #endif static int _mapcache_cache_tiff_has_tile(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { char *filename; TIFF *hTIFF; mapcache_cache_tiff *cache = (mapcache_cache_tiff*)pcache; _mapcache_cache_tiff_tile_key(ctx, cache, tile, &filename); if(GC_HAS_ERROR(ctx)) { return MAPCACHE_FALSE; } #ifdef USE_GDAL CPLPushErrorHandlerEx(mapcache_cache_tiff_gdal_error_handler, ctx); #endif hTIFF = mapcache_cache_tiff_open(ctx,cache,filename,"r"); if(hTIFF) { do { uint32 nSubType = 0; int tiff_offx, tiff_offy; /* the x and y offset of the tile inside the tiff image */ int tiff_off; /* the index of the tile inside the list of tiles of the tiff image */ mapcache_grid_level *level; int ntilesx; int ntilesy; toff_t *offsets=NULL, *sizes=NULL; if( !TIFFGetField(hTIFF, TIFFTAG_SUBFILETYPE, &nSubType) ) nSubType = 0; /* skip overviews and masks */ if( (nSubType & FILETYPE_REDUCEDIMAGE) || (nSubType & FILETYPE_MASK) ) continue; #ifdef DEBUG check_tiff_format(ctx,cache,tile,hTIFF,filename); if(GC_HAS_ERROR(ctx)) { MyTIFFClose(hTIFF); #ifdef USE_GDAL CPLPopErrorHandler(); #endif return MAPCACHE_FALSE; } #endif level = tile->grid_link->grid->levels[tile->z]; ntilesx = MAPCACHE_MIN(cache->count_x, level->maxx); ntilesy = MAPCACHE_MIN(cache->count_y, level->maxy); /* x offset of the tile along a row */ tiff_offx = tile->x % ntilesx; /* * y offset of the requested row. we inverse it as the rows are ordered * from top to bottom, whereas the tile y is bottom to top */ tiff_offy = ntilesy - (tile->y % ntilesy) -1; tiff_off = tiff_offy * ntilesx + tiff_offx; if(1 != TIFFGetField( hTIFF, TIFFTAG_TILEOFFSETS, &offsets )) { MyTIFFClose(hTIFF); #ifdef USE_GDAL CPLPopErrorHandler(); #endif return MAPCACHE_FALSE; } if(1 != TIFFGetField( hTIFF, TIFFTAG_TILEBYTECOUNTS, &sizes )) { MyTIFFClose(hTIFF); #ifdef USE_GDAL CPLPopErrorHandler(); #endif return MAPCACHE_FALSE; } MyTIFFClose(hTIFF); if( offsets[tiff_off] > 0 && sizes[tiff_off] > 0 ) { #ifdef USE_GDAL CPLPopErrorHandler(); #endif return MAPCACHE_TRUE; } else { #ifdef USE_GDAL CPLPopErrorHandler(); #endif return MAPCACHE_FALSE; } } while( TIFFReadDirectory( hTIFF ) ); /* TIFF only contains overviews ? */ } #ifdef USE_GDAL CPLPopErrorHandler(); #endif return MAPCACHE_FALSE; } static void _mapcache_cache_tiff_delete(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { ctx->set_error(ctx,500,"TIFF cache tile deleting not implemented"); } /** * \brief get file content of given tile * * fills the mapcache_tile::data of the given tile with content stored in the file * \private \memberof mapcache_cache_tiff * \sa mapcache_cache::tile_get() */ static int _mapcache_cache_tiff_get(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { char *filename; TIFF *hTIFF = NULL; int rv; mapcache_cache_tiff *cache = (mapcache_cache_tiff*)pcache; _mapcache_cache_tiff_tile_key(ctx, cache, tile, &filename); if(GC_HAS_ERROR(ctx)) { return MAPCACHE_FALSE; } #ifdef DEBUG ctx->log(ctx,MAPCACHE_DEBUG,"tile (%d,%d,%d) => filename %s)", tile->x,tile->y,tile->z,filename); #endif #ifdef USE_GDAL CPLPushErrorHandlerEx(mapcache_cache_tiff_gdal_error_handler, ctx); #endif hTIFF = mapcache_cache_tiff_open(ctx,cache,filename,"r"); /* * we currrently have no way of knowing if the opening failed because the tif * file does not exist (which is not an error condition, as it only signals * that the requested tile does not exist in the cache), or if an other error * that should be signaled occurred (access denied, not a tiff file, etc...) * * we ignore this case here and hope that further parts of the code will be * able to detect what's happening more precisely */ if(hTIFF) { do { uint32 nSubType = 0; int tiff_offx, tiff_offy; /* the x and y offset of the tile inside the tiff image */ int tiff_off; /* the index of the tile inside the list of tiles of the tiff image */ mapcache_grid_level *level; int ntilesx; int ntilesy; toff_t *offsets=NULL, *sizes=NULL; if( !TIFFGetField(hTIFF, TIFFTAG_SUBFILETYPE, &nSubType) ) nSubType = 0; /* skip overviews */ if( nSubType & FILETYPE_REDUCEDIMAGE ) continue; #ifdef DEBUG check_tiff_format(ctx,cache,tile,hTIFF,filename); if(GC_HAS_ERROR(ctx)) { MyTIFFClose(hTIFF); #ifdef USE_GDAL CPLPopErrorHandler(); #endif return MAPCACHE_FAILURE; } #endif /* * compute the width and height of the full tiff file. This * is not simply the tile size times the number of tiles per * file for lower zoom levels */ level = tile->grid_link->grid->levels[tile->z]; ntilesx = MAPCACHE_MIN(cache->count_x, level->maxx); ntilesy = MAPCACHE_MIN(cache->count_y, level->maxy); /* x offset of the tile along a row */ tiff_offx = tile->x % ntilesx; /* * y offset of the requested row. we inverse it as the rows are ordered * from top to bottom, whereas the tile y is bottom to top */ tiff_offy = ntilesy - (tile->y % ntilesy) -1; tiff_off = tiff_offy * ntilesx + tiff_offx; /* get the offset of the jpeg data from the start of the file for each tile */ rv = TIFFGetField( hTIFF, TIFFTAG_TILEOFFSETS, &offsets ); if( rv != 1 ) { ctx->set_error(ctx,500,"Failed to read TIFF file \"%s\" tile offsets", filename); MyTIFFClose(hTIFF); #ifdef USE_GDAL CPLPopErrorHandler(); #endif return MAPCACHE_FAILURE; } /* get the size of the jpeg data for each tile */ rv = TIFFGetField( hTIFF, TIFFTAG_TILEBYTECOUNTS, &sizes ); if( rv != 1 ) { ctx->set_error(ctx,500,"Failed to read TIFF file \"%s\" tile sizes", filename); MyTIFFClose(hTIFF); #ifdef USE_GDAL CPLPopErrorHandler(); #endif return MAPCACHE_FAILURE; } /* * the tile data exists for the given tiff_off if both offsets and size * are not zero for that index. * if not, the tiff file is sparse and is missing the requested tile */ if( offsets[tiff_off] > 0 && sizes[tiff_off] >= 2 ) { apr_file_t *f; apr_finfo_t finfo; apr_status_t ret; /* read the jpeg header (common to all tiles) */ uint32 jpegtable_size = 0; unsigned char* jpegtable_ptr; rv = TIFFGetField( hTIFF, TIFFTAG_JPEGTABLES, &jpegtable_size, &jpegtable_ptr ); if( rv != 1 || !jpegtable_ptr || jpegtable_size < 2) { /* there is no common jpeg header in the tiff tags */ ctx->set_error(ctx,500,"Failed to read TIFF file \"%s\" jpeg table", filename); MyTIFFClose(hTIFF); #ifdef USE_GDAL CPLPopErrorHandler(); #endif return MAPCACHE_FAILURE; } /* * open the tiff file directly to access the jpeg image data with the given * offset */ #ifdef USE_GDAL if( cache->storage.type != MAPCACHE_TIFF_STORAGE_FILE ) { char *bufptr; apr_off_t off; apr_size_t bytes_to_read; size_t bytes_read; VSIStatBufL sStat; VSILFILE* fp; fp = mapcache_cache_tiff_vsi_open(cache, filename, "r"); if( fp == NULL ) { /* * shouldn't usually happen. we managed to open the file before, * nothing much to do except bail out. */ ctx->set_error(ctx,500, "VSIFOpenL() failed on already open tiff " "file \"%s\", giving up .... ", filename); MyTIFFClose(hTIFF); CPLPopErrorHandler(); return MAPCACHE_FAILURE; } if( mapcache_cache_tiff_vsi_stat(cache, filename, &sStat) == 0 ) { /* * extract the file modification time. this isn't guaranteed to be the * modification time of the actual tile, but it's the best we can do */ tile->mtime = sStat.st_mtime; } #ifdef DEBUG ctx->log(ctx,MAPCACHE_DEBUG,"tile (%d,%d,%d) => mtime = %d)", tile->x,tile->y,tile->z,tile->mtime); #endif /* create a memory buffer to contain the jpeg data */ tile->encoded_data = mapcache_buffer_create( (jpegtable_size+sizes[tiff_off]-4),ctx->pool); /* * copy the jpeg header to the beginning of the memory buffer, * omitting the last 2 bytes */ memcpy(tile->encoded_data->buf,jpegtable_ptr,(jpegtable_size-2)); /* advance the data pointer to after the header data */ bufptr = ((char *)tile->encoded_data->buf) + (jpegtable_size-2); /* go to the specified offset in the tiff file, plus 2 bytes */ off = offsets[tiff_off]+2; VSIFSeekL(fp, (vsi_l_offset)off, SEEK_SET); /* * copy the jpeg body at the end of the memory buffer, accounting * for the two bytes we omitted in the previous step */ bytes_to_read = sizes[tiff_off]-2; bytes_read = VSIFReadL(bufptr, 1, bytes_to_read, fp); /* check we have correctly read the requested number of bytes */ if(bytes_to_read != bytes_read) { ctx->set_error(ctx,500,"failed to read jpeg body in \"%s\".\ (read %d of %d bytes)", filename,(int)bytes_read,(int)sizes[tiff_off]-2); VSIFCloseL(fp); MyTIFFClose(hTIFF); CPLPopErrorHandler(); return MAPCACHE_FAILURE; } tile->encoded_data->size = (jpegtable_size+sizes[tiff_off]-4); VSIFCloseL(fp); CPLPopErrorHandler(); return MAPCACHE_SUCCESS; } else #endif if((ret=apr_file_open(&f, filename, APR_FOPEN_READ|APR_FOPEN_BUFFERED|APR_FOPEN_BINARY,APR_OS_DEFAULT, ctx->pool)) == APR_SUCCESS) { char *bufptr; apr_off_t off; apr_size_t bytes; ret = apr_file_info_get(&finfo, APR_FINFO_MTIME, f); if(ret == APR_SUCCESS) { /* * extract the file modification time. this isn't guaranteed to be the * modification time of the actual tile, but it's the best we can do */ tile->mtime = finfo.mtime; } /* create a memory buffer to contain the jpeg data */ tile->encoded_data = mapcache_buffer_create((jpegtable_size+sizes[tiff_off]-4),ctx->pool); /* * copy the jpeg header to the beginning of the memory buffer, * omitting the last 2 bytes */ memcpy(tile->encoded_data->buf,jpegtable_ptr,(jpegtable_size-2)); /* advance the data pointer to after the header data */ bufptr = ((char *)tile->encoded_data->buf) + (jpegtable_size-2); /* go to the specified offset in the tiff file, plus 2 bytes */ off = offsets[tiff_off]+2; apr_file_seek(f,APR_SET,&off); /* * copy the jpeg body at the end of the memory buffer, accounting * for the two bytes we omitted in the previous step */ bytes = sizes[tiff_off]-2; apr_file_read(f,bufptr,&bytes); /* check we have correctly read the requested number of bytes */ if(bytes != sizes[tiff_off]-2) { ctx->set_error(ctx,500,"failed to read jpeg body in \"%s\".\ (read %d of %d bytes)", filename,bytes,sizes[tiff_off]-2); apr_file_close(f); MyTIFFClose(hTIFF); #ifdef USE_GDAL CPLPopErrorHandler(); #endif return MAPCACHE_FAILURE; } tile->encoded_data->size = (jpegtable_size+sizes[tiff_off]-4); /* finalize and cleanup */ apr_file_close(f); MyTIFFClose(hTIFF); #ifdef USE_GDAL CPLPopErrorHandler(); #endif return MAPCACHE_SUCCESS; } else { /* shouldn't usually happen. we managed to open the file with TIFFOpen, * but apr_file_open failed to do so. * nothing much to do except bail out. */ ctx->set_error(ctx,500,"apr_file_open failed on already open tiff file \"%s\", giving up .... ", filename); MyTIFFClose(hTIFF); #ifdef USE_GDAL CPLPopErrorHandler(); #endif return MAPCACHE_FAILURE; } } else { /* sparse tiff file without the requested tile */ MyTIFFClose(hTIFF); #ifdef USE_GDAL CPLPopErrorHandler(); #endif return MAPCACHE_CACHE_MISS; } } /* loop through the tiff directories if there are multiple ones */ while( TIFFReadDirectory( hTIFF ) ); /* * should not happen? * finished looping through directories and didn't find anything suitable. * does the file only contain overviews? */ MyTIFFClose(hTIFF); } #ifdef USE_GDAL CPLPopErrorHandler(); #endif /* failed to open tiff file */ return MAPCACHE_CACHE_MISS; } /** * \brief write tile data to tiff * * writes the content of mapcache_tile::data to tiff. * \returns MAPCACHE_FAILURE if there is no data to write, or if the tile isn't locked * \returns MAPCACHE_SUCCESS if the tile has been successfully written to tiff * \private \memberof mapcache_cache_tiff * \sa mapcache_cache::tile_set() */ static void _mapcache_cache_tiff_set(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile) { #ifdef USE_TIFF_WRITE char *filename; TIFF *hTIFF = NULL; int rv; void *lock; int create; mapcache_cache_tiff *cache; mapcache_image_format_jpeg *format; int tilew; int tileh; unsigned char *rgb; int r,c; apr_finfo_t finfo; mapcache_grid_level *level; int ntilesx; int ntilesy; int tiff_offx, tiff_offy; /* the x and y offset of the tile inside the tiff image */ int tiff_off; /* the index of the tile inside the list of tiles of the tiff image */ cache = (mapcache_cache_tiff*)pcache; if( cache->storage.type != MAPCACHE_TIFF_STORAGE_FILE ) { ctx->set_error(ctx,500,"tiff cache %s is read-only\n",pcache->name); return; } _mapcache_cache_tiff_tile_key(ctx, cache, tile, &filename); format = (mapcache_image_format_jpeg*) cache->format; if(GC_HAS_ERROR(ctx)) { return; } #ifdef DEBUG ctx->log(ctx,MAPCACHE_DEBUG,"tile write (%d,%d,%d) => filename %s)", tile->x,tile->y,tile->z,filename); #endif /* * create the directory where the tiff file will be stored */ mapcache_make_parent_dirs(ctx,filename); GC_CHECK_ERROR(ctx); tilew = tile->grid_link->grid->tile_sx; tileh = tile->grid_link->grid->tile_sy; if(!tile->raw_image) { tile->raw_image = mapcache_imageio_decode(ctx, tile->encoded_data); GC_CHECK_ERROR(ctx); } /* remap xrgb to rgb */ rgb = (unsigned char*)malloc(tilew*tileh*3); for(r=0; rraw_image->h; r++) { unsigned char *imptr = tile->raw_image->data + r * tile->raw_image->stride; unsigned char *rgbptr = rgb + r * tilew * 3; for(c=0; craw_image->w; c++) { rgbptr[0] = imptr[2]; rgbptr[1] = imptr[1]; rgbptr[2] = imptr[0]; rgbptr += 3; imptr += 4; } } /* * aquire a lock on the tiff file. */ while(mapcache_lock_or_wait_for_resource(ctx,(cache->locker?cache->locker:ctx->config->locker),filename, &lock) == MAPCACHE_FALSE); /* check if the tiff file exists already */ rv = apr_stat(&finfo,filename,0,ctx->pool); if(!APR_STATUS_IS_ENOENT(rv)) { hTIFF = mapcache_cache_tiff_open(ctx,cache,filename,"r+"); create = 0; } else { hTIFF = mapcache_cache_tiff_open(ctx,cache,filename,"w+"); create = 1; } if(!hTIFF) { ctx->set_error(ctx,500,"failed to open/create tiff file %s\n",filename); goto close_tiff; } /* * compute the width and height of the full tiff file. This * is not simply the tile size times the number of tiles per * file for lower zoom levels */ level = tile->grid_link->grid->levels[tile->z]; ntilesx = MAPCACHE_MIN(cache->count_x, level->maxx); ntilesy = MAPCACHE_MIN(cache->count_y, level->maxy); if(create) { #ifdef USE_GEOTIFF double adfPixelScale[3], adfTiePoints[6]; mapcache_extent bbox; GTIF *gtif; int x,y; #endif /* populate the TIFF tags if we are creating the file */ TIFFSetField( hTIFF, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT ); TIFFSetField( hTIFF, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG ); TIFFSetField( hTIFF, TIFFTAG_BITSPERSAMPLE, 8 ); TIFFSetField( hTIFF, TIFFTAG_COMPRESSION, COMPRESSION_JPEG ); TIFFSetField( hTIFF, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB ); TIFFSetField( hTIFF, TIFFTAG_TILEWIDTH, tilew ); TIFFSetField( hTIFF, TIFFTAG_TILELENGTH, tileh ); TIFFSetField( hTIFF, TIFFTAG_IMAGEWIDTH, ntilesx * tilew ); TIFFSetField( hTIFF, TIFFTAG_IMAGELENGTH, ntilesy * tileh ); TIFFSetField( hTIFF, TIFFTAG_SAMPLESPERPIXEL,3 ); #ifdef USE_GEOTIFF gtif = GTIFNew(hTIFF); if(gtif) { GTIFKeySet(gtif, GTRasterTypeGeoKey, TYPE_SHORT, 1, RasterPixelIsArea); GTIFKeySet( gtif, GeographicTypeGeoKey, TYPE_SHORT, 1, 0 ); GTIFKeySet( gtif, GeogGeodeticDatumGeoKey, TYPE_SHORT, 1, 0 ); GTIFKeySet( gtif, GeogEllipsoidGeoKey, TYPE_SHORT, 1, 0 ); GTIFKeySet( gtif, GeogSemiMajorAxisGeoKey, TYPE_DOUBLE, 1, 0.0 ); GTIFKeySet( gtif, GeogSemiMinorAxisGeoKey, TYPE_DOUBLE, 1, 0.0 ); switch(tile->grid_link->grid->unit) { case MAPCACHE_UNIT_FEET: GTIFKeySet( gtif, ProjLinearUnitsGeoKey, TYPE_SHORT, 1, Linear_Foot ); break; case MAPCACHE_UNIT_METERS: GTIFKeySet( gtif, ProjLinearUnitsGeoKey, TYPE_SHORT, 1, Linear_Meter ); break; case MAPCACHE_UNIT_DEGREES: GTIFKeySet(gtif, GeogAngularUnitsGeoKey, TYPE_SHORT, 0, Angular_Degree ); break; default: break; } GTIFWriteKeys(gtif); GTIFFree(gtif); adfPixelScale[0] = adfPixelScale[1] = level->resolution; adfPixelScale[2] = 0.0; TIFFSetField( hTIFF, TIFFTAG_GEOPIXELSCALE, 3, adfPixelScale ); /* top left tile x,y */ x = (tile->x / cache->count_x)*(cache->count_x); y = (tile->y / cache->count_y)*(cache->count_y) + ntilesy - 1; mapcache_grid_get_tile_extent(ctx, tile->grid_link->grid, x,y,tile->z,&bbox); adfTiePoints[0] = 0.0; adfTiePoints[1] = 0.0; adfTiePoints[2] = 0.0; adfTiePoints[3] = bbox.minx; adfTiePoints[4] = bbox.maxy; adfTiePoints[5] = 0.0; TIFFSetField( hTIFF, TIFFTAG_GEOTIEPOINTS, 6, adfTiePoints ); } #endif } TIFFSetField(hTIFF, TIFFTAG_JPEGQUALITY, format->quality); if(format->photometric == MAPCACHE_PHOTOMETRIC_RGB) { TIFFSetField( hTIFF, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); } else { TIFFSetField( hTIFF, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR); } TIFFSetField( hTIFF, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB ); /* x offset of the tile along a row */ tiff_offx = tile->x % ntilesx; /* * y offset of the requested row. we inverse it as the rows are ordered * from top to bottom, whereas the tile y is bottom to top */ tiff_offy = ntilesy - (tile->y % ntilesy) -1; tiff_off = tiff_offy * ntilesx + tiff_offx; rv = TIFFWriteEncodedTile(hTIFF, tiff_off, rgb, tilew*tileh*3); free(rgb); if(!rv) { ctx->set_error(ctx,500,"failed TIFFWriteEncodedTile to %s",filename); goto close_tiff; } rv = TIFFWriteCheck( hTIFF, 1, "cache_set()"); if(!rv) { ctx->set_error(ctx,500,"failed TIFFWriteCheck %s",filename); goto close_tiff; } if(create) { rv = TIFFWriteDirectory(hTIFF); if(!rv) { ctx->set_error(ctx,500,"failed TIFFWriteDirectory to %s",filename); goto close_tiff; } } close_tiff: if(hTIFF) MyTIFFClose(hTIFF); mapcache_unlock_resource(ctx,cache->locker?cache->locker:ctx->config->locker, lock); #else ctx->set_error(ctx,500,"tiff write support disabled by default"); #endif } /** * \private \memberof mapcache_cache_tiff */ static void _mapcache_cache_tiff_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_cache *pcache, mapcache_cfg *config) { ezxml_t cur_node; mapcache_cache_tiff *cache = (mapcache_cache_tiff*)pcache; char * format_name; mapcache_image_format *pformat; if ((cur_node = ezxml_child(node,"template")) != NULL) { char *fmt; cache->filename_template = apr_pstrdup(ctx->pool,cur_node->txt); fmt = (char*)ezxml_attr(cur_node,"x_fmt"); if(fmt && *fmt) { cache->x_fmt = apr_pstrdup(ctx->pool,fmt); } fmt = (char*)ezxml_attr(cur_node,"y_fmt"); if(fmt && *fmt) { cache->y_fmt = apr_pstrdup(ctx->pool,fmt); } fmt = (char*)ezxml_attr(cur_node,"z_fmt"); if(fmt && *fmt) { cache->z_fmt = apr_pstrdup(ctx->pool,fmt); } fmt = (char*)ezxml_attr(cur_node,"inv_x_fmt"); if(fmt && *fmt) { cache->inv_x_fmt = apr_pstrdup(ctx->pool,fmt); } fmt = (char*)ezxml_attr(cur_node,"inv_y_fmt"); if(fmt && *fmt) { cache->inv_y_fmt = apr_pstrdup(ctx->pool,fmt); } fmt = (char*)ezxml_attr(cur_node,"div_x_fmt"); if(fmt && *fmt) { cache->div_x_fmt = apr_pstrdup(ctx->pool,fmt); } fmt = (char*)ezxml_attr(cur_node,"div_y_fmt"); if(fmt && *fmt) { cache->div_y_fmt = apr_pstrdup(ctx->pool,fmt); } fmt = (char*)ezxml_attr(cur_node,"inv_div_x_fmt"); if(fmt && *fmt) { cache->inv_div_x_fmt = apr_pstrdup(ctx->pool,fmt); } fmt = (char*)ezxml_attr(cur_node,"inv_div_y_fmt"); if(fmt && *fmt) { cache->inv_div_y_fmt = apr_pstrdup(ctx->pool,fmt); } } cur_node = ezxml_child(node,"xcount"); if(cur_node && cur_node->txt && *cur_node->txt) { char *endptr; cache->count_x = (int)strtol(cur_node->txt,&endptr,10); if(*endptr != 0) { ctx->set_error(ctx,400,"failed to parse xcount value %s for tiff cache %s", cur_node->txt,pcache->name); return; } } cur_node = ezxml_child(node,"ycount"); if(cur_node && cur_node->txt && *cur_node->txt) { char *endptr; cache->count_y = (int)strtol(cur_node->txt,&endptr,10); if(*endptr != 0) { ctx->set_error(ctx,400,"failed to parse ycount value %s for tiff cache %s", cur_node->txt,pcache->name); return; } } cur_node = ezxml_child(node,"format"); if(cur_node && cur_node->txt && *cur_node->txt) { format_name = cur_node->txt; } else { format_name = "JPEG"; } pformat = mapcache_configuration_get_image_format( config,format_name); if(!pformat) { ctx->set_error(ctx,500,"TIFF cache %s references unknown image format %s", pcache->name, format_name); return; } if(pformat->type != GC_JPEG) { ctx->set_error(ctx,500,"TIFF cache %s can only reference a JPEG image format", pcache->name); return; } cache->format = (mapcache_image_format_jpeg*)pformat; cur_node = ezxml_child(node,"locker"); if(cur_node) { mapcache_config_parse_locker(ctx, cur_node, &cache->locker); } cache->storage.type = MAPCACHE_TIFF_STORAGE_FILE; cur_node = ezxml_child(node,"storage"); if (cur_node) { ezxml_t child_node; const char *type = ezxml_attr(cur_node,"type"); if( !type ) { ctx->set_error(ctx,400, " with no \"type\" attribute in cache (%s)", pcache->name); return; } if( strcmp(type, "rest") == 0 ) { cache->storage.type = MAPCACHE_TIFF_STORAGE_REST; } else if( strcmp(type, "google") == 0 ) { cache->storage.type = MAPCACHE_TIFF_STORAGE_GOOGLE; if ((child_node = ezxml_child(cur_node,"access")) != NULL) { cache->storage.u.google.access = apr_pstrdup(ctx->pool, child_node->txt); } else if ( getenv("GS_ACCESS_KEY_ID")) { cache->storage.u.google.access = apr_pstrdup(ctx->pool,getenv("GS_ACCESS_KEY_ID")); } else { ctx->set_error(ctx,400, "google storage in cache (%s) is missing " "required child", pcache->name); return; } if ((child_node = ezxml_child(cur_node,"secret")) != NULL) { cache->storage.u.google.secret = apr_pstrdup(ctx->pool, child_node->txt); } else if ( getenv("GS_SECRET_ACCESS_KEY")) { cache->storage.u.google.access = apr_pstrdup(ctx->pool,getenv("GS_SECRET_ACCESS_KEY")); } else { ctx->set_error(ctx,400, "google storage in cache (%s) is missing " "required child", pcache->name); return; } } else { ctx->set_error(ctx, 400, "unknown cache type %s for cache \"%s\"", type, pcache->name); return; } if ((child_node = ezxml_child(cur_node,"connection_timeout")) != NULL) { char *endptr; cache->storage.connection_timeout = (int)strtol(child_node->txt,&endptr,10); if(*endptr != 0 || cache->storage.connection_timeout<1) { ctx->set_error(ctx,400,"invalid rest cache " "\"%s\" (positive integer expected)", child_node->txt); return; } } else { cache->storage.connection_timeout = 30; } if ((child_node = ezxml_child(cur_node,"timeout")) != NULL) { char *endptr; cache->storage.timeout = (int)strtol(child_node->txt,&endptr,10); if(*endptr != 0 || cache->storage.timeout<1) { ctx->set_error(ctx,400,"invalid rest cache \"%s\" " "(positive integer expected)", child_node->txt); return; } } else { cache->storage.timeout = 120; } if ((child_node = ezxml_child(cur_node,"header_file")) != NULL) { cache->storage.header_file = apr_pstrdup(ctx->pool, child_node->txt); } } } /** * \private \memberof mapcache_cache_tiff */ static void _mapcache_cache_tiff_configuration_post_config(mapcache_context *ctx, mapcache_cache *pcache, mapcache_cfg *cfg) { mapcache_cache_tiff *cache = (mapcache_cache_tiff*)pcache; /* check all required parameters are configured */ if((!cache->filename_template || !strlen(cache->filename_template))) { ctx->set_error(ctx, 400, "tiff cache %s has no template pattern",cache->cache.name); return; } if(cache->count_x <= 0 || cache->count_y <= 0) { ctx->set_error(ctx, 400, "tiff cache %s has invalid count (%d,%d)",cache->count_x,cache->count_y); return; } #ifdef USE_GDAL if(cache->storage.type == MAPCACHE_TIFF_STORAGE_REST && strncmp(cache->filename_template, "http://", 6) != 0 && strncmp(cache->filename_template, "https://", 7) != 0 ) { ctx->set_error(ctx, 400, "tiff cache %s template pattern should begin with http:// or https://",cache->cache.name); return; } if(cache->storage.type == MAPCACHE_TIFF_STORAGE_GOOGLE && strncmp(cache->filename_template, "https://storage.googleapis.com/", strlen("https://storage.googleapis.com/")) != 0 && strncmp(cache->filename_template, "/vsigs/", strlen("/vsigs/")) != 0 ) { ctx->set_error(ctx, 400, "tiff cache %s template pattern should begin " "with https://storage.googleapis.com/ or /vsigs/",cache->cache.name); return; } #else if(cache->storage.type != MAPCACHE_TIFF_STORAGE_FILE ) { ctx->set_error(ctx, 400, "tiff cache %s cannot use a network based " "storage due to mising GDAL dependency", cache->cache.name); return; } #endif } /** * \brief creates and initializes a mapcache_tiff_cache */ mapcache_cache* mapcache_cache_tiff_create(mapcache_context *ctx) { mapcache_cache_tiff *cache = apr_pcalloc(ctx->pool,sizeof(mapcache_cache_tiff)); if(!cache) { ctx->set_error(ctx, 500, "failed to allocate tiff cache"); return NULL; } cache->cache.metadata = apr_table_make(ctx->pool,3); cache->cache.type = MAPCACHE_CACHE_TIFF; cache->cache._tile_delete = _mapcache_cache_tiff_delete; cache->cache._tile_get = _mapcache_cache_tiff_get; cache->cache._tile_exists = _mapcache_cache_tiff_has_tile; cache->cache._tile_set = _mapcache_cache_tiff_set; cache->cache.configuration_post_config = _mapcache_cache_tiff_configuration_post_config; cache->cache.configuration_parse_xml = _mapcache_cache_tiff_configuration_parse_xml; cache->count_x = 10; cache->count_y = 10; cache->x_fmt = cache->y_fmt = cache->z_fmt = cache->inv_x_fmt = cache->inv_y_fmt = cache->div_x_fmt = cache->div_y_fmt = cache->inv_div_x_fmt = cache->inv_div_y_fmt = apr_pstrdup(ctx->pool,"%d"); #ifndef DEBUG TIFFSetWarningHandler(NULL); TIFFSetErrorHandler(NULL); #endif return (mapcache_cache*)cache; } #else mapcache_cache* mapcache_cache_tiff_create(mapcache_context *ctx) { ctx->set_error(ctx,400,"TIFF support not compiled in this version"); return NULL; } #endif /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/cache_tokyocabinet.c000066400000000000000000000204501316353564100205760ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching support file: Tokyo Cabinet cache backend * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #ifdef USE_TC #include #include #include #include #include #include #include #include #ifndef _WIN32 #include #endif typedef struct mapcache_cache_tc mapcache_cache_tc; struct mapcache_cache_tc { mapcache_cache cache; char *basedir; char *key_template; mapcache_context *ctx; }; mapcache_cache *mapcache_cache_tc_create(mapcache_context *ctx); struct tc_conn { TCBDB *bdb; int readonly; }; static struct tc_conn _tc_get_conn(mapcache_context *ctx, mapcache_tile* tile, int readonly) { struct tc_conn conn; /* create the object */ conn.bdb = tcbdbnew(); mapcache_cache_tc *cache = (mapcache_cache_tc*)tile->tileset->cache; /* open the database */ if(!readonly) { if(!tcbdbopen(conn.bdb, apr_pstrcat(ctx->pool, cache->basedir,"/tc.tcb",NULL), BDBOWRITER | BDBOCREAT)) { int ecode = tcbdbecode(conn.bdb); ctx->set_error(ctx,500, "tokyocabinet open error on %s: %s\n",apr_pstrcat(ctx->pool, cache->basedir,"/tc.tcf",NULL),tcbdberrmsg(ecode)); } conn.readonly = 0; } else { if(!tcbdbopen(conn.bdb, apr_pstrcat(ctx->pool, cache->basedir,"/tc.tcb",NULL), BDBOREADER)) { if(!tcbdbopen(conn.bdb, apr_pstrcat(ctx->pool, cache->basedir,"/tc.tcb",NULL), BDBOWRITER | BDBOCREAT)) { int ecode = tcbdbecode(conn.bdb); ctx->set_error(ctx,500, "tokyocabinet open error on %s: %s\n",apr_pstrcat(ctx->pool, cache->basedir,"/tc.tcf",NULL),tcbdberrmsg(ecode)); } conn.readonly = 0; } conn.readonly = 1; } return conn; } static void _tc_release_conn(mapcache_context *ctx, mapcache_tile *tile, struct tc_conn conn) { if(!conn.readonly) tcbdbsync(conn.bdb); if(!tcbdbclose(conn.bdb)) { int ecode = tcbdbecode(conn.bdb); ctx->set_error(ctx,500, "tokyocabinet close error: %s\n",tcbdberrmsg(ecode)); } tcbdbdel(conn.bdb); } static int _mapcache_cache_tc_has_tile(mapcache_context *ctx, mapcache_tile *tile) { int ret; struct tc_conn conn; int nrecords = 0; mapcache_cache_tc *cache = (mapcache_cache_tc*)tile->tileset->cache; char *skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL); conn = _tc_get_conn(ctx,tile,1); if(GC_HAS_ERROR(ctx)) return MAPCACHE_FALSE; nrecords = tcbdbvnum2(conn.bdb, skey); if(nrecords == 0) ret = MAPCACHE_FALSE; else ret = MAPCACHE_TRUE; _tc_release_conn(ctx,tile,conn); return ret; } static void _mapcache_cache_tc_delete(mapcache_context *ctx, mapcache_tile *tile) { struct tc_conn conn; mapcache_cache_tc *cache = (mapcache_cache_tc*)tile->tileset->cache; char *skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL); conn = _tc_get_conn(ctx,tile,0); GC_CHECK_ERROR(ctx); tcbdbout2(conn.bdb, skey); _tc_release_conn(ctx,tile,conn); } static int _mapcache_cache_tc_get(mapcache_context *ctx, mapcache_tile *tile) { int ret; struct tc_conn conn; mapcache_cache_tc *cache = (mapcache_cache_tc*)tile->tileset->cache; char *skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL); conn = _tc_get_conn(ctx,tile,1); int size; if(GC_HAS_ERROR(ctx)) return MAPCACHE_FAILURE; tile->encoded_data = mapcache_buffer_create(0,ctx->pool); tile->encoded_data->buf = tcbdbget(conn.bdb, skey, strlen(skey), &size); if(tile->encoded_data->buf) { tile->encoded_data->avail = size; tile->encoded_data->size = size - sizeof(apr_time_t); apr_pool_cleanup_register(ctx->pool, tile->encoded_data->buf,(void*)free, apr_pool_cleanup_null); tile->mtime = *((apr_time_t*)(&tile->encoded_data->buf[tile->encoded_data->size])); ret = MAPCACHE_SUCCESS; } else { ret = MAPCACHE_CACHE_MISS; } _tc_release_conn(ctx,tile,conn); return ret; } static void _mapcache_cache_tc_set(mapcache_context *ctx, mapcache_tile *tile) { struct tc_conn conn; mapcache_cache_tc *cache = (mapcache_cache_tc*)tile->tileset->cache; char *skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL); apr_time_t now = apr_time_now(); conn = _tc_get_conn(ctx,tile,0); GC_CHECK_ERROR(ctx); if(!tile->encoded_data) { tile->encoded_data = tile->tileset->format->write(ctx, tile->raw_image, tile->tileset->format); GC_CHECK_ERROR(ctx); } mapcache_buffer_append(tile->encoded_data,sizeof(apr_time_t),&now); if(!tcbdbput(conn.bdb, skey, strlen(skey), tile->encoded_data->buf, tile->encoded_data->size)) { int ecode = tcbdbecode(conn.bdb); ctx->set_error(ctx,500, "tokyocabinet put error: %s\n",tcbdberrmsg(ecode)); } _tc_release_conn(ctx,tile,conn); } static void _mapcache_cache_tc_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_cache *cache, mapcache_cfg *config) { ezxml_t cur_node; mapcache_cache_tc *dcache = (mapcache_cache_tc*)cache; if ((cur_node = ezxml_child(node,"base")) != NULL) { dcache->basedir = apr_pstrdup(ctx->pool,cur_node->txt); } if ((cur_node = ezxml_child(node,"key_template")) != NULL) { dcache->key_template = apr_pstrdup(ctx->pool,cur_node->txt); } else { dcache->key_template = apr_pstrdup(ctx->pool,"{tileset}-{grid}-{dim}-{z}-{y}-{x}.{ext}"); } if(!dcache->basedir) { ctx->set_error(ctx,500,"tokyocabinet cache \"%s\" is missing entry",cache->name); return; } } static void _mapcache_cache_tc_configuration_post_config(mapcache_context *ctx, mapcache_cache *cache, mapcache_cfg *cfg) { mapcache_cache_tc *dcache = (mapcache_cache_tc*)cache; apr_status_t rv; apr_dir_t *dir; rv = apr_dir_open(&dir, dcache->basedir, ctx->pool); if(rv != APR_SUCCESS) { char errmsg[120]; ctx->set_error(ctx,500,"bdb failed to open directory %s:%s",dcache->basedir,apr_strerror(rv,errmsg,120)); } } /** * \brief creates and initializes a mapcache_dbd_cache */ mapcache_cache* mapcache_cache_tc_create(mapcache_context *ctx) { mapcache_cache_tc *cache = apr_pcalloc(ctx->pool,sizeof(mapcache_cache_tc)); if(!cache) { ctx->set_error(ctx, 500, "failed to allocate tokyo cabinet cache"); return NULL; } cache->cache.metadata = apr_table_make(ctx->pool,3); cache->cache.type = MAPCACHE_CACHE_TC; cache->cache.tile_delete = _mapcache_cache_tc_delete; cache->cache.tile_get = _mapcache_cache_tc_get; cache->cache.tile_exists = _mapcache_cache_tc_has_tile; cache->cache.tile_set = _mapcache_cache_tc_set; cache->cache.configuration_post_config = _mapcache_cache_tc_configuration_post_config; cache->cache.configuration_parse_xml = _mapcache_cache_tc_configuration_parse_xml; cache->basedir = NULL; cache->key_template = NULL; return (mapcache_cache*)cache; } #else mapcache_cache* mapcache_cache_tc_create(mapcache_context *ctx) { ctx->set_error(ctx,400,"TokyoCabinet support not compiled in this version"); return NULL; } #endif /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/configuration.c000066400000000000000000000252131316353564100176310ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching support file: high level configuration file parser * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #include #include #include #include void mapcache_configuration_parse(mapcache_context *ctx, const char *filename, mapcache_cfg *config, int cgi) { char *url; mapcache_configuration_parse_xml(ctx,filename,config); GC_CHECK_ERROR(ctx); /* if we were suppplied with an onlineresource, make sure it ends with a / */ if(NULL != (url = (char*)apr_table_get(config->metadata,"url"))) { char *urlend = url + strlen(url)-1; if(*urlend != '/') { url = apr_pstrcat(ctx->pool,url,"/",NULL); apr_table_setn(config->metadata,"url",url); } } } void mapcache_configuration_post_config(mapcache_context *ctx, mapcache_cfg *config) { apr_hash_index_t *cachei = apr_hash_first(ctx->pool,config->caches); while(cachei) { mapcache_cache *cache; const void *key; apr_ssize_t keylen; apr_hash_this(cachei,&key,&keylen,(void**)&cache); cache->configuration_post_config(ctx,cache,config); GC_CHECK_ERROR(ctx); cachei = apr_hash_next(cachei); } } mapcache_cfg* mapcache_configuration_create(apr_pool_t *pool) { mapcache_grid *grid; int i; double wgs84_resolutions[18]= { 0.703125000000000, 0.351562500000000, 0.175781250000000, 8.78906250000000e-2, 4.39453125000000e-2, 2.19726562500000e-2, 1.09863281250000e-2, 5.49316406250000e-3, 2.74658203125000e-3, 1.37329101562500e-3, 6.86645507812500e-4, 3.43322753906250e-4, 1.71661376953125e-4, 8.58306884765625e-5, 4.29153442382812e-5, 2.14576721191406e-5, 1.07288360595703e-5, 5.36441802978516e-6 }; double google_resolutions[19] = { 156543.0339280410, 78271.51696402048, 39135.75848201023, 19567.87924100512, 9783.939620502561, 4891.969810251280, 2445.984905125640, 1222.992452562820, 611.4962262814100, 305.7481131407048, 152.8740565703525, 76.43702828517624, 38.21851414258813, 19.10925707129406, 9.554628535647032, 4.777314267823516, 2.388657133911758, 1.194328566955879, 0.5971642834779395 }; mapcache_extent wgs84_extent= {-180,-90,180,90}; mapcache_extent google_extent= {-20037508.3427892480,-20037508.3427892480,20037508.3427892480,20037508.3427892480}; double unitwidth,unitheight; mapcache_cfg *cfg = (mapcache_cfg*)apr_pcalloc(pool, sizeof(mapcache_cfg)); cfg->caches = apr_hash_make(pool); cfg->sources = apr_hash_make(pool); cfg->tilesets = apr_hash_make(pool); cfg->grids = apr_hash_make(pool); cfg->image_formats = apr_hash_make(pool); cfg->metadata = apr_table_make(pool,3); mapcache_configuration_add_image_format(cfg, mapcache_imageio_create_png_format(pool,"PNG",MAPCACHE_COMPRESSION_FAST), "PNG"); mapcache_configuration_add_image_format(cfg, mapcache_imageio_create_png_q_format(pool,"PNG8",MAPCACHE_COMPRESSION_FAST,256), "PNG8"); mapcache_configuration_add_image_format(cfg, mapcache_imageio_create_jpeg_format(pool,"JPEG",90,MAPCACHE_PHOTOMETRIC_YCBCR,MAPCACHE_OPTIMIZE_YES), "JPEG"); mapcache_configuration_add_image_format(cfg, mapcache_imageio_create_mixed_format(pool,"mixed", mapcache_configuration_get_image_format(cfg,"PNG"), mapcache_configuration_get_image_format(cfg,"JPEG"), 255), "mixed"); cfg->default_image_format = mapcache_configuration_get_image_format(cfg,"mixed"); cfg->reporting = MAPCACHE_REPORT_MSG; grid = mapcache_grid_create(pool); grid->name = apr_pstrdup(pool,"WGS84"); apr_table_add(grid->metadata,"title","GoogleCRS84Quad"); apr_table_add(grid->metadata,"wellKnownScaleSet","urn:ogc:def:wkss:OGC:1.0:GoogleCRS84Quad"); apr_table_add(grid->metadata,"profile","global-geodetic"); grid->srs = apr_pstrdup(pool,"EPSG:4326"); grid->unit = MAPCACHE_UNIT_DEGREES; grid->tile_sx = grid->tile_sy = 256; grid->nlevels = 18; grid->extent = wgs84_extent; grid->levels = (mapcache_grid_level**)apr_pcalloc(pool, grid->nlevels*sizeof(mapcache_grid_level*)); for(i=0; inlevels; i++) { mapcache_grid_level *level = (mapcache_grid_level*)apr_pcalloc(pool,sizeof(mapcache_grid_level)); level->resolution = wgs84_resolutions[i]; unitheight = grid->tile_sy * level->resolution; unitwidth = grid->tile_sx * level->resolution; level->maxy = ceil((grid->extent.maxy-grid->extent.miny - 0.01* unitheight)/unitheight); level->maxx = ceil((grid->extent.maxx-grid->extent.minx - 0.01* unitwidth)/unitwidth); grid->levels[i] = level; } mapcache_configuration_add_grid(cfg,grid,"WGS84"); grid = mapcache_grid_create(pool); grid->name = apr_pstrdup(pool,"GoogleMapsCompatible"); grid->srs = apr_pstrdup(pool,"EPSG:3857"); APR_ARRAY_PUSH(grid->srs_aliases,char*) = apr_pstrdup(pool,"EPSG:900913"); apr_table_add(grid->metadata,"title","GoogleMapsCompatible"); apr_table_add(grid->metadata,"profile","global-mercator"); apr_table_add(grid->metadata,"wellKnownScaleSet","urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible"); grid->tile_sx = grid->tile_sy = 256; grid->nlevels = 19; grid->unit = MAPCACHE_UNIT_METERS; grid->extent = google_extent; grid->levels = (mapcache_grid_level**)apr_pcalloc(pool, grid->nlevels*sizeof(mapcache_grid_level*)); for(i=0; inlevels; i++) { mapcache_grid_level *level = (mapcache_grid_level*)apr_pcalloc(pool,sizeof(mapcache_grid_level)); level->resolution = google_resolutions[i]; unitheight = grid->tile_sy * level->resolution; unitwidth = grid->tile_sx * level->resolution; level->maxy = ceil((grid->extent.maxy-grid->extent.miny - 0.01* unitheight)/unitheight); level->maxx = ceil((grid->extent.maxx-grid->extent.minx - 0.01* unitwidth)/unitwidth); grid->levels[i] = level; } mapcache_configuration_add_grid(cfg,grid,"GoogleMapsCompatible"); grid = mapcache_grid_create(pool); grid->name = apr_pstrdup(pool,"g"); grid->srs = apr_pstrdup(pool,"EPSG:900913"); APR_ARRAY_PUSH(grid->srs_aliases,char*) = apr_pstrdup(pool,"EPSG:3857"); apr_table_add(grid->metadata,"title","GoogleMapsCompatible"); apr_table_add(grid->metadata,"profile","global-mercator"); apr_table_add(grid->metadata,"wellKnownScaleSet","urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible"); grid->tile_sx = grid->tile_sy = 256; grid->nlevels = 19; grid->unit = MAPCACHE_UNIT_METERS; grid->extent = google_extent; grid->levels = (mapcache_grid_level**)apr_pcalloc(pool, grid->nlevels*sizeof(mapcache_grid_level*)); for(i=0; inlevels; i++) { mapcache_grid_level *level = (mapcache_grid_level*)apr_pcalloc(pool,sizeof(mapcache_grid_level)); level->resolution = google_resolutions[i]; unitheight = grid->tile_sy * level->resolution; unitwidth = grid->tile_sx * level->resolution; level->maxy = ceil((grid->extent.maxy-grid->extent.miny - 0.01* unitheight)/unitheight); level->maxx = ceil((grid->extent.maxx-grid->extent.minx - 0.01* unitwidth)/unitwidth); grid->levels[i] = level; } mapcache_configuration_add_grid(cfg,grid,"g"); cfg->loglevel = MAPCACHE_WARN; cfg->autoreload = 0; return cfg; } mapcache_source *mapcache_configuration_get_source(mapcache_cfg *config, const char *key) { return (mapcache_source*)apr_hash_get(config->sources, (void*)key, APR_HASH_KEY_STRING); } mapcache_cache *mapcache_configuration_get_cache(mapcache_cfg *config, const char *key) { return (mapcache_cache*)apr_hash_get(config->caches, (void*)key, APR_HASH_KEY_STRING); } mapcache_grid *mapcache_configuration_get_grid(mapcache_cfg *config, const char *key) { return (mapcache_grid*)apr_hash_get(config->grids, (void*)key, APR_HASH_KEY_STRING); } mapcache_tileset *mapcache_configuration_get_tileset(mapcache_cfg *config, const char *key) { if(config->mode == MAPCACHE_MODE_NORMAL) { return (mapcache_tileset*)apr_hash_get(config->tilesets, (void*)key, APR_HASH_KEY_STRING); } else { return (mapcache_tileset*)apr_hash_get(config->tilesets, (void*)"mirror", APR_HASH_KEY_STRING); } } mapcache_image_format *mapcache_configuration_get_image_format(mapcache_cfg *config, const char *key) { return (mapcache_image_format*)apr_hash_get(config->image_formats, (void*)key, APR_HASH_KEY_STRING); } void mapcache_configuration_add_source(mapcache_cfg *config, mapcache_source *source, const char * key) { apr_hash_set(config->sources, key, APR_HASH_KEY_STRING, (void*)source); } void mapcache_configuration_add_grid(mapcache_cfg *config, mapcache_grid *grid, const char * key) { apr_hash_set(config->grids, key, APR_HASH_KEY_STRING, (void*)grid); } void mapcache_configuration_add_tileset(mapcache_cfg *config, mapcache_tileset *tileset, const char * key) { tileset->config = config; apr_hash_set(config->tilesets, key, APR_HASH_KEY_STRING, (void*)tileset); } void mapcache_configuration_add_cache(mapcache_cfg *config, mapcache_cache *cache, const char * key) { apr_hash_set(config->caches, key, APR_HASH_KEY_STRING, (void*)cache); } void mapcache_configuration_add_image_format(mapcache_cfg *config, mapcache_image_format *format, const char * key) { apr_hash_set(config->image_formats, key, APR_HASH_KEY_STRING, (void*)format); } mapcache-rel-1-6-1/lib/configuration_xml.c000066400000000000000000001330471316353564100205160ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching support file: xml configuration parser * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #include "ezxml.h" #include #include #include #include #include #include #include #include void parseMetadata(mapcache_context *ctx, ezxml_t node, apr_table_t *metadata) { ezxml_t cur_node; for(cur_node = node->child; cur_node; cur_node = cur_node->sibling) { apr_table_add(metadata,cur_node->name, cur_node->txt); } } void parseDimensions(mapcache_context *ctx, ezxml_t node, mapcache_tileset *tileset) { ezxml_t dimension_node; apr_array_header_t *dimensions = apr_array_make(ctx->pool,1,sizeof(mapcache_dimension*)); for(dimension_node = ezxml_child(node,"dimension"); dimension_node; dimension_node = dimension_node->next) { char *name = (char*)ezxml_attr(dimension_node,"name"); char *type = (char*)ezxml_attr(dimension_node,"type"); char *unit = (char*)ezxml_attr(dimension_node,"unit"); char *default_value = (char*)ezxml_attr(dimension_node,"default"); mapcache_dimension *dimension = NULL; if(!name || !strlen(name)) { ctx->set_error(ctx, 400, "mandatory attribute \"name\" not found in "); return; } if(type && *type) { if(!strcmp(type,"values")) { dimension = mapcache_dimension_values_create(ctx,ctx->pool); } else if(!strcmp(type,"regex")) { dimension = mapcache_dimension_regex_create(ctx,ctx->pool); } else if(!strcmp(type,"sqlite")) { dimension = mapcache_dimension_sqlite_create(ctx,ctx->pool); } else if(!strcmp(type,"time")) { dimension = mapcache_dimension_time_create(ctx,ctx->pool); } else { ctx->set_error(ctx,400,"unknown dimension type \"%s\"",type); return; } } else { ctx->set_error(ctx,400, "mandatory attribute \"type\" not found in "); return; } GC_CHECK_ERROR(ctx); dimension->name = apr_pstrdup(ctx->pool,name); if(unit && *unit) { dimension->unit = apr_pstrdup(ctx->pool,unit); } if(default_value && *default_value) { dimension->default_value = apr_pstrdup(ctx->pool,default_value); } else { ctx->set_error(ctx,400,"dimension \"%s\" has no \"default\" attribute",dimension->name); return; } dimension->configuration_parse_xml(ctx,dimension,dimension_node); GC_CHECK_ERROR(ctx); APR_ARRAY_PUSH(dimensions,mapcache_dimension*) = dimension; } if(apr_is_empty_array(dimensions)) { ctx->set_error(ctx, 400, " for tileset \"%s\" has no dimensions defined (expecting children)",tileset->name); return; } tileset->dimensions = dimensions; dimension_node = ezxml_child(node,"store_assemblies"); if(dimension_node && dimension_node->txt) { if(!strcmp(dimension_node->txt,"false")) { tileset->store_dimension_assemblies = 0; } else if(strcmp(dimension_node->txt,"true")) { ctx->set_error(ctx,400,"failed to parse (%s), expecting \"true\" or \"false\"",dimension_node->txt); return; } } dimension_node = ezxml_child(node,"assembly_type"); if(dimension_node) { if(!strcmp(dimension_node->txt,"stack")) { tileset->dimension_assembly_type = MAPCACHE_DIMENSION_ASSEMBLY_STACK; } else if(!strcmp(dimension_node->txt,"animate")) { tileset->dimension_assembly_type = MAPCACHE_DIMENSION_ASSEMBLY_ANIMATE; ctx->set_error(ctx,400,"animate dimension assembly mode not implemented"); return; } else if(strcmp(dimension_node->txt,"none")) { ctx->set_error(ctx,400,"unknown dimension assembly mode (%s). Can be one of \"stack\" or \"none\"",dimension_node->txt); return; } else { tileset->dimension_assembly_type = MAPCACHE_DIMENSION_ASSEMBLY_NONE; } } /* should we create subdimensions from source if not found in cache. e.g. if dimension=mosaic returns dimension=val1,val2,val3 should we query the wms source with dimension=val1 , dimension=val2 and/or dimension=val3 if they are not found in cache */ dimension_node = ezxml_child(node,"subdimensions_read_only"); if(dimension_node) { if(tileset->dimension_assembly_type == MAPCACHE_DIMENSION_ASSEMBLY_NONE) { ctx->set_error(ctx,400," used on a tileset with no set, which makes no sense"); return; } if(dimension_node && dimension_node->txt && !strcmp(dimension_node->txt,"true")) { tileset->subdimension_read_only = 1; } else if(strcmp(dimension_node->txt,"false")) { ctx->set_error(ctx,400,"failed to parse (%s), expecting \"true\" or \"false\"",dimension_node->txt); return; } } } void parseGrid(mapcache_context *ctx, ezxml_t node, mapcache_cfg *config) { char *name; mapcache_extent extent = {0,0,0,0}; mapcache_grid *grid; ezxml_t cur_node; char *value; name = (char*)ezxml_attr(node,"name"); if(!name || !strlen(name)) { ctx->set_error(ctx, 400, "mandatory attribute \"name\" not found in "); return; } else { name = apr_pstrdup(ctx->pool, name); /* check we don't already have a grid defined with this name */ if(mapcache_configuration_get_grid(config, name)) { ctx->set_error(ctx, 400, "duplicate grid with name \"%s\"",name); return; } } grid = mapcache_grid_create(ctx->pool); grid->name = name; if ((cur_node = ezxml_child(node,"extent")) != NULL) { double *values; int nvalues; value = apr_pstrdup(ctx->pool,cur_node->txt); if(MAPCACHE_SUCCESS != mapcache_util_extract_double_list(ctx, value, NULL, &values, &nvalues) || nvalues != 4) { ctx->set_error(ctx, 400, "failed to parse extent array %s." "(expecting 4 space separated numbers, got %d (%f %f %f %f)" "eg -180 -90 180 90", value,nvalues,values[0],values[1],values[2],values[3]); return; } extent.minx = values[0]; extent.miny = values[1]; extent.maxx = values[2]; extent.maxy = values[3]; } if ((cur_node = ezxml_child(node,"metadata")) != NULL) { parseMetadata(ctx, cur_node, grid->metadata); GC_CHECK_ERROR(ctx); } if ((cur_node = ezxml_child(node,"units")) != NULL) { if(!strcasecmp(cur_node->txt,"dd")) { grid->unit = MAPCACHE_UNIT_DEGREES; } else if(!strcasecmp(cur_node->txt,"m")) { grid->unit = MAPCACHE_UNIT_METERS; } else if(!strcasecmp(cur_node->txt,"ft")) { grid->unit = MAPCACHE_UNIT_FEET; } else { ctx->set_error(ctx, 400, "unknown unit %s for grid %s (valid values are \"dd\", \"m\", and \"ft\"", cur_node->txt, grid->name); return; } } if ((cur_node = ezxml_child(node,"srs")) != NULL) { grid->srs = apr_pstrdup(ctx->pool,cur_node->txt); } for(cur_node = ezxml_child(node,"srsalias"); cur_node; cur_node = cur_node->next) { value = apr_pstrdup(ctx->pool,cur_node->txt); APR_ARRAY_PUSH(grid->srs_aliases,char*) = value; } if ((cur_node = ezxml_child(node,"origin")) != NULL) { if(!strcasecmp(cur_node->txt,"top-left")) { grid->origin = MAPCACHE_GRID_ORIGIN_TOP_LEFT; } else if(!strcasecmp(cur_node->txt,"bottom-left")) { grid->origin = MAPCACHE_GRID_ORIGIN_BOTTOM_LEFT; } else if(!strcasecmp(cur_node->txt,"top-right")) { grid->origin = MAPCACHE_GRID_ORIGIN_TOP_RIGHT; } else if(!strcasecmp(cur_node->txt,"bottom-right")) { grid->origin = MAPCACHE_GRID_ORIGIN_BOTTOM_RIGHT; } else { ctx->set_error(ctx, 400, "unknown origin %s for grid %s (valid values are \"top-left\", \"bottom-left\", \"top-right\" and \"bottom-right\"", cur_node->txt, grid->name); return; } if(grid->origin == MAPCACHE_GRID_ORIGIN_BOTTOM_RIGHT || grid->origin == MAPCACHE_GRID_ORIGIN_TOP_RIGHT) { ctx->set_error(ctx,500,"grid origin %s not implemented",cur_node->txt); return; } } if ((cur_node = ezxml_child(node,"size")) != NULL) { int *sizes, nsizes; value = apr_pstrdup(ctx->pool,cur_node->txt); if(MAPCACHE_SUCCESS != mapcache_util_extract_int_list(ctx, value, NULL, &sizes, &nsizes) || nsizes != 2) { ctx->set_error(ctx, 400, "failed to parse size array %s in grid %s" "(expecting two space separated integers, eg 256 256", value, grid->name); return; } grid->tile_sx = sizes[0]; grid->tile_sy = sizes[1]; } if ((cur_node = ezxml_child(node,"resolutions")) != NULL) { int nvalues; double *values; value = apr_pstrdup(ctx->pool,cur_node->txt); if(MAPCACHE_SUCCESS != mapcache_util_extract_double_list(ctx, value, NULL, &values, &nvalues) || !nvalues) { ctx->set_error(ctx, 400, "failed to parse resolutions array %s." "(expecting space separated numbers, " "eg 1 2 4 8 16 32", value); return; } grid->nlevels = nvalues; grid->levels = (mapcache_grid_level**)apr_pcalloc(ctx->pool, grid->nlevels*sizeof(mapcache_grid_level)); while(nvalues--) { double unitheight; double unitwidth; mapcache_grid_level *level = (mapcache_grid_level*)apr_pcalloc(ctx->pool,sizeof(mapcache_grid_level)); level->resolution = values[nvalues]; unitheight = grid->tile_sy * level->resolution; unitwidth = grid->tile_sx * level->resolution; level->maxy = ceil((extent.maxy-extent.miny - 0.01* unitheight)/unitheight); level->maxx = ceil((extent.maxx-extent.minx - 0.01* unitwidth)/unitwidth); grid->levels[nvalues] = level; } } if(grid->srs == NULL) { ctx->set_error(ctx, 400, "grid \"%s\" has no srs configured." " You must add a tag.", grid->name); return; } if(extent.minx >= extent.maxx || extent.miny >= extent.maxy) { ctx->set_error(ctx, 400, "grid \"%s\" has no (or invalid) extent configured" " You must add/correct a tag.", grid->name); return; } else { grid->extent = extent; } if(grid->tile_sx <= 0 || grid->tile_sy <= 0) { ctx->set_error(ctx, 400, "grid \"%s\" has no (or invalid) tile size configured" " You must add/correct a tag.", grid->name); return; } if(!grid->nlevels) { ctx->set_error(ctx, 400, "grid \"%s\" has no resolutions configured." " You must add a tag.", grid->name); return; } mapcache_configuration_add_grid(config,grid,name); } void parseSource(mapcache_context *ctx, ezxml_t node, mapcache_cfg *config) { ezxml_t cur_node; char *name = NULL, *type = NULL; mapcache_source *source; name = (char*)ezxml_attr(node,"name"); type = (char*)ezxml_attr(node,"type"); if(!name || !strlen(name)) { ctx->set_error(ctx, 400, "mandatory attribute \"name\" not found in "); return; } else { name = apr_pstrdup(ctx->pool, name); /* check we don't already have a source defined with this name */ if(mapcache_configuration_get_source(config, name)) { ctx->set_error(ctx, 400, "duplicate source with name \"%s\"",name); return; } } if(!type || !strlen(type)) { ctx->set_error(ctx, 400, "mandatory attribute \"type\" not found in "); return; } source = NULL; if(!strcmp(type,"wms")) { source = mapcache_source_wms_create(ctx); } else if(!strcmp(type,"mapserver")) { source = mapcache_source_mapserver_create(ctx); } else if(!strcmp(type,"gdal")) { source = mapcache_source_gdal_create(ctx); } else if(!strcmp(type,"dummy")) { source = mapcache_source_dummy_create(ctx); } else if(!strcmp(type,"fallback")) { source = mapcache_source_fallback_create(ctx); } else { ctx->set_error(ctx, 400, "unknown source type %s for source \"%s\"", type, name); return; } if(source == NULL) { ctx->set_error(ctx, 400, "failed to parse source \"%s\"", name); return; } source->name = name; if ((cur_node = ezxml_child(node,"metadata")) != NULL) { parseMetadata(ctx, cur_node, source->metadata); GC_CHECK_ERROR(ctx); } if ((cur_node = ezxml_child(node,"retries")) != NULL) { source->retry_count = atoi(cur_node->txt); if(source->retry_count > 10) { ctx->set_error(ctx,400,"source (%s) count of %d is unreasonably large. max is 10", source->name, source->retry_count); return; } } if ((cur_node = ezxml_child(node,"retry_delay")) != NULL) { source->retry_delay = (double)atof(cur_node->txt); if(source->retry_delay < 0) { ctx->set_error(ctx,400,"source (%s) retry delay of %f must be positive",source->name, source->retry_delay); return; } } source->configuration_parse_xml(ctx,node,source, config); GC_CHECK_ERROR(ctx); source->configuration_check(ctx,config,source); GC_CHECK_ERROR(ctx); mapcache_configuration_add_source(config,source,name); } void parseFormat(mapcache_context *ctx, ezxml_t node, mapcache_cfg *config) { char *name = NULL, *type = NULL; mapcache_image_format *format = NULL; ezxml_t cur_node; name = (char*)ezxml_attr(node,"name"); type = (char*)ezxml_attr(node,"type"); if(!name || !strlen(name)) { ctx->set_error(ctx, 400, "mandatory attribute \"name\" not found in "); return; } name = apr_pstrdup(ctx->pool, name); if(!type || !strlen(type)) { ctx->set_error(ctx, 400, "mandatory attribute \"type\" not found in "); return; } if(!strcmp(type,"PNG")) { int colors = -1; mapcache_compression_type compression = MAPCACHE_COMPRESSION_DEFAULT; if ((cur_node = ezxml_child(node,"compression")) != NULL) { if(!strcmp(cur_node->txt, "fast")) { compression = MAPCACHE_COMPRESSION_FAST; } else if(!strcmp(cur_node->txt, "best")) { compression = MAPCACHE_COMPRESSION_BEST; } else if(!strcmp(cur_node->txt, "none")) { compression = MAPCACHE_COMPRESSION_DISABLE; } else { ctx->set_error(ctx, 400, "unknown compression type %s for format \"%s\"", cur_node->txt, name); return; } } if ((cur_node = ezxml_child(node,"colors")) != NULL) { char *endptr; colors = (int)strtol(cur_node->txt,&endptr,10); if(*endptr != 0 || colors < 2 || colors > 256) { ctx->set_error(ctx, 400, "failed to parse colors \"%s\" for format \"%s\"" "(expecting an integer between 2 and 256 " "eg 256", cur_node->txt,name); return; } } if(colors == -1) { format = mapcache_imageio_create_png_format(ctx->pool, name,compression); } else { format = mapcache_imageio_create_png_q_format(ctx->pool, name,compression, colors); } } else if(!strcmp(type,"JPEG")) { int quality = 95; int optimize = TRUE; mapcache_photometric photometric = MAPCACHE_PHOTOMETRIC_YCBCR; if ((cur_node = ezxml_child(node,"quality")) != NULL) { char *endptr; quality = (int)strtol(cur_node->txt,&endptr,10); if(*endptr != 0 || quality < 1 || quality > 100) { ctx->set_error(ctx, 400, "failed to parse quality \"%s\" for format \"%s\"" "(expecting an integer between 1 and 100 " "eg 90", cur_node->txt,name); return; } } if ((cur_node = ezxml_child(node,"photometric")) != NULL) { if(!strcasecmp(cur_node->txt,"RGB")) photometric = MAPCACHE_PHOTOMETRIC_RGB; else if(!strcasecmp(cur_node->txt,"YCBCR")) photometric = MAPCACHE_PHOTOMETRIC_YCBCR; else { ctx->set_error(ctx,500,"failed to parse jpeg format %s photometric %s. expecting rgb or ycbcr", name,cur_node->txt); return; } } if ((cur_node = ezxml_child(node,"optimize")) != NULL) { if(cur_node->txt && !strcasecmp(cur_node->txt,"false")) optimize = MAPCACHE_OPTIMIZE_NO; else if(cur_node->txt && !strcasecmp(cur_node->txt,"true")) optimize = MAPCACHE_OPTIMIZE_YES; else if(cur_node->txt && !strcasecmp(cur_node->txt,"arithmetic")) optimize = MAPCACHE_OPTIMIZE_ARITHMETIC; else { ctx->set_error(ctx,500,"failed to parse jpeg format %s optimize %s. expecting true, false or arithmetic", name,cur_node->txt); return; } } format = mapcache_imageio_create_jpeg_format(ctx->pool, name,quality,photometric,optimize); } else if(!strcasecmp(type,"MIXED")) { mapcache_image_format *transparent=NULL, *opaque=NULL; unsigned int alpha_cutoff=255; if ((cur_node = ezxml_child(node,"transparent")) != NULL) { transparent = mapcache_configuration_get_image_format(config,cur_node->txt); } if(!transparent) { ctx->set_error(ctx,400, "mixed format %s references unknown transparent format %s" "(order is important, format %s should appear first)", name,cur_node->txt,cur_node->txt); return; } if ((cur_node = ezxml_child(node,"opaque")) != NULL) { opaque = mapcache_configuration_get_image_format(config,cur_node->txt); } if(!opaque) { ctx->set_error(ctx,400, "mixed format %s references unknown opaque format %s" "(order is important, format %s should appear first)", name,cur_node->txt,cur_node->txt); return; } if ((cur_node = ezxml_child(node,"alpha_cutoff")) != NULL) { alpha_cutoff = atoi(cur_node->txt); } format = mapcache_imageio_create_mixed_format(ctx->pool,name,transparent, opaque, alpha_cutoff); } else { ctx->set_error(ctx, 400, "unknown format type %s for format \"%s\"", type, name); return; } if(format == NULL) { ctx->set_error(ctx, 400, "failed to parse format \"%s\"", name); return; } mapcache_configuration_add_image_format(config,format,name); return; } void parseCache(mapcache_context *ctx, ezxml_t node, mapcache_cfg *config) { char *name = NULL, *type = NULL; mapcache_cache *cache = NULL; ezxml_t cur_node; name = (char*)ezxml_attr(node,"name"); type = (char*)ezxml_attr(node,"type"); if(!name || !strlen(name)) { ctx->set_error(ctx, 400, "mandatory attribute \"name\" not found in "); return; } else { name = apr_pstrdup(ctx->pool, name); /* check we don't already have a cache defined with this name */ if(mapcache_configuration_get_cache(config, name)) { ctx->set_error(ctx, 400, "duplicate cache with name \"%s\"",name); return; } } if(!type || !strlen(type)) { ctx->set_error(ctx, 400, "mandatory attribute \"type\" not found in "); return; } if(!strcmp(type,"disk")) { cache = mapcache_cache_disk_create(ctx); } else if(!strcmp(type,"fallback")) { cache = mapcache_cache_fallback_create(ctx); } else if(!strcmp(type,"multitier")) { cache = mapcache_cache_multitier_create(ctx); } else if(!strcmp(type,"composite")) { cache = mapcache_cache_composite_create(ctx); } else if(!strcmp(type,"rest")) { cache = mapcache_cache_rest_create(ctx); } else if(!strcmp(type,"s3")) { cache = mapcache_cache_s3_create(ctx); } else if(!strcmp(type,"azure")) { cache = mapcache_cache_azure_create(ctx); } else if(!strcmp(type,"google")) { cache = mapcache_cache_google_create(ctx); } else if(!strcmp(type,"bdb")) { cache = mapcache_cache_bdb_create(ctx); } else if(!strcmp(type,"tokyocabinet")) { cache = mapcache_cache_tc_create(ctx); } else if(!strcmp(type,"sqlite3")) { cache = mapcache_cache_sqlite_create(ctx); } else if(!strcmp(type,"mbtiles")) { cache = mapcache_cache_mbtiles_create(ctx); } else if(!strcmp(type,"memcache")) { cache = mapcache_cache_memcache_create(ctx); } else if(!strcmp(type,"tiff")) { cache = mapcache_cache_tiff_create(ctx); } else if(!strcmp(type,"couchbase")) { cache = mapcache_cache_couchbase_create(ctx); } else if(!strcmp(type,"riak")) { cache = mapcache_cache_riak_create(ctx); } else { ctx->set_error(ctx, 400, "unknown cache type %s for cache \"%s\"", type, name); return; } GC_CHECK_ERROR(ctx); if(cache == NULL) { ctx->set_error(ctx, 400, "failed to parse cache \"%s\"", name); return; } cache->name = name; if ((cur_node = ezxml_child(node,"retries")) != NULL) { cache->retry_count = atoi(cur_node->txt); if(cache->retry_count > 10) { ctx->set_error(ctx,400,"cache (%s) count of %d is unreasonably large. max is 10", cache->name, cache->retry_count); return; } } if ((cur_node = ezxml_child(node,"retry_delay")) != NULL) { cache->retry_delay = (double)atof(cur_node->txt); if(cache->retry_delay < 0) { ctx->set_error(ctx,400,"cache (%s) retry delay of %f must be positive",cache->name, cache->retry_delay); return; } } cache->configuration_parse_xml(ctx,node,cache,config); GC_CHECK_ERROR(ctx); mapcache_configuration_add_cache(config,cache,name); return; } void parseTileset(mapcache_context *ctx, ezxml_t node, mapcache_cfg *config) { char *name = NULL; mapcache_tileset *tileset = NULL; ezxml_t cur_node; char* value; int havewgs84bbox=0; if(config->mode == MAPCACHE_MODE_NORMAL) { name = (char*)ezxml_attr(node,"name"); } else { name = "mirror"; } if(!name || !strlen(name)) { ctx->set_error(ctx, 400, "mandatory attribute \"name\" not found in "); return; } else { name = apr_pstrdup(ctx->pool, name); /* check we don't already have a cache defined with this name */ if(mapcache_configuration_get_tileset(config, name)) { ctx->set_error(ctx, 400, "duplicate tileset with name \"%s\"",name); return; } } tileset = mapcache_tileset_create(ctx); tileset->name = name; if ((cur_node = ezxml_child(node,"read-only")) != NULL) { if(cur_node->txt && !strcmp(cur_node->txt,"true")) tileset->read_only = 1; } if ((cur_node = ezxml_child(node,"metadata")) != NULL) { parseMetadata(ctx, cur_node, tileset->metadata); GC_CHECK_ERROR(ctx); } if ((value = (char*)apr_table_get(tileset->metadata,"wgs84boundingbox")) != NULL) { double *values; int nvalues; value = apr_pstrdup(ctx->pool,value); if(MAPCACHE_SUCCESS != mapcache_util_extract_double_list(ctx, value, NULL, &values, &nvalues) || nvalues != 4) { ctx->set_error(ctx, 400, "failed to parse extent array %s." "(expecting 4 space separated numbers, got %d (%f %f %f %f)" "eg -180 -90 180 90", value,nvalues,values[0],values[1],values[2],values[3]); return; } tileset->wgs84bbox.minx = values[0]; tileset->wgs84bbox.miny = values[1]; tileset->wgs84bbox.maxx = values[2]; tileset->wgs84bbox.maxy = values[3]; havewgs84bbox = 1; } for(cur_node = ezxml_child(node,"grid"); cur_node; cur_node = cur_node->next) { mapcache_grid *grid; mapcache_grid_link *gridlink; char *restrictedExtent = NULL, *sTolerance = NULL; mapcache_extent *extent; int tolerance; if (tileset->grid_links == NULL) { tileset->grid_links = apr_array_make(ctx->pool,1,sizeof(mapcache_grid_link*)); } grid = mapcache_configuration_get_grid(config, cur_node->txt); if(!grid) { ctx->set_error(ctx, 400, "tileset \"%s\" references grid \"%s\"," " but it is not configured", name, cur_node->txt); return; } gridlink = apr_pcalloc(ctx->pool,sizeof(mapcache_grid_link)); gridlink->grid = grid; gridlink->minz = 0; gridlink->maxz = grid->nlevels; gridlink->grid_limits = (mapcache_extent_i*)apr_pcalloc(ctx->pool,grid->nlevels*sizeof(mapcache_extent_i)); gridlink->outofzoom_strategy = MAPCACHE_OUTOFZOOM_NOTCONFIGURED; gridlink->intermediate_grids = apr_array_make(ctx->pool,1,sizeof(mapcache_grid_link*)); restrictedExtent = (char*)ezxml_attr(cur_node,"restricted_extent"); if(restrictedExtent) { int nvalues; double *values; restrictedExtent = apr_pstrdup(ctx->pool,restrictedExtent); if(MAPCACHE_SUCCESS != mapcache_util_extract_double_list(ctx, restrictedExtent, NULL, &values, &nvalues) || nvalues != 4) { ctx->set_error(ctx, 400, "failed to parse extent array %s." "(expecting 4 space separated numbers, " "eg foo", restrictedExtent); return; } gridlink->restricted_extent = (mapcache_extent*) apr_pcalloc(ctx->pool, sizeof(mapcache_extent)); gridlink->restricted_extent->minx = values[0]; gridlink->restricted_extent->miny = values[1]; gridlink->restricted_extent->maxx = values[2]; gridlink->restricted_extent->maxy = values[3]; extent = gridlink->restricted_extent; } else { extent = &grid->extent; } tolerance = 5; sTolerance = (char*)ezxml_attr(cur_node,"tolerance"); if(sTolerance) { char *endptr; tolerance = (int)strtol(sTolerance,&endptr,10); if(*endptr != 0 || tolerance < 0) { ctx->set_error(ctx, 400, "failed to parse grid tolerance %s (expecting a positive integer)", sTolerance); return; } } sTolerance = (char*)ezxml_attr(cur_node,"use_wms_intermediate_resolutions"); if(sTolerance && !strcmp(sTolerance,"true")) { mapcache_grid_link *intermediate_gridlink = apr_pcalloc(ctx->pool,sizeof(mapcache_grid_link)); APR_ARRAY_PUSH(gridlink->intermediate_grids,mapcache_grid_link*) = intermediate_gridlink; } mapcache_grid_compute_limits(grid,extent,gridlink->grid_limits,tolerance); sTolerance = (char*)ezxml_attr(cur_node,"minzoom"); if(sTolerance) { char *endptr; tolerance = (int)strtol(sTolerance,&endptr,10); if(*endptr != 0 || tolerance < 0) { ctx->set_error(ctx, 400, "failed to parse grid minzoom %s (expecting a positive integer)", sTolerance); return; } gridlink->minz = tolerance; } sTolerance = (char*)ezxml_attr(cur_node,"maxzoom"); if(sTolerance) { char *endptr; tolerance = (int)strtol(sTolerance,&endptr,10); if(*endptr != 0 || tolerance < 0) { ctx->set_error(ctx, 400, "failed to parse grid maxzoom %s (expecting a positive integer)", sTolerance); return; } gridlink->maxz = tolerance + 1; } if(gridlink->minz<0 || gridlink->maxz>grid->nlevels || gridlink->minz>=gridlink->maxz) { ctx->set_error(ctx, 400, "invalid grid maxzoom/minzoom %d/%d", gridlink->minz,gridlink->maxz); return; } sTolerance = (char*)ezxml_attr(cur_node,"max-cached-zoom"); /* RFC97 implementation: check for a maximum zoomlevel to cache */ if(sTolerance) { char *endptr; tolerance = (int)strtol(sTolerance,&endptr,10); if(*endptr != 0 || tolerance < 0) { ctx->set_error(ctx, 400, "failed to parse grid max-cached-zoom %s (expecting a positive integer)", sTolerance); return; } if(tolerance > gridlink->maxz) { ctx->set_error(ctx, 400, "failed to parse grid max-cached-zoom %s (max cached zoom is greater than grid's max zoom)", sTolerance); return; } gridlink->max_cached_zoom = tolerance; /* default to reassembling */ gridlink->outofzoom_strategy = MAPCACHE_OUTOFZOOM_REASSEMBLE; sTolerance = (char*)ezxml_attr(cur_node,"out-of-zoom-strategy"); if(sTolerance) { if(!strcasecmp(sTolerance,"reassemble")) { gridlink->outofzoom_strategy = MAPCACHE_OUTOFZOOM_REASSEMBLE; } else if(!strcasecmp(sTolerance,"proxy")) { gridlink->outofzoom_strategy = MAPCACHE_OUTOFZOOM_PROXY; } else { ctx->set_error(ctx, 400, "failed to parse grid out-of-zoom-strategy %s (expecting \"reassemble\" or \"proxy\")", sTolerance); return; } } } /* compute wgs84 bbox if it wasn't supplied already */ if(!havewgs84bbox && !strcasecmp(grid->srs,"EPSG:4326")) { tileset->wgs84bbox = *extent; } if(gridlink->intermediate_grids->nelts > 0) { double factor = 0.5, unitheight,unitwidth; int i; mapcache_grid_link *igl = APR_ARRAY_IDX(gridlink->intermediate_grids, 0, mapcache_grid_link*); igl->restricted_extent = gridlink->restricted_extent; igl->minz = gridlink->minz; igl->max_cached_zoom = gridlink->max_cached_zoom - 1; igl->maxz = gridlink->maxz - 1; igl->outofzoom_strategy = gridlink->outofzoom_strategy; igl->grid = mapcache_grid_create(ctx->pool); igl->grid->extent = gridlink->grid->extent; igl->grid->name = apr_psprintf(ctx->pool,"%s_intermediate_%g",gridlink->grid->name,factor); igl->grid->nlevels = gridlink->grid->nlevels - 1; igl->grid->origin = gridlink->grid->origin; igl->grid->srs = gridlink->grid->srs; igl->grid->srs_aliases = gridlink->grid->srs_aliases; igl->grid->unit = gridlink->grid->unit; igl->grid->tile_sx = gridlink->grid->tile_sx + gridlink->grid->tile_sx * factor; igl->grid->tile_sy = gridlink->grid->tile_sy + gridlink->grid->tile_sy * factor; igl->grid->levels = (mapcache_grid_level**)apr_pcalloc(ctx->pool, igl->grid->nlevels*sizeof(mapcache_grid_level*)); for(i=0; igrid->nlevels; i++) { mapcache_grid_level *level = (mapcache_grid_level*)apr_pcalloc(ctx->pool,sizeof(mapcache_grid_level)); level->resolution = gridlink->grid->levels[i]->resolution + (gridlink->grid->levels[i+1]->resolution - gridlink->grid->levels[i]->resolution) * factor; unitheight = igl->grid->tile_sy * level->resolution; unitwidth = igl->grid->tile_sx * level->resolution; level->maxy = ceil((igl->grid->extent.maxy-igl->grid->extent.miny - 0.01* unitheight)/unitheight); level->maxx = ceil((igl->grid->extent.maxx-igl->grid->extent.minx - 0.01* unitwidth)/unitwidth); igl->grid->levels[i] = level; } igl->grid_limits = (mapcache_extent_i*)apr_pcalloc(ctx->pool,igl->grid->nlevels*sizeof(mapcache_extent_i)); mapcache_grid_compute_limits(igl->grid,extent,igl->grid_limits,tolerance); } APR_ARRAY_PUSH(tileset->grid_links,mapcache_grid_link*) = gridlink; } if ((cur_node = ezxml_child(node,"dimensions")) != NULL) { parseDimensions(ctx, cur_node, tileset); GC_CHECK_ERROR(ctx); } if ((cur_node = ezxml_child(node,"cache")) != NULL) { mapcache_cache *cache = mapcache_configuration_get_cache(config, cur_node->txt); if(!cache) { ctx->set_error(ctx, 400, "tileset \"%s\" references cache \"%s\"," " but it is not configured", name, cur_node->txt); return; } tileset->_cache = cache; } if ((cur_node = ezxml_child(node,"source")) != NULL) { mapcache_source *source = mapcache_configuration_get_source(config, cur_node->txt); if(!source) { ctx->set_error(ctx, 400, "tileset \"%s\" references source \"%s\"," " but it is not configured", name, cur_node->txt); return; } tileset->source = source; } if ((cur_node = ezxml_child(node,"metatile")) != NULL) { int *values, nvalues; value = apr_pstrdup(ctx->pool,cur_node->txt); if(MAPCACHE_SUCCESS != mapcache_util_extract_int_list(ctx, cur_node->txt, NULL, &values, &nvalues) || nvalues != 2) { ctx->set_error(ctx, 400, "failed to parse metatile dimension %s." "(expecting 2 space separated integers, " "eg 5 5", cur_node->txt); return; } tileset->metasize_x = values[0]; tileset->metasize_y = values[1]; } if ((cur_node = ezxml_child(node,"watermark")) != NULL) { if(!*cur_node->txt) { ctx->set_error(ctx,400, "watermark config entry empty"); return; } mapcache_tileset_add_watermark(ctx,tileset,cur_node->txt); GC_CHECK_ERROR(ctx); } if ((cur_node = ezxml_child(node,"expires")) != NULL) { char *endptr; tileset->expires = (int)strtol(cur_node->txt,&endptr,10); if(*endptr != 0) { ctx->set_error(ctx, 400, "failed to parse expires %s." "(expecting an integer, " "eg 3600", cur_node->txt); return; } } if ((cur_node = ezxml_child(node,"auto_expire")) != NULL) { char *endptr; tileset->auto_expire = (int)strtol(cur_node->txt,&endptr,10); if(*endptr != 0) { ctx->set_error(ctx, 400, "failed to parse auto_expire %s." "(expecting an integer, " "eg 3600", cur_node->txt); return; } } if ((cur_node = ezxml_child(node,"metabuffer")) != NULL) { char *endptr; tileset->metabuffer = (int)strtol(cur_node->txt,&endptr,10); if(*endptr != 0) { ctx->set_error(ctx, 400, "failed to parse metabuffer %s." "(expecting an integer, " "eg 1", cur_node->txt); return; } } if ((cur_node = ezxml_child(node,"format")) != NULL) { mapcache_image_format *format = mapcache_configuration_get_image_format(config,cur_node->txt); if(!format) { ctx->set_error(ctx, 400, "tileset \"%s\" references format \"%s\"," " but it is not configured",name,cur_node->txt); return; } tileset->format = format; } mapcache_tileset_configuration_check(ctx,tileset); GC_CHECK_ERROR(ctx); mapcache_configuration_add_tileset(config,tileset,name); return; } void parseServices(mapcache_context *ctx, ezxml_t root, mapcache_cfg *config) { ezxml_t node; if ((node = ezxml_child(root,"wms")) != NULL) { if(!node->txt || !*node->txt || strcmp(node->txt, "false")) { config->services[MAPCACHE_SERVICE_WMS] = mapcache_service_wms_create(ctx); } } if ((node = ezxml_child(root,"wmts")) != NULL) { if(!node->txt || !*node->txt || strcmp(node->txt, "false")) { config->services[MAPCACHE_SERVICE_WMTS] = mapcache_service_wmts_create(ctx); } } if ((node = ezxml_child(root,"ve")) != NULL) { if(!node->txt || !*node->txt || strcmp(node->txt, "false")) { config->services[MAPCACHE_SERVICE_VE] = mapcache_service_ve_create(ctx); } } if ((node = ezxml_child(root,"tms")) != NULL) { if(!node->txt || !*node->txt || strcmp(node->txt, "false")) { config->services[MAPCACHE_SERVICE_TMS] = mapcache_service_tms_create(ctx); } } if ((node = ezxml_child(root,"kml")) != NULL) { if(!node->txt || !*node->txt || strcmp(node->txt, "false")) { if(!config->services[MAPCACHE_SERVICE_TMS]) { ctx->set_error(ctx,400,"kml service requires the tms service to be active"); return; } config->services[MAPCACHE_SERVICE_KML] = mapcache_service_kml_create(ctx); } } if ((node = ezxml_child(root,"gmaps")) != NULL) { if(!node->txt || !*node->txt || strcmp(node->txt, "false")) { config->services[MAPCACHE_SERVICE_GMAPS] = mapcache_service_gmaps_create(ctx); } } if ((node = ezxml_child(root,"demo")) != NULL) { if(!node->txt || !*node->txt || strcmp(node->txt, "false")) { config->services[MAPCACHE_SERVICE_DEMO] = mapcache_service_demo_create(ctx); if(!config->services[MAPCACHE_SERVICE_WMS]) config->services[MAPCACHE_SERVICE_WMS] = mapcache_service_wms_create(ctx); } } if(!config->services[MAPCACHE_SERVICE_WMS] && !config->services[MAPCACHE_SERVICE_TMS] && !config->services[MAPCACHE_SERVICE_WMTS]) { ctx->set_error(ctx, 400, "no services configured." " You must add a tag with or children"); return; } } void mapcache_configuration_parse_xml(mapcache_context *ctx, const char *filename, mapcache_cfg *config) { ezxml_t doc, node; const char *mode; doc = ezxml_parse_file(filename); if (doc == NULL) { ctx->set_error(ctx,400, "failed to parse file %s. Is it valid XML?", filename); goto cleanup; } else { const char *err = ezxml_error(doc); if(err && *err) { ctx->set_error(ctx,400, "failed to parse file %s: %s", filename, err); goto cleanup; } } if(strcmp(doc->name,"mapcache")) { ctx->set_error(ctx,400, "failed to parse file %s. first node is not ", filename); goto cleanup; } mode = ezxml_attr(doc,"mode"); if(mode) { if(!strcmp(mode,"combined_mirror")) { config->mode = MAPCACHE_MODE_MIRROR_COMBINED; } else if(!strcmp(mode,"split_mirror")) { config->mode = MAPCACHE_MODE_MIRROR_SPLIT; } else if(!strcmp(mode,"normal")) { config->mode = MAPCACHE_MODE_NORMAL; } else { ctx->set_error(ctx,400,"unknown mode \"%s\" for ",mode); goto cleanup; } } else { config->mode = MAPCACHE_MODE_NORMAL; } for(node = ezxml_child(doc,"metadata"); node; node = node->next) { parseMetadata(ctx, node, config->metadata); if(GC_HAS_ERROR(ctx)) goto cleanup; } for(node = ezxml_child(doc,"source"); node; node = node->next) { parseSource(ctx, node, config); if(GC_HAS_ERROR(ctx)) goto cleanup; } for(node = ezxml_child(doc,"grid"); node; node = node->next) { parseGrid(ctx, node, config); if(GC_HAS_ERROR(ctx)) goto cleanup; } for(node = ezxml_child(doc,"format"); node; node = node->next) { parseFormat(ctx, node, config); if(GC_HAS_ERROR(ctx)) goto cleanup; } for(node = ezxml_child(doc,"cache"); node; node = node->next) { parseCache(ctx, node, config); if(GC_HAS_ERROR(ctx)) goto cleanup; } for(node = ezxml_child(doc,"tileset"); node; node = node->next) { parseTileset(ctx, node, config); if(GC_HAS_ERROR(ctx)) goto cleanup; } if ((node = ezxml_child(doc,"service")) != NULL) { ezxml_t service_node; for(service_node = node; service_node; service_node = service_node->next) { char *enabled = (char*)ezxml_attr(service_node,"enabled"); char *type = (char*)ezxml_attr(service_node,"type"); if(!strcasecmp(enabled,"true")) { if (!strcasecmp(type,"wms")) { mapcache_service *new_service = mapcache_service_wms_create(ctx); if(new_service->configuration_parse_xml) { new_service->configuration_parse_xml(ctx,service_node,new_service,config); } config->services[MAPCACHE_SERVICE_WMS] = new_service; } else if (!strcasecmp(type,"tms")) { mapcache_service *new_service = mapcache_service_tms_create(ctx); if(new_service->configuration_parse_xml) { new_service->configuration_parse_xml(ctx,service_node,new_service,config); } config->services[MAPCACHE_SERVICE_TMS] = new_service; } else if (!strcasecmp(type,"wmts")) { mapcache_service *new_service = mapcache_service_wmts_create(ctx); if(new_service->configuration_parse_xml) { new_service->configuration_parse_xml(ctx,service_node,new_service,config); } config->services[MAPCACHE_SERVICE_WMTS] = new_service; } else if (!strcasecmp(type,"kml")) { mapcache_service *new_service = mapcache_service_kml_create(ctx); if(new_service->configuration_parse_xml) { new_service->configuration_parse_xml(ctx,service_node,new_service,config); } config->services[MAPCACHE_SERVICE_KML] = new_service; } else if (!strcasecmp(type,"gmaps")) { mapcache_service *new_service = mapcache_service_gmaps_create(ctx); if(new_service->configuration_parse_xml) { new_service->configuration_parse_xml(ctx,service_node,new_service,config); } config->services[MAPCACHE_SERVICE_GMAPS] = new_service; } else if (!strcasecmp(type,"mapguide")) { mapcache_service *new_service = mapcache_service_mapguide_create(ctx); if(new_service->configuration_parse_xml) { new_service->configuration_parse_xml(ctx,service_node,new_service,config); } config->services[MAPCACHE_SERVICE_MAPGUIDE] = new_service; } else if (!strcasecmp(type,"ve")) { mapcache_service *new_service = mapcache_service_ve_create(ctx); if(new_service->configuration_parse_xml) { new_service->configuration_parse_xml(ctx,service_node,new_service,config); } config->services[MAPCACHE_SERVICE_VE] = new_service; } else if (!strcasecmp(type,"demo")) { mapcache_service *new_service = mapcache_service_demo_create(ctx); if(new_service->configuration_parse_xml) { new_service->configuration_parse_xml(ctx,service_node,new_service,config); } config->services[MAPCACHE_SERVICE_DEMO] = new_service; } else { ctx->set_error(ctx,400,"unknown type %s",type); } if(GC_HAS_ERROR(ctx)) goto cleanup; } } } else if ((node = ezxml_child(doc,"services")) != NULL) { ctx->log(ctx,MAPCACHE_WARN," tag is deprecated, use "); parseServices(ctx, node, config); } if(GC_HAS_ERROR(ctx)) goto cleanup; node = ezxml_child(doc,"default_format"); if(!node) node = ezxml_child(doc,"merge_format"); if (node) { mapcache_image_format *format = mapcache_configuration_get_image_format(config,node->txt); if(!format) { ctx->set_error(ctx, 400, "default_format tag references format %s but it is not configured", node->txt); goto cleanup; } config->default_image_format = format; } if ((node = ezxml_child(doc,"errors")) != NULL) { if(!strcmp(node->txt,"log")) { config->reporting = MAPCACHE_REPORT_LOG; } else if(!strcmp(node->txt,"report")) { config->reporting = MAPCACHE_REPORT_MSG; } else if(!strcmp(node->txt,"empty_img")) { config->reporting = MAPCACHE_REPORT_EMPTY_IMG; mapcache_image_create_empty(ctx, config); if(GC_HAS_ERROR(ctx)) goto cleanup; } else if(!strcmp(node->txt, "report_img")) { config->reporting = MAPCACHE_REPORT_ERROR_IMG; ctx->set_error(ctx,501,": report_img not implemented"); goto cleanup; } else { ctx->set_error(ctx,400,": unknown value %s (allowed are log, report, empty_img, report_img)", node->txt); goto cleanup; } } if((node = ezxml_child(doc,"locker")) != NULL) { mapcache_config_parse_locker(ctx,node,&config->locker); GC_CHECK_ERROR(ctx); } else { mapcache_config_parse_locker_old(ctx,doc,config); GC_CHECK_ERROR(ctx); } if((node = ezxml_child(doc,"threaded_fetching")) != NULL) { if(!strcasecmp(node->txt,"true")) { config->threaded_fetching = 1; } else if(strcasecmp(node->txt,"false")) { ctx->set_error(ctx, 400, "failed to parse threaded_fetching \"%s\". Expecting true or false",node->txt); return; } } if((node = ezxml_child(doc,"log_level")) != NULL) { if(!strcasecmp(node->txt,"debug")) { config->loglevel = MAPCACHE_DEBUG; } else if(!strcasecmp(node->txt,"info")) { config->loglevel = MAPCACHE_INFO; } else if(!strcasecmp(node->txt,"notice")) { config->loglevel = MAPCACHE_NOTICE; } else if(!strcasecmp(node->txt,"warn")) { config->loglevel = MAPCACHE_WARN; } else if(!strcasecmp(node->txt,"error")) { config->loglevel = MAPCACHE_ERROR; } else if(!strcasecmp(node->txt,"crit")) { config->loglevel = MAPCACHE_CRIT; } else if(!strcasecmp(node->txt,"alert")) { config->loglevel = MAPCACHE_ALERT; } else if(!strcasecmp(node->txt,"emerg")) { config->loglevel = MAPCACHE_EMERG; } else { ctx->set_error(ctx,500,"failed to parse \"%s\". Expecting debug, info, notice, warn, error, crit, alert or emerg",node->txt); return; } } if((node = ezxml_child(doc,"auto_reload")) != NULL) { if(!strcasecmp(node->txt,"true")) { config->autoreload = 1; } else if(!strcasecmp(node->txt,"false")) { config->autoreload = 0; } else { ctx->set_error(ctx,500,"failed to parse \"%s\". Expecting true or false",node->txt); return; } } cleanup: ezxml_free(doc); return; } /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/connection_pool.c000066400000000000000000000152111316353564100201470ustar00rootroot00000000000000/****************************************************************************** * * Project: MapServer * Purpose: MapCache connection pooling * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include #include "mapcache.h" struct mapcache_connection_pool { apr_pool_t *server_pool; apr_reslist_t *connexions; }; struct mapcache_pooled_connection_container { mapcache_pooled_connection *head; apr_pool_t *pool; unsigned int max_list_size; }; struct mapcache_pooled_connection_private_data { char *key; mapcache_connection_destructor destructor; mapcache_pooled_connection *next; mapcache_pooled_connection_container *pcc; }; static apr_status_t mapcache_connection_container_creator(void **conn_, void *params, apr_pool_t *pool) { mapcache_pooled_connection_container *pcc; pcc = calloc(1, sizeof(mapcache_pooled_connection_container)); pcc->max_list_size = 10; pcc->pool = pool; *conn_ = pcc; return APR_SUCCESS; } static apr_status_t mapcache_connection_container_destructor(void *conn_, void *params, apr_pool_t *pool) { mapcache_pooled_connection_container *pcc = (mapcache_pooled_connection_container*)conn_; mapcache_pooled_connection *pc = pcc->head; while(pc) { mapcache_pooled_connection *this = pc; this->private->destructor(this->connection); free(this->private->key); pc = this->private->next; free(this); } free(pcc); return MAPCACHE_SUCCESS; } apr_status_t mapcache_connection_pool_create(mapcache_connection_pool **cp, apr_pool_t *server_pool) { apr_status_t rv; *cp = apr_pcalloc(server_pool, sizeof(mapcache_connection_pool)); (*cp)->server_pool = server_pool; rv = apr_reslist_create(&((*cp)->connexions), 1, 5, 1024, 60*1000000, mapcache_connection_container_creator, mapcache_connection_container_destructor, NULL, server_pool); return rv; } mapcache_pooled_connection* mapcache_connection_pool_get_connection(mapcache_context *ctx, char *key, mapcache_connection_constructor constructor, mapcache_connection_destructor destructor, void *params) { apr_status_t rv; int count = 0; mapcache_pooled_connection_container *pcc; mapcache_pooled_connection *pc,*pred=NULL; rv = apr_reslist_acquire(ctx->connection_pool->connexions, (void**)&pcc); if(rv != APR_SUCCESS || !pcc) { char errmsg[120]; ctx->set_error(ctx,500, "failed to acquire connection from mapcache connection pool: (%s)", apr_strerror(rv, errmsg,120)); return NULL; } /* loop through existing connections to see if we find one matching the given key */ pc = pcc->head; while(pc) { count++; if(!strcmp(key,pc->private->key)) { /* move current connection to head of list, and return it. We only move the connection to the front of the list if it wasn't in the first 2 connections, as in the seeding case we are always alternating between read and write operations (i.e. potentially 2 different connections and in that cas we end up switching connections each time there's an access */ if(pc != pcc->head && count>2) { assert(pred); pred->private->next = pc->private->next; pc->private->next = pcc->head; pcc->head = pc; } return pc; } pred = pc; pc = pc->private->next; } /* connection not found in pool */ pc = calloc(1,sizeof(mapcache_pooled_connection)); /* ctx->log(ctx, MAPCACHE_DEBUG, "calling constructor for pooled connection (%s)", key); */ constructor(ctx, &pc->connection, params); if(GC_HAS_ERROR(ctx)) { free(pc); apr_reslist_release(ctx->connection_pool->connexions, pcc); return NULL; } pc->private = calloc(1,sizeof(mapcache_pooled_connection_private_data)); pc->private->key = strdup(key); pc->private->destructor = destructor; pc->private->next = pcc->head; pc->private->pcc = pcc; if(count == pcc->max_list_size) { /* max number of connections atained, we must destroy the last one that was used */ mapcache_pooled_connection *opc; opc = pcc->head; count = 1; while(count < pcc->max_list_size) { pred = opc; opc = opc->private->next; count++; } ctx->log(ctx, MAPCACHE_DEBUG, "tearing down pooled connection (%s) to make room", opc->private->key); opc->private->destructor(opc->connection); free(opc->private->key); free(opc->private); free(opc); if(pred) { pred->private->next = NULL; } } pcc->head = pc; return pc; } void mapcache_connection_pool_invalidate_connection(mapcache_context *ctx, mapcache_pooled_connection *connection) { mapcache_pooled_connection_container *pcc = connection->private->pcc; mapcache_pooled_connection *pc = pcc->head, *pred=NULL; while(pc) { if(pc == connection) { if(pred) { pred->private->next = pc->private->next; } else { pcc->head = pc->private->next; } pc->private->destructor(pc->connection); free(pc->private->key); free(pc); break; } pred = pc; pc = pc->private->next; } apr_reslist_release(ctx->connection_pool->connexions,(void*)pcc); } void mapcache_connection_pool_release_connection(mapcache_context *ctx, mapcache_pooled_connection *connection) { if(connection) { mapcache_pooled_connection_container *pcc = connection->private->pcc; apr_reslist_release(ctx->connection_pool->connexions,(void*)pcc); } } mapcache-rel-1-6-1/lib/core.c000066400000000000000000000572061316353564100157210ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching support file: high level functions called * from the CGI or apache-module implementations * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include #include "mapcache.h" #if APR_HAS_THREADS #include "apu_version.h" #if (APU_MAJOR_VERSION <= 1 && APU_MINOR_VERSION <= 3) #define USE_THREADPOOL 0 #else #define USE_THREADPOOL 1 #endif /* use a thread pool if using 1.3.12 or higher apu */ #if !USE_THREADPOOL #include #else #include #endif typedef struct { mapcache_tile *tile; mapcache_context *ctx; int launch; } _thread_tile; static void* APR_THREAD_FUNC _thread_get_tile(apr_thread_t *thread, void *data) { _thread_tile* t = (_thread_tile*)data; mapcache_tileset_tile_get(t->ctx, t->tile); #if !USE_THREADPOOL apr_thread_exit(thread, APR_SUCCESS); #endif return NULL; } #endif mapcache_http_response *mapcache_http_response_create(apr_pool_t *pool) { mapcache_http_response *response = (mapcache_http_response*) apr_pcalloc(pool, sizeof(mapcache_http_response)); /* make room for at least Expires, Cache-Control, and Content-Type */ response->headers = apr_table_make(pool,3); response->code = 200; return response; } void mapcache_prefetch_tiles(mapcache_context *ctx, mapcache_tile **tiles, int ntiles) { apr_thread_t **threads; apr_threadattr_t *thread_attrs; int nthreads; #if !APR_HAS_THREADS int i; for(i=0; iconfig->threaded_fetching == 0) { /* if threads disabled, or only fetching a single tile, don't launch a thread for the operation */ for(i=0; ipool,ntiles*sizeof(_thread_tile)); #if 1 || !USE_THREADPOOL /* use multiple threads, to fetch from multiple metatiles and/or multiple tilesets */ apr_threadattr_create(&thread_attrs, ctx->pool); threads = (apr_thread_t**)apr_pcalloc(ctx->pool, ntiles*sizeof(apr_thread_t*)); nthreads = 0; for(i=0; i=0) { /* check that the given metatile hasn't been rendered yet */ if(thread_tiles[j].launch && (thread_tiles[i].tile->tileset == thread_tiles[j].tile->tileset) && (thread_tiles[i].tile->x / thread_tiles[i].tile->tileset->metasize_x == thread_tiles[j].tile->x / thread_tiles[j].tile->tileset->metasize_x)&& (thread_tiles[i].tile->y / thread_tiles[i].tile->tileset->metasize_y == thread_tiles[j].tile->y / thread_tiles[j].tile->tileset->metasize_y)) { thread_tiles[i].launch = 0; /* this tile will not have a thread spawned for it */ break; } j--; } if(thread_tiles[i].launch) thread_tiles[i].ctx = ctx->clone(ctx); } for(i=0; ipool); if(rv != APR_SUCCESS) { ctx->set_error(ctx,500, "failed to create thread %d of %d\n",i,ntiles); break; } nthreads++; } /* wait for launched threads to finish */ for(i=0; iset_error(ctx,500, "thread %d of %d failed on exit\n",i,ntiles); } if(GC_HAS_ERROR(thread_tiles[i].ctx)) { /* transfer error message from child thread to main context */ ctx->set_error(ctx,thread_tiles[i].ctx->get_error(thread_tiles[i].ctx), thread_tiles[i].ctx->get_error_message(thread_tiles[i].ctx)); } } for(i=0; iconfig->download_threads,ctx->pool); for(i=0; ilog(ctx,MAPCACHE_DEBUG,"starting thread for tile %s",tiles[i]->tileset->name); thread_tiles[i].tile = tiles[i]; thread_tiles[i].ctx = ctx->clone(ctx); rv = apr_thread_pool_push(thread_pool,_thread_get_tile,(void*)&(thread_tiles[i]), 0,NULL); if(rv != APR_SUCCESS) { ctx->set_error(ctx,500, "failed to push thread %d of %d in thread pool\n",i,ntiles); break; } } GC_CHECK_ERROR(ctx); while(apr_thread_pool_tasks_run_count(thread_pool) != ntiles || apr_thread_pool_busy_count(thread_pool)>0) apr_sleep(10000); apr_thread_pool_destroy(thread_pool); for(i=0; iset_error(ctx,thread_tiles[i].ctx->get_error(thread_tiles[i].ctx), thread_tiles[i].ctx->get_error_message(thread_tiles[i].ctx)); } } #endif #endif } mapcache_http_response *mapcache_core_get_tile(mapcache_context *ctx, mapcache_request_get_tile *req_tile) { int expires = 0; mapcache_http_response *response; char *timestr; mapcache_image *base; mapcache_image_format *format; mapcache_image_format_type t; int i,is_empty=1; /* response image is initially empty */; base=NULL; format = NULL; #ifdef DEBUG if(req_tile->ntiles ==0) { ctx->set_error(ctx,500,"BUG: get_tile called with 0 tiles"); return NULL; } #endif response = mapcache_http_response_create(ctx->pool); if(ctx->supports_redirects && req_tile->ntiles == 1) { req_tile->tiles[0]->allow_redirect = 1; } mapcache_prefetch_tiles(ctx,req_tile->tiles,req_tile->ntiles); if(GC_HAS_ERROR(ctx)) return NULL; if(req_tile->tiles[0]->redirect) { response->code = 302; apr_table_set(response->headers,"Location",req_tile->tiles[0]->redirect); response->data = mapcache_buffer_create(0, ctx->pool); return response; } /* loop through tiles, and eventually merge them vertically together */ for(i=0; intiles; i++) { mapcache_tile *tile = req_tile->tiles[i]; /* shortcut */ if(tile->mtime && (tile->mtime < response->mtime || response->mtime == 0)) response->mtime = tile->mtime; if(tile->expires && (tile->expires < expires || expires == 0)) { expires = tile->expires; } if(tile->nodata) { /* treat the special case where the cache explicitely stated that the tile was empty, and we don't have any vertical merging to do */ if(tile->encoded_data && req_tile->ntiles == 1) { response->data = tile->encoded_data; /* we don't touch is_empty, as we have access to the encoded empty image, but the resulting tile is empty */ } continue; } /* treat the most common case: - we have a single tile request (i.e. isempty is true) - the cache returned the encoded image */ if(is_empty && tile->encoded_data) { response->data = tile->encoded_data; /* just in case we also have the raw image data available, keep a ref to it if we need to merge another tile ontop of it*/ if(tile->raw_image) { base = tile->raw_image; } is_empty = 0; /* we now know we might need to do some vertical merging */ continue; } /* if we're here, either * - we need to merge the current tile onto the previous one(s), or * - we only have the tile's raw data available */ if(!is_empty) { /* we have an existing tile, so we know we need to merge the current one into it */ if(!base) { /* the existing tile has not been decoded yet, but we need the access to the raw pixels*/ base = mapcache_imageio_decode(ctx, response->data); if(!base) return NULL; } response->data = NULL; /* the encoded data is now obsolete, as we will be merging the current tile */ /* we need to access the current tile's pixel data */ if(!tile->raw_image) { tile->raw_image = mapcache_imageio_decode(ctx,tile->encoded_data); if(!tile->raw_image) return NULL; } mapcache_image_merge(ctx, base, tile->raw_image); } else { /* we don't need to merge onto an existing tile and don't have access to the tile's encoded data. * * we don't encode the tile's raw image data just yet because we might need to merge another one on top * of it later. */ base = tile->raw_image; is_empty = 0; } } if(!response->data) { /* we need to encode the raw image data*/ if(base) { if(req_tile->image_request.format) { format = req_tile->image_request.format; } else { format = req_tile->tiles[0]->tileset->format; if(!format) { format = ctx->config->default_image_format; /* this one is always defined */ } } response->data = format->write(ctx, base, format); if(GC_HAS_ERROR(ctx)) { return NULL; } } else { unsigned char empty[5] = {'#',0,0,0,0}; #ifdef DEBUG if(!is_empty) { ctx->set_error(ctx,500,"BUG: no image data to encode, but tile not marked as empty"); return NULL; } #endif response->data = mapcache_empty_png_decode(ctx,req_tile->tiles[0]->grid_link->grid->tile_sx, req_tile->tiles[0]->grid_link->grid->tile_sy, empty,&is_empty); /* is_empty is unchanged and left to 1 */ format = mapcache_configuration_get_image_format(ctx->config,"PNG8"); } } /* compute the content-type */ t = mapcache_imageio_header_sniff(ctx,response->data); if(t == GC_PNG) apr_table_set(response->headers,"Content-Type","image/png"); else if(t == GC_JPEG) apr_table_set(response->headers,"Content-Type","image/jpeg"); /* compute expiry headers */ if(expires) { apr_time_t now = apr_time_now(); apr_time_t additional = apr_time_from_sec(expires); apr_time_t texpires = now + additional; apr_table_set(response->headers, "Cache-Control",apr_psprintf(ctx->pool, "max-age=%d", expires)); timestr = apr_palloc(ctx->pool, APR_RFC822_DATE_LEN); apr_rfc822_date(timestr, texpires); apr_table_setn(response->headers, "Expires", timestr); } return response; } mapcache_map* mapcache_assemble_maps(mapcache_context *ctx, mapcache_map **maps, int nmaps, mapcache_resample_mode mode) { mapcache_tile ***maptiles; int *nmaptiles; mapcache_tile **tiles; mapcache_grid_link **effectively_used_grid_links; mapcache_map *basemap = NULL; int ntiles = 0; int i; maptiles = apr_pcalloc(ctx->pool,nmaps*sizeof(mapcache_tile**)); nmaptiles = apr_pcalloc(ctx->pool,nmaps*sizeof(int)); effectively_used_grid_links = apr_pcalloc(ctx->pool,nmaps*sizeof(mapcache_grid_link*)); for(i=0; itileset,maps[i]->grid_link, &maps[i]->extent, maps[i]->width, maps[i]->height, &(nmaptiles[i]), &(maptiles[i]), &(effectively_used_grid_links[i])); if(GC_HAS_ERROR(ctx)) return NULL; ntiles += nmaptiles[i]; } tiles = apr_pcalloc(ctx->pool,ntiles * sizeof(mapcache_tile*)); ntiles = 0; for(i=0; idimensions = maps[i]->dimensions; ntiles++; } } mapcache_prefetch_tiles(ctx,tiles,ntiles); if(GC_HAS_ERROR(ctx)) return NULL; for(i=0; inodata) { continue; } hasdata++; /* update the map modification time if it is older than the tile mtime */ if(tile->mtime>maps[i]->mtime) { maps[i]->mtime = tile->mtime; } /* set the map expiration delay to the tile expiration delay, * either if the map hasn't got an expiration delay yet * or if the tile expiration is shorter than the map expiration */ if(!maps[i]->expires || tile->expiresexpires) { maps[i]->expires = tile->expires; } } if(hasdata) { maps[i]->raw_image = mapcache_tileset_assemble_map_tiles(ctx,maps[i]->tileset,effectively_used_grid_links[i], &maps[i]->extent, maps[i]->width, maps[i]->height, nmaptiles[i], maptiles[i], mode); if(!basemap) { basemap = maps[i]; } else { mapcache_image_merge(ctx,basemap->raw_image,maps[i]->raw_image); if(GC_HAS_ERROR(ctx)) return NULL; if(maps[i]->mtime > basemap->mtime) basemap->mtime = maps[i]->mtime; if(!basemap->expires || maps[i]->expiresexpires) basemap->expires = maps[i]->expires; apr_pool_cleanup_run(ctx->pool, maps[i]->raw_image->data, (void*)free) ; maps[i]->raw_image = NULL; } } else { maps[i]->nodata = 1; } } if(!basemap) { ctx->set_error(ctx,404, "no tiles containing image data could be retrieved to create map (not in cache, and/or no source configured)"); return NULL; } return basemap; } mapcache_http_response *mapcache_core_get_map(mapcache_context *ctx, mapcache_request_get_map *req_map) { mapcache_image_format *format = NULL; mapcache_http_response *response; mapcache_map *basemap = NULL; char *timestr; #ifdef DEBUG if(req_map->nmaps ==0) { ctx->set_error(ctx,500,"BUG: get_map called with 0 maps"); return NULL; } #endif if(req_map->getmap_strategy == MAPCACHE_GETMAP_ERROR) { ctx->set_error(ctx, 404, "full wms support disabled"); return NULL; } format = NULL; response = mapcache_http_response_create(ctx->pool); if(req_map->getmap_strategy == MAPCACHE_GETMAP_ASSEMBLE) { basemap = mapcache_assemble_maps(ctx, req_map->maps, req_map->nmaps, req_map->resample_mode); if(GC_HAS_ERROR(ctx)) return NULL; } else if(!ctx->config->non_blocking && req_map->getmap_strategy == MAPCACHE_GETMAP_FORWARD) { int i; basemap = req_map->maps[0]; for(i=0; inmaps; i++) { if(!req_map->maps[i]->tileset->source) { ctx->set_error(ctx,404,"cannot forward request for tileset %s: no source configured", req_map->maps[i]->tileset->name); return NULL; } } mapcache_source_render_map(ctx, basemap->tileset->source, basemap); if(GC_HAS_ERROR(ctx)) return NULL; if(req_map->nmaps>1) { if(!basemap->raw_image) { basemap->raw_image = mapcache_imageio_decode(ctx,basemap->encoded_data); if(GC_HAS_ERROR(ctx)) return NULL; } for(i=1; inmaps; i++) { mapcache_map *overlaymap = req_map->maps[i]; mapcache_source_render_map(ctx, overlaymap->tileset->source, overlaymap); if(GC_HAS_ERROR(ctx)) return NULL; if(!overlaymap->raw_image) { overlaymap->raw_image = mapcache_imageio_decode(ctx,overlaymap->encoded_data); if(GC_HAS_ERROR(ctx)) return NULL; } if(GC_HAS_ERROR(ctx)) return NULL; mapcache_image_merge(ctx,basemap->raw_image,overlaymap->raw_image); if(GC_HAS_ERROR(ctx)) return NULL; if(!basemap->expires || overlaymap->expiresexpires) basemap->expires = overlaymap->expires; } } } else { ctx->set_error(ctx,400,"failed getmap, readonly mode"); return NULL; } if(basemap->raw_image) { format = req_map->image_request.format; /* always defined, defaults to JPEG */ response->data = format->write(ctx,basemap->raw_image,format); if(GC_HAS_ERROR(ctx)) { return NULL; } } else { /* this case happens when we have a forward strategy for a single tileset */ #ifdef DEBUG if(!basemap->encoded_data) { ctx->set_error(ctx,500,"###BUG### core_get_map failed with null encoded_data"); return NULL; } #endif response->data = basemap->encoded_data; } /* compute the content-type */ if(format && format->mime_type) { apr_table_set(response->headers,"Content-Type",format->mime_type); } else { mapcache_image_format_type t = mapcache_imageio_header_sniff(ctx,response->data); if(t == GC_PNG) apr_table_set(response->headers,"Content-Type","image/png"); else if(t == GC_JPEG) apr_table_set(response->headers,"Content-Type","image/jpeg"); } /* compute expiry headers */ if(basemap->expires) { apr_time_t now = apr_time_now(); apr_time_t additional = apr_time_from_sec(basemap->expires); apr_time_t texpires = now + additional; apr_table_set(response->headers, "Cache-Control", apr_psprintf(ctx->pool, "max-age=%d", basemap->expires)); timestr = apr_palloc(ctx->pool, APR_RFC822_DATE_LEN); apr_rfc822_date(timestr, texpires); apr_table_setn(response->headers, "Expires", timestr); } response->mtime = basemap->mtime; return response; } mapcache_http_response *mapcache_core_proxy_request(mapcache_context *ctx, mapcache_request_proxy *req_proxy) { mapcache_http *http; mapcache_http_response *response = mapcache_http_response_create(ctx->pool); response->data = mapcache_buffer_create(30000,ctx->pool); http = mapcache_http_clone(ctx, req_proxy->rule->http); if(req_proxy->pathinfo) { if( (*(req_proxy->pathinfo)) == '/' || http->url[strlen(http->url)-1] == '/') http->url = apr_pstrcat(ctx->pool,http->url,req_proxy->pathinfo,NULL); else http->url = apr_pstrcat(ctx->pool,http->url,"/",req_proxy->pathinfo,NULL); } http->url = mapcache_http_build_url(ctx,http->url,req_proxy->params); http->post_body = req_proxy->post_buf; http->post_len = req_proxy->post_len; if(req_proxy->headers) { apr_table_overlap(http->headers, req_proxy->headers, APR_OVERLAP_TABLES_SET); } mapcache_http_do_request(ctx,http, response->data,response->headers,&response->code); if(response->code !=0 && GC_HAS_ERROR(ctx)) { /* the http request was successful, but the server returned an error */ ctx->clear_errors(ctx); } /*remove some headers that should not be sent back to the client*/ apr_table_unset(response->headers,"Transfer-Encoding"); apr_table_unset(response->headers,"Connection"); return response; } mapcache_http_response *mapcache_core_get_featureinfo(mapcache_context *ctx, mapcache_request_get_feature_info *req_fi) { mapcache_feature_info *fi = req_fi->fi; mapcache_tileset *tileset = fi->map.tileset; if(!tileset->source) { ctx->set_error(ctx,404,"cannot query tileset %s: no source defined",tileset->name); return NULL; } if(tileset->source->info_formats) { int i; mapcache_http_response *response; for(i=0; isource->info_formats->nelts; i++) { if(!strcmp(fi->format, APR_ARRAY_IDX(tileset->source->info_formats,i,char*))) { break; } } if(i == tileset->source->info_formats->nelts) { ctx->set_error(ctx,404, "unsupported feature info format %s",fi->format); return NULL; } mapcache_source_query_info(ctx, tileset->source, fi); if(GC_HAS_ERROR(ctx)) return NULL; response = mapcache_http_response_create(ctx->pool); response->data = fi->data; apr_table_set(response->headers,"Content-Type",fi->format); return response; } else { ctx->set_error(ctx,404, "tileset %s does not support feature info requests"); return NULL; } } mapcache_http_response* mapcache_core_get_capabilities(mapcache_context *ctx, mapcache_service *service, mapcache_request_get_capabilities *req_caps, char *url, char *path_info, mapcache_cfg *config) { mapcache_http_response *response; service->create_capabilities_response(ctx,req_caps,url,path_info,config); if(GC_HAS_ERROR(ctx)) { return NULL; } response = mapcache_http_response_create(ctx->pool); response->data = mapcache_buffer_create(0,ctx->pool); response->data->size = strlen(req_caps->capabilities); response->data->buf = req_caps->capabilities; response->data->avail = response->data->size; apr_table_set(response->headers,"Content-Type",req_caps->mime_type); return response; } mapcache_http_response* mapcache_core_respond_to_error(mapcache_context *ctx) { char *msg; //TODO: have the service format the error response mapcache_http_response *response = mapcache_http_response_create(ctx->pool); /* extract code and message from context */ response->code = ctx->_errcode; if(!response->code) response->code = 500; msg = ctx->_errmsg; if(!msg) { msg = apr_pstrdup(ctx->pool,"an unspecified error has occurred"); } ctx->log(ctx,MAPCACHE_ERROR,msg); if(ctx->config && ctx->config->reporting == MAPCACHE_REPORT_MSG) { char *err_body = msg; apr_table_set(response->headers, "Content-Type", "text/plain"); if(ctx->service && ctx->service->format_error) { ctx->service->format_error(ctx,ctx->service,msg,&err_body,response->headers); } /* manually populate the mapcache_buffer with the error message */ response->data = mapcache_buffer_create(0,ctx->pool); response->data->size = strlen(err_body); response->data->buf = err_body; response->data->avail = response->data->size; } else if(ctx->config && ctx->config->reporting == MAPCACHE_REPORT_EMPTY_IMG) { response->data = ctx->config->empty_image; apr_table_set(response->headers, "Content-Type", ctx->config->default_image_format->mime_type); apr_table_set(response->headers, "X-Mapcache-Error", msg); } else if(ctx->config && ctx->config->reporting == MAPCACHE_REPORT_ERROR_IMG) { mapcache_image *errim = mapcache_error_image(ctx,256,256,msg); mapcache_buffer *buf = ctx->config->default_image_format->write(ctx,errim,ctx->config->default_image_format); response->data = buf; apr_table_set(response->headers, "Content-Type", ctx->config->default_image_format->mime_type); apr_table_set(response->headers, "X-Mapcache-Error", msg); } return response; } /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/dimension.c000066400000000000000000000753561316353564100167640ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching support file: OGC dimensions * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #include #include #include #include #include #ifdef USE_SQLITE #include #include #endif #ifdef USE_PCRE #include #else #include #endif typedef struct mapcache_dimension_time mapcache_dimension_time; typedef struct mapcache_dimension_time_sqlite mapcache_dimension_time_sqlite; typedef struct mapcache_dimension_intervals mapcache_dimension_intervals; typedef struct mapcache_dimension_values mapcache_dimension_values; typedef struct mapcache_dimension_sqlite mapcache_dimension_sqlite; typedef struct mapcache_dimension_regex mapcache_dimension_regex; typedef struct mapcache_dimension_composite mapcache_dimension_composite; struct mapcache_dimension_values { mapcache_dimension dimension; apr_array_header_t *values; int case_sensitive; }; struct mapcache_dimension_sqlite { mapcache_dimension dimension; char *dbfile; char *get_values_for_entry_query; char *get_all_values_query; }; struct mapcache_dimension_regex { mapcache_dimension dimension; char *regex_string; #ifdef USE_PCRE pcre *pcregex; #else regex_t *regex; #endif }; struct mapcache_dimension_time { mapcache_dimension_sqlite dimension; }; #ifndef HAVE_TIMEGM time_t timegm(struct tm *tm) { time_t t, tdiff; struct tm in, gtime, ltime; memcpy(&in, tm, sizeof(in)); t = mktime(&in); memcpy(>ime, gmtime(&t), sizeof(gtime)); memcpy(<ime, localtime(&t), sizeof(ltime)); gtime.tm_isdst = ltime.tm_isdst; tdiff = t - mktime(>ime); memcpy(&in, tm, sizeof(in)); return mktime(&in) + tdiff; } #endif apr_array_header_t *mapcache_requested_dimensions_clone(apr_pool_t *pool, apr_array_header_t *src) { apr_array_header_t *ret = NULL; if(src) { int i; ret = apr_array_make(pool,src->nelts,sizeof(mapcache_requested_dimension*)); for(i=0; inelts; i++) { mapcache_requested_dimension *tiledim = apr_pcalloc(pool,sizeof(mapcache_requested_dimension)); mapcache_requested_dimension *srcdim = APR_ARRAY_IDX(src,i,mapcache_requested_dimension*); *tiledim = *srcdim; APR_ARRAY_PUSH(ret,mapcache_requested_dimension*) = tiledim; } } return ret; } void mapcache_set_requested_dimension(mapcache_context *ctx, apr_array_header_t *dimensions, const char *name, const char *value) { int i; if(!dimensions || dimensions->nelts <= 0) { ctx->set_error(ctx,500,"BUG: no dimensions configure for tile/map"); return; } for(i=0;inelts;i++) { mapcache_requested_dimension *dim = APR_ARRAY_IDX(dimensions,i,mapcache_requested_dimension*); if(!strcasecmp(dim->dimension->name,name)) { dim->requested_value = value?apr_pstrdup(ctx->pool,value):NULL; return; } } ctx->set_error(ctx,500,"BUG: dimension (%s) not found in tile/map",name); } void mapcache_set_cached_dimension(mapcache_context *ctx, apr_array_header_t *dimensions, const char *name, const char *value) { int i; if(!dimensions || dimensions->nelts <= 0) { ctx->set_error(ctx,500,"BUG: no dimensions configure for tile/map"); return; } for(i=0;inelts;i++) { mapcache_requested_dimension *dim = APR_ARRAY_IDX(dimensions,i,mapcache_requested_dimension*); if(!strcasecmp(dim->dimension->name,name)) { dim->cached_value = value?apr_pstrdup(ctx->pool,value):NULL; return; } } ctx->set_error(ctx,500,"BUG: dimension (%s) not found in tile/map",name); } void mapcache_tile_set_cached_dimension(mapcache_context *ctx, mapcache_tile *tile, const char *name, const char *value) { mapcache_set_cached_dimension(ctx,tile->dimensions,name,value); } void mapcache_map_set_cached_dimension(mapcache_context *ctx, mapcache_map *map, const char *name, const char *value) { mapcache_set_cached_dimension(ctx,map->dimensions,name,value); } void mapcache_tile_set_requested_dimension(mapcache_context *ctx, mapcache_tile *tile, const char *name, const char *value) { mapcache_set_requested_dimension(ctx,tile->dimensions,name,value); } void mapcache_map_set_requested_dimension(mapcache_context *ctx, mapcache_map *map, const char *name, const char *value) { mapcache_set_requested_dimension(ctx,map->dimensions,name,value); } static apr_array_header_t* _mapcache_dimension_regex_get_entries_for_value(mapcache_context *ctx, mapcache_dimension *dim, const char *value, mapcache_tileset *tileset, mapcache_extent *extent, mapcache_grid *grid) { mapcache_dimension_regex *dimension = (mapcache_dimension_regex*)dim; apr_array_header_t *values = apr_array_make(ctx->pool,1,sizeof(char*)); #ifdef USE_PCRE int ovector[30]; int rc = pcre_exec(dimension->pcregex,NULL,value,strlen(value),0,0,ovector,30); if(rc>0) { APR_ARRAY_PUSH(values,char*) = apr_pstrdup(ctx->pool,value); } #else if(!regexec(dimension->regex,value,0,0,0)) { APR_ARRAY_PUSH(values,char*) = apr_pstrdup(ctx->pool,value); } #endif else { ctx->set_error(ctx,400,"failed to validate requested value for dimension (%s)",dim->name); } return values; } static apr_array_header_t* _mapcache_dimension_regex_get_all_entries(mapcache_context *ctx, mapcache_dimension *dim, mapcache_tileset *tileset, mapcache_extent *extent, mapcache_grid *grid) { mapcache_dimension_regex *dimension = (mapcache_dimension_regex*)dim; apr_array_header_t *ret = apr_array_make(ctx->pool,1,sizeof(char*)); APR_ARRAY_PUSH(ret,char*) = apr_pstrdup(ctx->pool,dimension->regex_string); return ret; } static void _mapcache_dimension_regex_parse_xml(mapcache_context *ctx, mapcache_dimension *dim, ezxml_t node) { mapcache_dimension_regex *dimension; ezxml_t child_node = ezxml_child(node,"regex"); dimension = (mapcache_dimension_regex*)dim; if(child_node && child_node->txt && *child_node->txt) { dimension->regex_string = apr_pstrdup(ctx->pool,child_node->txt); } else { ctx->set_error(ctx,400,"failed to parse dimension regex: no child supplied"); return; } #ifdef USE_PCRE { const char *pcre_err; int pcre_offset; dimension->pcregex = pcre_compile(dimension->regex_string,0,&pcre_err, &pcre_offset,0); if(!dimension->pcregex) { ctx->set_error(ctx,400,"failed to compile regular expression \"%s\" for dimension \"%s\": %s", dimension->regex_string,dim->name,pcre_err); return; } } #else { int rc = regcomp(dimension->regex, dimension->regex_string, REG_EXTENDED); if(rc) { char errmsg[200]; regerror(rc,dimension->regex,errmsg,200); ctx->set_error(ctx,400,"failed to compile regular expression \"%s\" for dimension \"%s\": %s", dimension->regex_string,dim->name,errmsg); return; } } #endif } static apr_array_header_t* _mapcache_dimension_values_get_entries_for_value(mapcache_context *ctx, mapcache_dimension *dim, const char *value, mapcache_tileset *tileset, mapcache_extent *extent, mapcache_grid *grid) { int i; mapcache_dimension_values *dimension = (mapcache_dimension_values*)dim; apr_array_header_t *values = apr_array_make(ctx->pool,1,sizeof(char*)); for(i=0; ivalues->nelts; i++) { char *cur_val = APR_ARRAY_IDX(dimension->values,i,char*); if(dimension->case_sensitive) { if(!strcmp(value,cur_val)) { APR_ARRAY_PUSH(values,char*) = apr_pstrdup(ctx->pool,value); break; } } else { if(!strcasecmp(value,cur_val)) { APR_ARRAY_PUSH(values,char*) = apr_pstrdup(ctx->pool,value); break; } } } if(i == dimension->values->nelts) { ctx->set_error(ctx,400,"failed to validate requested value for dimension (%s)",dim->name); } return values; } static apr_array_header_t* _mapcache_dimension_values_get_all_entries(mapcache_context *ctx, mapcache_dimension *dim, mapcache_tileset *tileset, mapcache_extent *extent, mapcache_grid *grid) { mapcache_dimension_values *dimension = (mapcache_dimension_values*)dim; apr_array_header_t *ret = apr_array_make(ctx->pool,dimension->values->nelts,sizeof(char*)); int i; for(i=0; ivalues->nelts; i++) { APR_ARRAY_PUSH(ret,char*) = apr_pstrdup(ctx->pool,APR_ARRAY_IDX(dimension->values,i,char*)); } return ret; } static void _mapcache_dimension_values_parse_xml(mapcache_context *ctx, mapcache_dimension *dim, ezxml_t node) { mapcache_dimension_values *dimension; ezxml_t child_node = ezxml_child(node,"value"); dimension = (mapcache_dimension_values*)dim; if(!child_node) { ctx->set_error(ctx,400,"failed to parse dimension values: no children supplied"); return; } for(; child_node; child_node = child_node->next) { const char* entry = child_node->txt; if(!entry || !*entry) { ctx->set_error(ctx,400,"failed to parse dimension values: empty "); return; } APR_ARRAY_PUSH(dimension->values,char*) = apr_pstrdup(ctx->pool,entry); } child_node = ezxml_child(node,"case_sensitive"); if(child_node && child_node->txt) { if(!strcasecmp(child_node->txt,"true")) { dimension->case_sensitive = 1; } } if(!dimension->values->nelts) { ctx->set_error(ctx, 400, " \"%s\" has no values",dim->name); return; } } mapcache_dimension* mapcache_dimension_values_create(mapcache_context *ctx, apr_pool_t *pool) { mapcache_dimension_values *dimension = apr_pcalloc(pool, sizeof(mapcache_dimension_values)); dimension->dimension.type = MAPCACHE_DIMENSION_VALUES; dimension->values = apr_array_make(pool,1,sizeof(char*)); dimension->dimension.get_entries_for_value = _mapcache_dimension_values_get_entries_for_value; dimension->dimension.configuration_parse_xml = _mapcache_dimension_values_parse_xml; dimension->dimension.get_all_entries = _mapcache_dimension_values_get_all_entries; dimension->dimension.get_all_ogc_formatted_entries = _mapcache_dimension_values_get_all_entries; return (mapcache_dimension*)dimension; } mapcache_dimension* mapcache_dimension_regex_create(mapcache_context *ctx, apr_pool_t *pool) { mapcache_dimension_regex *dimension = apr_pcalloc(pool, sizeof(mapcache_dimension_regex)); dimension->dimension.type = MAPCACHE_DIMENSION_REGEX; #ifndef USE_PCRE dimension->regex = (regex_t*)apr_pcalloc(pool, sizeof(regex_t)); #endif dimension->dimension.get_entries_for_value = _mapcache_dimension_regex_get_entries_for_value; dimension->dimension.configuration_parse_xml = _mapcache_dimension_regex_parse_xml; dimension->dimension.get_all_entries = _mapcache_dimension_regex_get_all_entries; dimension->dimension.get_all_ogc_formatted_entries = _mapcache_dimension_regex_get_all_entries; return (mapcache_dimension*)dimension; } #ifdef USE_SQLITE struct sqlite_dimension_conn { sqlite3 *handle; sqlite3_stmt **prepared_statements; int n_statements; }; void mapcache_sqlite_dimension_connection_constructor(mapcache_context *ctx, void **conn_, void *params) { int ret; int flags; char *dbfile = (char*) params; struct sqlite_dimension_conn *conn = calloc(1, sizeof (struct sqlite_dimension_conn)); *conn_ = conn; flags = SQLITE_OPEN_READONLY | SQLITE_OPEN_NOMUTEX; ret = sqlite3_open_v2(dbfile, &conn->handle, flags, NULL); if (ret != SQLITE_OK) { ctx->set_error(ctx,500,"failed to open sqlite dimension dbfile (%s): %s",dbfile,sqlite3_errmsg(conn->handle)); sqlite3_close(conn->handle); *conn_=NULL; return; } sqlite3_busy_timeout(conn->handle, 300000); } void mapcache_sqlite_dimension_connection_destructor(void *conn_) { struct sqlite_dimension_conn *conn = (struct sqlite_dimension_conn*) conn_; while(conn->n_statements) { conn->n_statements--; if(conn->prepared_statements[conn->n_statements]) { sqlite3_finalize(conn->prepared_statements[conn->n_statements]); } } free(conn->prepared_statements); sqlite3_close(conn->handle); free(conn); } static mapcache_pooled_connection* _sqlite_dimension_get_conn(mapcache_context *ctx, mapcache_tileset *tileset, mapcache_dimension_sqlite *dim) { mapcache_dimension *pdim = (mapcache_dimension*)dim; char *conn_key = apr_pstrcat(ctx->pool,"dim_",tileset?tileset->name:"","_",pdim->name,NULL); mapcache_pooled_connection *pc = mapcache_connection_pool_get_connection(ctx,conn_key, mapcache_sqlite_dimension_connection_constructor, mapcache_sqlite_dimension_connection_destructor, dim->dbfile); return pc; } static void _sqlite_dimension_release_conn(mapcache_context *ctx, mapcache_pooled_connection *pc) { if(GC_HAS_ERROR(ctx)) { mapcache_connection_pool_invalidate_connection(ctx,pc); } else { mapcache_connection_pool_release_connection(ctx,pc); } } static void _mapcache_dimension_sqlite_bind_parameters(mapcache_context *ctx, sqlite3_stmt *stmt, sqlite3 *handle, const char *value, mapcache_tileset *tileset, mapcache_extent *extent, mapcache_grid *grid) { int paramidx,ret; paramidx = sqlite3_bind_parameter_index(stmt, ":dim"); if (paramidx) { ret = sqlite3_bind_text(stmt, paramidx, value, -1, SQLITE_STATIC); if(ret != SQLITE_OK) { ctx->set_error(ctx,400, "sqlite dimension failed to bind :dim : %s", sqlite3_errmsg(handle)); return; } } if(tileset) { paramidx = sqlite3_bind_parameter_index(stmt, ":tileset"); if (paramidx) { ret = sqlite3_bind_text(stmt, paramidx, tileset->name, -1, SQLITE_STATIC); if(ret != SQLITE_OK) { ctx->set_error(ctx,400, "sqlite dimension failed to bind :tileset : %s", sqlite3_errmsg(handle)); return; } } } if(grid) { paramidx = sqlite3_bind_parameter_index(stmt, ":gridsrs"); if (paramidx) { ret = sqlite3_bind_text(stmt, paramidx, grid->srs, -1, SQLITE_STATIC); if(ret != SQLITE_OK) { ctx->set_error(ctx,400, "failed to bind :gridsrs %s", sqlite3_errmsg(handle)); return; } } } paramidx = sqlite3_bind_parameter_index(stmt, ":minx"); if (paramidx) { ret = sqlite3_bind_double(stmt, paramidx, extent?extent->minx:-DBL_MAX); if(ret != SQLITE_OK) { ctx->set_error(ctx,400, "failed to bind :minx %s", sqlite3_errmsg(handle)); return; } } paramidx = sqlite3_bind_parameter_index(stmt, ":miny"); if (paramidx) { ret = sqlite3_bind_double(stmt, paramidx, extent?extent->miny:-DBL_MAX); if(ret != SQLITE_OK) { ctx->set_error(ctx,400, "failed to bind :miny %s", sqlite3_errmsg(handle)); return; } } paramidx = sqlite3_bind_parameter_index(stmt, ":maxx"); if (paramidx) { ret = sqlite3_bind_double(stmt, paramidx, extent?extent->maxx:DBL_MAX); if(ret != SQLITE_OK) { ctx->set_error(ctx,400, "failed to bind :maxx %s", sqlite3_errmsg(handle)); return; } } paramidx = sqlite3_bind_parameter_index(stmt, ":maxy"); if (paramidx) { ret = sqlite3_bind_double(stmt, paramidx, extent?extent->maxy:DBL_MAX); if(ret != SQLITE_OK) { ctx->set_error(ctx,400, "failed to bind :maxy %s", sqlite3_errmsg(handle)); return; } } } static apr_array_header_t* _mapcache_dimension_sqlite_get_entries_for_value(mapcache_context *ctx, mapcache_dimension *dim, const char *value, mapcache_tileset *tileset, mapcache_extent *extent, mapcache_grid *grid) { mapcache_dimension_sqlite *dimension = (mapcache_dimension_sqlite*)dim; struct sqlite_dimension_conn *conn = NULL; mapcache_pooled_connection *pc; apr_array_header_t *values = apr_array_make(ctx->pool,1,sizeof(char*)); int sqliteret; pc = _sqlite_dimension_get_conn(ctx,tileset,dimension); if (GC_HAS_ERROR(ctx)) { return values; } conn = pc->connection; if(!conn->prepared_statements) { conn->prepared_statements = calloc(2,sizeof(sqlite3_stmt*)); conn->n_statements = 2; } if(!conn->prepared_statements[0]) { if(SQLITE_OK != sqlite3_prepare_v2(conn->handle, dimension->get_values_for_entry_query, -1, &conn->prepared_statements[0], NULL)) { ctx->set_error(ctx, 500, "sqlite dimension backend failed on preparing query: %s", sqlite3_errmsg(conn->handle)); goto cleanup; } } _mapcache_dimension_sqlite_bind_parameters(ctx,conn->prepared_statements[0],conn->handle,value, tileset,extent,grid); if (GC_HAS_ERROR(ctx)) { return values; } do { sqliteret = sqlite3_step(conn->prepared_statements[0]); if (sqliteret != SQLITE_DONE && sqliteret != SQLITE_ROW && sqliteret != SQLITE_BUSY && sqliteret != SQLITE_LOCKED) { ctx->set_error(ctx, 500, "sqlite dimension backend failed on query : %s (%d)", sqlite3_errmsg(conn->handle), sqliteret); goto cleanup; } if(sqliteret == SQLITE_ROW) { const char* dimrow = (const char*) sqlite3_column_text(conn->prepared_statements[0], 0); APR_ARRAY_PUSH(values,char*) = apr_pstrdup(ctx->pool,dimrow); } } while (sqliteret == SQLITE_ROW || sqliteret == SQLITE_BUSY || sqliteret == SQLITE_LOCKED); cleanup: if(conn->prepared_statements[0]) { sqlite3_reset(conn->prepared_statements[0]); } _sqlite_dimension_release_conn(ctx,pc); return values; } static apr_array_header_t* _mapcache_dimension_sqlite_get_all_entries(mapcache_context *ctx, mapcache_dimension *dim, mapcache_tileset *tileset, mapcache_extent *extent, mapcache_grid *grid) { mapcache_dimension_sqlite *dimension = (mapcache_dimension_sqlite*)dim; struct sqlite_dimension_conn *conn = NULL; int sqliteret; apr_array_header_t *ret = apr_array_make(ctx->pool,0,sizeof(char*)); mapcache_pooled_connection *pc; pc = _sqlite_dimension_get_conn(ctx,tileset,dimension); if (GC_HAS_ERROR(ctx)) { return ret; } conn = pc->connection; if(!conn->prepared_statements) { conn->prepared_statements = calloc(2,sizeof(sqlite3_stmt*)); conn->n_statements = 2; } if(!conn->prepared_statements[1]) { sqliteret = sqlite3_prepare_v2(conn->handle, dimension->get_all_values_query, -1, &conn->prepared_statements[1], NULL); if(sqliteret != SQLITE_OK) { ctx->set_error(ctx, 500, "sqlite dimension backend failed on preparing query: %s", sqlite3_errmsg(conn->handle)); goto cleanup; } } _mapcache_dimension_sqlite_bind_parameters(ctx,conn->prepared_statements[1],conn->handle,NULL,tileset,extent,grid); if (GC_HAS_ERROR(ctx)) { return ret; } do { sqliteret = sqlite3_step(conn->prepared_statements[1]); if (sqliteret != SQLITE_DONE && sqliteret != SQLITE_ROW && sqliteret != SQLITE_BUSY && sqliteret != SQLITE_LOCKED) { ctx->set_error(ctx, 500, "sqlite dimension backend failed on query : %s (%d)", sqlite3_errmsg(conn->handle), sqliteret); goto cleanup; } if(sqliteret == SQLITE_ROW) { const char* sqdim = (const char*) sqlite3_column_text(conn->prepared_statements[1], 0); APR_ARRAY_PUSH(ret,char*) = apr_pstrdup(ctx->pool,sqdim); } } while (sqliteret == SQLITE_ROW || sqliteret == SQLITE_BUSY || sqliteret == SQLITE_LOCKED); cleanup: if(conn->prepared_statements[1]) { sqlite3_reset(conn->prepared_statements[1]); } _sqlite_dimension_release_conn(ctx,pc); return ret; } static void _mapcache_dimension_sqlite_parse_xml(mapcache_context *ctx, mapcache_dimension *dim, ezxml_t node) { mapcache_dimension_sqlite *dimension; ezxml_t child; dimension = (mapcache_dimension_sqlite*)dim; child = ezxml_child(node,"dbfile"); if(child) { dimension->dbfile = apr_pstrdup(ctx->pool, child->txt); } else { ctx->set_error(ctx,400,"sqlite dimension \"%s\" has no node", dim->name); return; } child = ezxml_child(node,"validate_query"); if(child) { dimension->get_values_for_entry_query = apr_pstrdup(ctx->pool, child->txt); } else { ctx->set_error(ctx,400,"sqlite dimension \"%s\" has no node", dim->name); return; } child = ezxml_child(node,"list_query"); if(child) { dimension->get_all_values_query = apr_pstrdup(ctx->pool, child->txt); } else { ctx->set_error(ctx,400,"sqlite dimension \"%s\" has no node", dim->name); return; } } static void _bind_sqlite_dimension_time_params(mapcache_context *ctx, sqlite3_stmt *stmt, sqlite3 *handle, const char *dim_value, mapcache_tileset *tileset, mapcache_grid *grid, mapcache_extent *extent, time_t start, time_t end) { int paramidx,ret; _mapcache_dimension_sqlite_bind_parameters(ctx,stmt,handle,dim_value,tileset,extent,grid); paramidx = sqlite3_bind_parameter_index(stmt, ":start_timestamp"); if (paramidx) { ret = sqlite3_bind_int64(stmt, paramidx, start); if(ret != SQLITE_OK) { ctx->set_error(ctx,400, "failed to bind :start_timestamp: %s", sqlite3_errmsg(handle)); return; } } paramidx = sqlite3_bind_parameter_index(stmt, ":end_timestamp"); if (paramidx) { ret = sqlite3_bind_int64(stmt, paramidx, end); if(ret != SQLITE_OK) { ctx->set_error(ctx,400, "failed to bind :end_timestamp: %s", sqlite3_errmsg(handle)); return; } } } apr_array_header_t *_mapcache_dimension_time_get_entries(mapcache_context *ctx, mapcache_dimension_time *dim, const char *dim_value, mapcache_tileset *tileset, mapcache_extent *extent, mapcache_grid *grid, time_t *intervals, int n_intervals) { mapcache_dimension_sqlite *sdim = (mapcache_dimension_sqlite*)dim; int i,ret; apr_array_header_t *time_ids = NULL; mapcache_pooled_connection *pc; struct sqlite_dimension_conn *conn; pc = _sqlite_dimension_get_conn(ctx,tileset,sdim); if (GC_HAS_ERROR(ctx)) { return NULL; } conn = pc->connection; if(!conn->prepared_statements) { conn->prepared_statements = calloc(1,sizeof(sqlite3_stmt*)); conn->n_statements = 1; } if(!conn->prepared_statements[0]) { ret = sqlite3_prepare_v2(conn->handle, sdim->get_values_for_entry_query, -1, &conn->prepared_statements[0], NULL); if(ret != SQLITE_OK) { ctx->set_error(ctx, 500, "time sqlite backend failed on preparing query: %s", sqlite3_errmsg(conn->handle)); _sqlite_dimension_release_conn(ctx, pc); return NULL; } } for(i=0;iprepared_statements[0],conn->handle,dim_value,tileset,grid,extent,intervals[i*2],intervals[i*2+1]); if(GC_HAS_ERROR(ctx)) { _sqlite_dimension_release_conn(ctx, pc); return NULL; } time_ids = apr_array_make(ctx->pool,0,sizeof(char*)); do { ret = sqlite3_step(conn->prepared_statements[0]); if (ret != SQLITE_DONE && ret != SQLITE_ROW && ret != SQLITE_BUSY && ret != SQLITE_LOCKED) { ctx->set_error(ctx, 500, "sqlite backend failed on dimension_time query : %s (%d)", sqlite3_errmsg(conn->handle), ret); _sqlite_dimension_release_conn(ctx, pc); return NULL; } if(ret == SQLITE_ROW) { const char* time_id = (const char*) sqlite3_column_text(conn->prepared_statements[0], 0); APR_ARRAY_PUSH(time_ids,char*) = apr_pstrdup(ctx->pool,time_id); } } while (ret == SQLITE_ROW || ret == SQLITE_BUSY || ret == SQLITE_LOCKED); sqlite3_reset(conn->prepared_statements[0]); } _sqlite_dimension_release_conn(ctx, pc); return time_ids; } apr_array_header_t* _mapcache_dimension_time_get_all_entries(mapcache_context *ctx, mapcache_dimension *dim, mapcache_tileset *tileset, mapcache_extent *extent, mapcache_grid *grid) { mapcache_dimension_time *tdim = (mapcache_dimension_time*)dim; time_t all[2] = {0,INT_MAX}; return _mapcache_dimension_time_get_entries(ctx,tdim,NULL,tileset,extent,grid,all,1); } #endif typedef enum { MAPCACHE_TINTERVAL_SECOND, MAPCACHE_TINTERVAL_MINUTE, MAPCACHE_TINTERVAL_HOUR, MAPCACHE_TINTERVAL_DAY, MAPCACHE_TINTERVAL_MONTH, MAPCACHE_TINTERVAL_YEAR } mapcache_time_interval_t; #ifdef USE_SQLITE void _mapcache_dimension_time_parse_xml(mapcache_context *ctx, mapcache_dimension *dim, ezxml_t node) { mapcache_dimension_sqlite *sdim = (mapcache_dimension_sqlite*)dim; mapcache_dimension *pdim = (mapcache_dimension*)dim; ezxml_t child; child = ezxml_child(node,"dbfile"); if(child && child->txt && *child->txt) { sdim->dbfile = apr_pstrdup(ctx->pool,child->txt); } else { ctx->set_error(ctx,400,"no entry for %s",pdim->name); return; } child = ezxml_child(node,"query"); if(child && child->txt && *child->txt) { sdim->get_values_for_entry_query = apr_pstrdup(ctx->pool,child->txt); } else { ctx->set_error(ctx,400,"no entry for %s",pdim->name); return; } } #endif char *mapcache_ogc_strptime(const char *value, struct tm *ts, mapcache_time_interval_t *ti) { char *valueptr; memset (ts, '\0', sizeof (*ts)); valueptr = strptime(value,"%Y-%m-%dT%H:%M:%SZ",ts); *ti = MAPCACHE_TINTERVAL_SECOND; if(valueptr) return valueptr; valueptr = strptime(value,"%Y-%m-%dT%H:%MZ",ts); *ti = MAPCACHE_TINTERVAL_MINUTE; if(valueptr) return valueptr; valueptr = strptime(value,"%Y-%m-%dT%HZ",ts); *ti = MAPCACHE_TINTERVAL_HOUR; if(valueptr) return valueptr; valueptr = strptime(value,"%Y-%m-%d",ts); *ti = MAPCACHE_TINTERVAL_DAY; if(valueptr) return valueptr; valueptr = strptime(value,"%Y-%m",ts); *ti = MAPCACHE_TINTERVAL_MONTH; if(valueptr) return valueptr; valueptr = strptime(value,"%Y",ts); *ti = MAPCACHE_TINTERVAL_YEAR; if(valueptr) return valueptr; return NULL; } #ifdef USE_SQLITE apr_array_header_t* _mapcache_dimension_time_get_entries_for_value(mapcache_context *ctx, mapcache_dimension *dimension, const char *value, mapcache_tileset *tileset, mapcache_extent *extent, mapcache_grid *grid) { /* look if supplied value is a predefined key */ /* split multiple values, loop */ /* extract start and end values */ struct tm tm_start,tm_end; time_t *intervals; mapcache_time_interval_t tis,tie; char *valueptr = apr_pstrdup(ctx->pool,value); char *last,*key; int count=0; mapcache_dimension_time *dimension_time = (mapcache_dimension_time*)dimension; /*count how many time entries were supplied*/ for(; *value; value++) if(*value == ',') count++; intervals = apr_pcalloc(ctx->pool,2*count*sizeof(time_t)); count = 0; /* Split the input on '&' */ for (key = apr_strtok(valueptr, ",", &last); key != NULL; key = apr_strtok(NULL, ",", &last)) { valueptr = mapcache_ogc_strptime(key,&tm_start,&tis); if(!valueptr) { ctx->set_error(ctx,400,"failed to parse time %s",value); return NULL; } if(*valueptr == '/' || (*valueptr == '-' && *(valueptr+1) == '-')) { /* we have a second (end) time */ if (*valueptr == '/') { valueptr++; } else { valueptr += 2; } valueptr = mapcache_ogc_strptime(valueptr,&tm_end,&tie); if(!valueptr) { ctx->set_error(ctx,400,"failed to parse end time in %s",value); return NULL; } } else if(*valueptr == 0) { tie = tis; tm_end = tm_start; } else { ctx->set_error(ctx,400,"failed (2) to parse time %s",value); return NULL; } intervals[count*2+1] = timegm(&tm_end); intervals[count*2] = timegm(&tm_start); if(difftime(intervals[count*2],intervals[count*2+1]) == 0) { switch(tie) { case MAPCACHE_TINTERVAL_SECOND: tm_end.tm_sec += 1; break; case MAPCACHE_TINTERVAL_MINUTE: tm_end.tm_min += 1; break; case MAPCACHE_TINTERVAL_HOUR: tm_end.tm_hour += 1; break; case MAPCACHE_TINTERVAL_DAY: tm_end.tm_mday += 1; break; case MAPCACHE_TINTERVAL_MONTH: tm_end.tm_mon += 1; break; case MAPCACHE_TINTERVAL_YEAR: tm_end.tm_year += 1; break; } intervals[count*2+1] = timegm(&tm_end); } count++; } return _mapcache_dimension_time_get_entries(ctx,dimension_time,value,tileset,extent,grid,intervals,count); /* end loop */ } #endif mapcache_dimension* mapcache_dimension_sqlite_create(mapcache_context *ctx, apr_pool_t *pool) { #ifdef USE_SQLITE mapcache_dimension_sqlite *dimension = apr_pcalloc(pool, sizeof(mapcache_dimension_sqlite)); dimension->dimension.type = MAPCACHE_DIMENSION_SQLITE; dimension->dbfile = NULL; dimension->dimension.get_entries_for_value = _mapcache_dimension_sqlite_get_entries_for_value; dimension->dimension.configuration_parse_xml = _mapcache_dimension_sqlite_parse_xml; dimension->dimension.get_all_entries = _mapcache_dimension_sqlite_get_all_entries; dimension->dimension.get_all_ogc_formatted_entries = _mapcache_dimension_sqlite_get_all_entries; return (mapcache_dimension*)dimension; #else ctx->set_error(ctx,400,"Sqlite dimension support requires SQLITE support to be built in"); return NULL; #endif } mapcache_dimension* mapcache_dimension_time_create(mapcache_context *ctx, apr_pool_t *pool) { #ifdef USE_SQLITE mapcache_dimension_time *dim = apr_pcalloc(pool, sizeof(mapcache_dimension_time)); mapcache_dimension *pdim = (mapcache_dimension*)dim; pdim->get_entries_for_value = _mapcache_dimension_time_get_entries_for_value; pdim->get_all_entries = _mapcache_dimension_time_get_all_entries; pdim->get_all_ogc_formatted_entries = _mapcache_dimension_time_get_all_entries; pdim->configuration_parse_xml = _mapcache_dimension_time_parse_xml; return pdim; #else ctx->set_error(ctx,400,"TIME dimension support requires SQLITE support to be built in"); return NULL; #endif } /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/ezxml.c000066400000000000000000001106221316353564100161200ustar00rootroot00000000000000/* ezxml.c * * Copyright 2004-2006 Aaron Voisine * * 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include #ifndef _WIN32 #include #else #define EZXML_NOMMAP 1 #define snprintf _snprintf #define vsnprintf _vsnprintf #endif #include #ifndef EZXML_NOMMAP #include #endif // EZXML_NOMMAP #include #include "ezxml.h" #define EZXML_WS "\t\r\n " // whitespace #define EZXML_ERRL 128 // maximum error string length typedef struct ezxml_root *ezxml_root_t; struct ezxml_root { // additional data for the root tag struct ezxml xml; // is a super-struct built on top of ezxml struct ezxml_t cur; // current xml tree insertion point char *m; // original xml string size_t len; // length of allocated memory for mmap, -1 for malloc char *u; // UTF-8 conversion of string if original was UTF-16 char *s; // start of work area char *e; // end of work area char **ent; // general entities (ampersand sequences) char ***attr; // default attributes char ***pi; // processing instructions short standalone; // non-zero if char err[EZXML_ERRL]; // error string }; char *EZXML_NIL[] = { NULL }; // empty, null terminated array of strings // returns the first child tag with the given name or NULL if not found ezxml_t ezxml_child(ezxml_t xml, const char *name) { xml = (xml) ? xml->child : NULL; while (xml && strcmp(name, xml->name)) xml = xml->sibling; return xml; } // returns the Nth tag with the same name in the same subsection or NULL if not // found ezxml_t ezxml_idx(ezxml_t xml, int idx) { for (; xml && idx; idx--) xml = xml->next; return xml; } // returns the value of the requested tag attribute or NULL if not found const char *ezxml_attr(ezxml_t xml, const char *attr) { int i = 0, j = 1; ezxml_root_t root = (ezxml_root_t)xml; if (! xml || ! xml->attr) return NULL; while (xml->attr[i] && strcmp(attr, xml->attr[i])) i += 2; if (xml->attr[i]) return xml->attr[i + 1]; // found attribute while (root->xml.parent) root = (ezxml_root_t)root->xml.parent; // root tag for (i = 0; root->attr[i] && strcmp(xml->name, root->attr[i][0]); i++); if (! root->attr[i]) return NULL; // no matching default attributes while (root->attr[i][j] && strcmp(attr, root->attr[i][j])) j += 3; return (root->attr[i][j]) ? root->attr[i][j + 1] : NULL; // found default } // same as ezxml_get but takes an already initialized va_list ezxml_t ezxml_vget(ezxml_t xml, va_list ap) { char *name = va_arg(ap, char *); int idx = -1; if (name && *name) { idx = va_arg(ap, int); xml = ezxml_child(xml, name); } return (idx < 0) ? xml : ezxml_vget(ezxml_idx(xml, idx), ap); } // Traverses the xml tree to retrieve a specific subtag. Takes a variable // length list of tag names and indexes. The argument list must be terminated // by either an index of -1 or an empty string tag name. Example: // title = ezxml_get(library, "shelf", 0, "book", 2, "title", -1); // This retrieves the title of the 3rd book on the 1st shelf of library. // Returns NULL if not found. ezxml_t ezxml_get(ezxml_t xml, ...) { va_list ap; ezxml_t r; va_start(ap, xml); r = ezxml_vget(xml, ap); va_end(ap); return r; } // returns a null terminated array of processing instructions for the given // target const char **ezxml_pi(ezxml_t xml, const char *target) { ezxml_root_t root = (ezxml_root_t)xml; int i = 0; if (! root) return (const char **)EZXML_NIL; while (root->xml.parent) root = (ezxml_root_t)root->xml.parent; // root tag while (root->pi[i] && strcmp(target, root->pi[i][0])) i++; // find target return (const char **)((root->pi[i]) ? root->pi[i] + 1 : EZXML_NIL); } // set an error string and return root ezxml_t ezxml_err(ezxml_root_t root, char *s, const char *err, ...) { va_list ap; int line = 1; char *t, fmt[EZXML_ERRL]; for (t = root->s; t < s; t++) if (*t == '\n') line++; snprintf(fmt, EZXML_ERRL, "[error near line %d]: %s", line, err); va_start(ap, err); vsnprintf(root->err, EZXML_ERRL, fmt, ap); va_end(ap); return &root->xml; } // Recursively decodes entity and character references and normalizes new lines // ent is a null terminated array of alternating entity names and values. set t // to '&' for general entity decoding, '%' for parameter entity decoding, 'c' // for cdata sections, ' ' for attribute normalization, or '*' for non-cdata // attribute normalization. Returns s, or if the decoded string is longer than // s, returns a malloced string that must be freed. char *ezxml_decode(char *s, char **ent, char t) { char *e, *r = s, *m = s; long b, c, d, l; for (; *s; s++) { // normalize line endings while (*s == '\r') { *(s++) = '\n'; if (*s == '\n') memmove(s, (s + 1), strlen(s)); } } for (s = r; ; ) { while (*s && *s != '&' && (*s != '%' || t != '%') && !isspace(*s)) s++; if (! *s) break; else if (t != 'c' && ! strncmp(s, "&#", 2)) { // character reference if (s[2] == 'x') c = strtol(s + 3, &e, 16); // base 16 else c = strtol(s + 2, &e, 10); // base 10 if (! c || *e != ';') { s++; // not a character ref continue; } if (c < 0x80) *(s++) = c; // US-ASCII subset else { // multi-byte UTF-8 sequence for (b = 0, d = c; d; d /= 2) b++; // number of bits in c b = (b - 2) / 5; // number of bytes in payload *(s++) = (0xFF << (7 - b)) | (c >> (6 * b)); // head while (b) *(s++) = 0x80 | ((c >> (6 * --b)) & 0x3F); // payload } memmove(s, strchr(s, ';') + 1, strlen(strchr(s, ';'))); } else if ((*s == '&' && (t == '&' || t == ' ' || t == '*')) || (*s == '%' && t == '%')) { // entity reference for (b = 0; ent[b] && strncmp(s + 1, ent[b], strlen(ent[b])); b += 2); // find entity in entity list if (ent[b++]) { // found a match if ((c = strlen(ent[b])) - 1 > (e = strchr(s, ';')) - s) { l = (d = (s - r)) + c + strlen(e); // new length r = (r == m) ? strcpy(malloc(l), r) : realloc(r, l); e = strchr((s = r + d), ';'); // fix up pointers } memmove(s + c, e + 1, strlen(e)); // shift rest of string strncpy(s, ent[b], c); // copy in replacement text } else s++; // not a known entity } else if ((t == ' ' || t == '*') && isspace(*s)) *(s++) = ' '; else s++; // no decoding needed } if (t == '*') { // normalize spaces for non-cdata attributes for (s = r; *s; s++) { if ((l = strspn(s, " "))) memmove(s, s + l, strlen(s + l) + 1); while (*s && *s != ' ') s++; } if (--s >= r && *s == ' ') *s = '\0'; // trim any trailing space } return r; } // called when parser finds start of new tag void ezxml_open_tag(ezxml_root_t root, char *name, char **attr) { ezxml_t xml = root->cur; if (xml->name) xml = ezxml_add_child(xml, name, strlen(xml->txt)); else xml->name = name; // first open tag xml->attr = attr; root->cur = xml; // update tag insertion point } // called when parser finds character content between open and closing tag void ezxml_char_content(ezxml_root_t root, char *s, size_t len, char t) { ezxml_t xml = root->cur; char *m = s; size_t l; if (! xml || ! xml->name || ! len) return; // sanity check s[len] = '\0'; // null terminate text (calling functions anticipate this) len = strlen(s = ezxml_decode(s, root->ent, t)) + 1; if (! *(xml->txt)) xml->txt = s; // initial character content else { // allocate our own memory and make a copy xml->txt = (xml->flags & EZXML_TXTM) // allocate some space ? realloc(xml->txt, (l = strlen(xml->txt)) + len) : strcpy(malloc((l = strlen(xml->txt)) + len), xml->txt); strcpy(xml->txt + l, s); // add new char content if (s != m) free(s); // free s if it was malloced by ezxml_decode() } if (xml->txt != m) ezxml_set_flag(xml, EZXML_TXTM); } // called when parser finds closing tag ezxml_t ezxml_close_tag(ezxml_root_t root, char *name, char *s) { if (! root->cur || ! root->cur->name || strcmp(name, root->cur->name)) return ezxml_err(root, s, "unexpected closing tag ", name); root->cur = root->cur->parent; return NULL; } // checks for circular entity references, returns non-zero if no circular // references are found, zero otherwise int ezxml_ent_ok(char *name, char *s, char **ent) { int i; for (; ; s++) { while (*s && *s != '&') s++; // find next entity reference if (! *s) return 1; if (! strncmp(s + 1, name, strlen(name))) return 0; // circular ref. for (i = 0; ent[i] && strncmp(ent[i], s + 1, strlen(ent[i])); i += 2); if (ent[i] && ! ezxml_ent_ok(name, ent[i + 1], ent)) return 0; } } // called when the parser finds a processing instruction void ezxml_proc_inst(ezxml_root_t root, char *s, size_t len) { int i = 0, j = 1; char *target = s; s[len] = '\0'; // null terminate instruction if (*(s += strcspn(s, EZXML_WS))) { *s = '\0'; // null terminate target s += strspn(s + 1, EZXML_WS) + 1; // skip whitespace after target } if (! strcmp(target, "xml")) { // if ((s = strstr(s, "standalone")) && ! strncmp(s + strspn(s + 10, EZXML_WS "='\"") + 10, "yes", 3)) root->standalone = 1; return; } if (! root->pi[0]) *(root->pi = malloc(sizeof(char **))) = NULL; //first pi while (root->pi[i] && strcmp(target, root->pi[i][0])) i++; // find target if (! root->pi[i]) { // new target root->pi = realloc(root->pi, sizeof(char **) * (i + 2)); root->pi[i] = malloc(sizeof(char *) * 3); root->pi[i][0] = target; root->pi[i][1] = (char *)(root->pi[i + 1] = NULL); // terminate pi list root->pi[i][2] = strdup(""); // empty document position list } while (root->pi[i][j]) j++; // find end of instruction list for this target root->pi[i] = realloc(root->pi[i], sizeof(char *) * (j + 3)); root->pi[i][j + 2] = realloc(root->pi[i][j + 1], j + 1); strcpy(root->pi[i][j + 2] + j - 1, (root->xml.name) ? ">" : "<"); root->pi[i][j + 1] = NULL; // null terminate pi list for this target root->pi[i][j] = s; // set instruction } // called when the parser finds an internal doctype subset short ezxml_internal_dtd(ezxml_root_t root, char *s, size_t len) { char q, *c, *t, *n = NULL, *v, **ent, **pe; int i, j; pe = memcpy(malloc(sizeof(EZXML_NIL)), EZXML_NIL, sizeof(EZXML_NIL)); for (s[len] = '\0'; s; ) { while (*s && *s != '<' && *s != '%') s++; // find next declaration if (! *s) break; else if (! strncmp(s, "'); continue; } for (i = 0, ent = (*c == '%') ? pe : root->ent; ent[i]; i++); ent = realloc(ent, (i + 3) * sizeof(char *)); // space for next ent if (*c == '%') pe = ent; else root->ent = ent; *(++s) = '\0'; // null terminate name if ((s = strchr(v, q))) *(s++) = '\0'; // null terminate value ent[i + 1] = ezxml_decode(v, pe, '%'); // set value ent[i + 2] = NULL; // null terminate entity list if (! ezxml_ent_ok(n, ent[i + 1], ent)) { // circular reference if (ent[i + 1] != v) free(ent[i + 1]); ezxml_err(root, v, "circular entity declaration &%s", n); break; } else ent[i] = n; // set entity name } else if (! strncmp(s, "")) == '>') continue; else *s = '\0'; // null terminate tag name for (i = 0; root->attr[i] && strcmp(n, root->attr[i][0]); i++); while (*(n = s + 1 + strspn(s + 1, EZXML_WS)) && *n != '>') { if (*(s = n + strcspn(n, EZXML_WS))) *s = '\0'; // attr name else { ezxml_err(root, t, "malformed ") - 1; if (*c == ' ') continue; // cdata is default, nothing to do v = NULL; } else if ((*s == '"' || *s == '\'') && // default value (s = strchr(v = s + 1, *s))) *s = '\0'; else { ezxml_err(root, t, "malformed attr[i]) { // new tag name root->attr = (! i) ? malloc(2 * sizeof(char **)) : realloc(root->attr, (i + 2) * sizeof(char **)); root->attr[i] = malloc(2 * sizeof(char *)); root->attr[i][0] = t; // set tag name root->attr[i][1] = (char *)(root->attr[i + 1] = NULL); } for (j = 1; root->attr[i][j]; j += 3); // find end of list root->attr[i] = realloc(root->attr[i], (j + 4) * sizeof(char *)); root->attr[i][j + 3] = NULL; // null terminate list root->attr[i][j + 2] = c; // is it cdata? root->attr[i][j + 1] = (v) ? ezxml_decode(v, root->ent, *c) : NULL; root->attr[i][j] = n; // attribute name } } else if (! strncmp(s, ""); // comments else if (! strncmp(s, ""))) ezxml_proc_inst(root, c, s++ - c); } else if (*s == '<') s = strchr(s, '>'); // skip other declarations else if (*(s++) == '%' && ! root->standalone) break; } free(pe); return ! *root->err; } // Converts a UTF-16 string to UTF-8. Returns a new string that must be freed // or NULL if no conversion was needed. char *ezxml_str2utf8(char **s, size_t *len) { char *u; size_t l = 0, sl, max = *len; long c, d; int b, be = (**s == '\xFE') ? 1 : (**s == '\xFF') ? 0 : -1; if (be == -1) return NULL; // not UTF-16 u = malloc(max); for (sl = 2; sl < *len - 1; sl += 2) { c = (be) ? (((*s)[sl] & 0xFF) << 8) | ((*s)[sl + 1] & 0xFF) //UTF-16BE : (((*s)[sl + 1] & 0xFF) << 8) | ((*s)[sl] & 0xFF); //UTF-16LE if (c >= 0xD800 && c <= 0xDFFF && (sl += 2) < *len - 1) { // high-half d = (be) ? (((*s)[sl] & 0xFF) << 8) | ((*s)[sl + 1] & 0xFF) : (((*s)[sl + 1] & 0xFF) << 8) | ((*s)[sl] & 0xFF); c = (((c & 0x3FF) << 10) | (d & 0x3FF)) + 0x10000; } while (l + 6 > max) u = realloc(u, max += EZXML_BUFSIZE); if (c < 0x80) u[l++] = c; // US-ASCII subset else { // multi-byte UTF-8 sequence for (b = 0, d = c; d; d /= 2) b++; // bits in c b = (b - 2) / 5; // bytes in payload u[l++] = (0xFF << (7 - b)) | (c >> (6 * b)); // head while (b) u[l++] = 0x80 | ((c >> (6 * --b)) & 0x3F); // payload } } return *s = realloc(u, *len = l); } // frees a tag attribute list void ezxml_free_attr(char **attr) { int i = 0; char *m; if (! attr || attr == EZXML_NIL) return; // nothing to free while (attr[i]) i += 2; // find end of attribute list m = attr[i + 1]; // list of which names and values are malloced for (i = 0; m[i]; i++) { if (m[i] & EZXML_NAMEM) free(attr[i * 2]); if (m[i] & EZXML_TXTM) free(attr[(i * 2) + 1]); } free(m); free(attr); } // parse the given xml string and return an ezxml structure ezxml_t ezxml_parse_str(char *s, size_t len) { ezxml_root_t root = (ezxml_root_t)ezxml_new(NULL); char q, e, *d, **attr, **a = NULL; // initialize a to avoid compile warning int l, i, j; root->m = s; if (! len) return ezxml_err(root, NULL, "root tag missing"); root->u = ezxml_str2utf8(&s, &len); // convert utf-16 to utf-8 root->e = (root->s = s) + len; // record start and end of work area e = s[len - 1]; // save end char s[len - 1] = '\0'; // turn end char into null terminator while (*s && *s != '<') s++; // find first tag if (! *s) return ezxml_err(root, s, "root tag missing"); for (; ; ) { attr = (char **)EZXML_NIL; d = ++s; if (isalpha(*s) || *s == '_' || *s == ':' || *s < '\0') { // new tag if (! root->cur) return ezxml_err(root, d, "markup outside of root element"); s += strcspn(s, EZXML_WS "/>"); while (isspace(*s)) *(s++) = '\0'; // null terminate tag name if (*s && *s != '/' && *s != '>') // find tag in default attr list for (i = 0; (a = root->attr[i]) && strcmp(a[0], d); i++); for (l = 0; *s && *s != '/' && *s != '>'; l += 2) { // new attrib attr = (l) ? realloc(attr, (l + 4) * sizeof(char *)) : malloc(4 * sizeof(char *)); // allocate space attr[l + 3] = (l) ? realloc(attr[l + 1], (l / 2) + 2) : malloc(2); // mem for list of maloced vals strcpy(attr[l + 3] + (l / 2), " "); // value is not malloced attr[l + 2] = NULL; // null terminate list attr[l + 1] = ""; // temporary attribute value attr[l] = s; // set attribute name s += strcspn(s, EZXML_WS "=/>"); if (*s == '=' || isspace(*s)) { *(s++) = '\0'; // null terminate tag attribute name q = *(s += strspn(s, EZXML_WS "=")); if (q == '"' || q == '\'') { // attribute value attr[l + 1] = ++s; while (*s && *s != q) s++; if (*s) *(s++) = '\0'; // null terminate attribute val else { ezxml_free_attr(attr); return ezxml_err(root, d, "missing %c", q); } for (j = 1; a && a[j] && strcmp(a[j], attr[l]); j +=3); attr[l + 1] = ezxml_decode(attr[l + 1], root->ent, (a && a[j]) ? *a[j + 2] : ' '); if (attr[l + 1] < d || attr[l + 1] > s) attr[l + 3][l / 2] = EZXML_TXTM; // value malloced } } while (isspace(*s)) s++; } if (*s == '/') { // self closing tag *(s++) = '\0'; if ((*s && *s != '>') || (! *s && e != '>')) { if (l) ezxml_free_attr(attr); return ezxml_err(root, d, "missing >"); } ezxml_open_tag(root, d, attr); ezxml_close_tag(root, d, s); } else if ((q = *s) == '>' || (! *s && e == '>')) { // open tag *s = '\0'; // temporarily null terminate tag name ezxml_open_tag(root, d, attr); *s = q; } else { if (l) ezxml_free_attr(attr); return ezxml_err(root, d, "missing >"); } } else if (*s == '/') { // close tag s += strcspn(d = s + 1, EZXML_WS ">") + 1; if (! (q = *s) && e != '>') return ezxml_err(root, d, "missing >"); *s = '\0'; // temporarily null terminate tag name if (ezxml_close_tag(root, d, s)) return &root->xml; if (isspace(*s = q)) s += strspn(s, EZXML_WS); } else if (! strncmp(s, "!--", 3)) { // xml comment if (! (s = strstr(s + 3, "--")) || (*(s += 2) != '>' && *s) || (! *s && e != '>')) return ezxml_err(root, d, "unclosed \ %s\ "; if(!ctx->exceptions) { *err_body = msg; return; } exceptions=""; array = apr_table_elts(ctx->exceptions); elts = (apr_table_entry_t *) array->elts; for (i = 0; i < array->nelts; i++) { exceptions = apr_pstrcat(ctx->pool,exceptions,apr_psprintf(ctx->pool, "",elts[i].key,elts[i].val),NULL); } *err_body = apr_psprintf(ctx->pool,template, mapcache_util_str_xml_escape(ctx->pool, msg, MAPCACHE_UTIL_XML_SECTION_COMMENT), exceptions); apr_table_set(headers, "Content-Type", "application/xml"); } mapcache_service* mapcache_service_wmts_create(mapcache_context *ctx) { mapcache_service_wmts* service = (mapcache_service_wmts*)apr_pcalloc(ctx->pool, sizeof(mapcache_service_wmts)); if(!service) { ctx->set_error(ctx, 500, "failed to allocate wtms service"); return NULL; } service->service.url_prefix = apr_pstrdup(ctx->pool,"wmts"); service->service.name = apr_pstrdup(ctx->pool,"wmts"); service->service.type = MAPCACHE_SERVICE_WMTS; service->service.parse_request = _mapcache_service_wmts_parse_request; service->service.create_capabilities_response = _create_capabilities_wmts; service->service.format_error = _error_report_wmts; return (mapcache_service*)service; } /** @} */ /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/services.c000066400000000000000000000061521316353564100166060ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching support file: high level service dispatching * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #include #include /** \addtogroup services */ /** @{ */ void mapcache_service_dispatch_request(mapcache_context *ctx, mapcache_request **request, char *pathinfo, apr_table_t *params, mapcache_cfg *config) { int i; /* skip empty pathinfo */ if(!pathinfo) { ctx->set_error(ctx,404,"missing a service"); return; } /*skip leading /'s */ while((*pathinfo) == '/') ++pathinfo; for(i=0; iservices[i]; if(!service) continue; /* skip an unconfigured service */ prefixlen = strlen(service->url_prefix); if(strncmp(service->url_prefix,pathinfo, prefixlen)) continue; /*skip a service who's prefix does not correspond */ ctx->service = service; //if(*(pathinfo+prefixlen)!='/' && *(pathinfo+prefixlen)!='\0') continue; /*we matched the prefix but there are trailing characters*/ pathinfo += prefixlen; /* advance pathinfo to after the service prefix */ service->parse_request(ctx,service,request,pathinfo,params,config); if(*request) (*request)->service = service; /* stop looping on services */ return; } ctx->set_error(ctx,404,"unknown service %s",pathinfo); } int mapcache_config_services_enabled(mapcache_context *ctx, mapcache_cfg *config) { int count=0,i; for(i=0; iservices[i]) count++; } return count; } /** @} */ /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/source.c000066400000000000000000000075731316353564100162730ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching support file: common datasource functions * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #include void mapcache_source_init(mapcache_context *ctx, mapcache_source *source) { mapcache_extent tmp_extent = {-1,-1,-1,-1}; source->data_extent = tmp_extent; source->metadata = apr_table_make(ctx->pool,3); source->retry_count = 1; source->retry_delay = 0.1; } void mapcache_source_render_map(mapcache_context *ctx, mapcache_source *source, mapcache_map *map) { int i; #ifdef DEBUG ctx->log(ctx, MAPCACHE_DEBUG, "calling render_map on source (%s): tileset=%s, grid=%s, extent=(%f,%f,%f,%f)", source->name, map->tileset->name, map->grid_link->grid->name, map->extent.minx, map->extent.miny, map->extent.maxx, map->extent.maxy); #endif for(i=0;i<=source->retry_count;i++) { if(i) { /* not our first try */ ctx->log(ctx, MAPCACHE_INFO, "source (%s) render_map retry %d of %d. previous try returned error: %s", source->name, i, source->retry_count, ctx->get_error_message(ctx)); ctx->clear_errors(ctx); if(source->retry_delay > 0) { double wait = source->retry_delay; int j = 0; for(j=1;j_render_map(ctx, source, map); if(!GC_HAS_ERROR(ctx)) break; } } void mapcache_source_query_info(mapcache_context *ctx, mapcache_source *source, mapcache_feature_info *fi) { int i; #ifdef DEBUG ctx->log(ctx, MAPCACHE_DEBUG, "calling query_info on source (%s): tileset=%s, grid=%s,", source->name, fi->map.tileset->name, fi->map.grid_link->grid->name); #endif for(i=0;i<=source->retry_count;i++) { if(i) { /* not our first try */ ctx->log(ctx, MAPCACHE_INFO, "source (%s) render_map retry %d of %d. previous try returned error: %s", source->name, i, source->retry_count, ctx->get_error_message(ctx)); ctx->clear_errors(ctx); if(source->retry_delay > 0) { double wait = source->retry_delay; int j = 0; for(j=1;j_query_info(ctx, source, fi); if(!GC_HAS_ERROR(ctx)) break; } } /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/source_dummy.c000066400000000000000000000072541316353564100175020ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching support file: Mapserver Mapfile datasource * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #include "ezxml.h" #include #include typedef struct mapcache_source_dummy mapcache_source_dummy; struct mapcache_source_dummy { mapcache_source source; char *mapfile; void *mapobj; }; /** * \private \memberof mapcache_source_dummy * \sa mapcache_source::render_map() */ void _mapcache_source_dummy_render_map(mapcache_context *ctx, mapcache_source *psource, mapcache_map *map) { map->raw_image = mapcache_image_create(ctx); map->raw_image->w = map->width; map->raw_image->h = map->height; map->raw_image->stride = 4 * map->width; map->raw_image->data = malloc(map->width*map->height*4); memset(map->raw_image->data,255,map->width*map->height*4); apr_pool_cleanup_register(ctx->pool, map->raw_image->data,(void*)free, apr_pool_cleanup_null); } void _mapcache_source_dummy_query(mapcache_context *ctx, mapcache_source *psource, mapcache_feature_info *fi) { ctx->set_error(ctx,500,"dummy source does not support queries"); } /** * \private \memberof mapcache_source_dummy * \sa mapcache_source::configuration_parse() */ void _mapcache_source_dummy_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_source *source, mapcache_cfg *config) { } /** * \private \memberof mapcache_source_dummy * \sa mapcache_source::configuration_check() */ void _mapcache_source_dummy_configuration_check(mapcache_context *ctx, mapcache_cfg *cfg, mapcache_source *source) { } mapcache_source* mapcache_source_dummy_create(mapcache_context *ctx) { mapcache_source_dummy *source = apr_pcalloc(ctx->pool, sizeof(mapcache_source_dummy)); if(!source) { ctx->set_error(ctx, 500, "failed to allocate dummy source"); return NULL; } mapcache_source_init(ctx, &(source->source)); source->source.type = MAPCACHE_SOURCE_DUMMY; source->source._render_map = _mapcache_source_dummy_render_map; source->source.configuration_check = _mapcache_source_dummy_configuration_check; source->source.configuration_parse_xml = _mapcache_source_dummy_configuration_parse_xml; source->source._query_info = _mapcache_source_dummy_query; return (mapcache_source*)source; } /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/source_fallback.c000066400000000000000000000150741316353564100201050ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching support file: Mapserver Mapfile datasource * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #include "ezxml.h" #include #include typedef struct mapcache_source_fallback mapcache_source_fallback; struct mapcache_source_fallback { mapcache_source source; apr_array_header_t *sources; }; /** * \private \memberof mapcache_source_fallback * \sa mapcache_source::render_map() */ void _mapcache_source_fallback_render_map(mapcache_context *ctx, mapcache_source *psource, mapcache_map *map) { mapcache_source_fallback *source = (mapcache_source_fallback*)psource; mapcache_source *subsource; int i; subsource = APR_ARRAY_IDX(source->sources,0,mapcache_source*); mapcache_source_render_map(ctx, subsource, map); if(GC_HAS_ERROR(ctx)) { int first_error = ctx->get_error(ctx); char *first_error_message = ctx->get_error_message(ctx); ctx->log(ctx,MAPCACHE_INFO, "failed render on primary source \"%s\" on tileset \"%s\". Falling back on secondary sources", subsource->name,map->tileset->name); ctx->clear_errors(ctx); for(i=1; isources->nelts; i++) { subsource = APR_ARRAY_IDX(source->sources,i,mapcache_source*); mapcache_source_render_map(ctx, subsource, map); if(GC_HAS_ERROR(ctx)) { ctx->log(ctx,MAPCACHE_INFO, "failed render on fallback source \"%s\" of tileset \"%s\". Continuing with other fallback sources if available", subsource->name,map->tileset->name); ctx->clear_errors(ctx); continue; } else { return; } } /* all backends failed, return primary error message */ ctx->set_error(ctx,first_error,first_error_message); return; } } void _mapcache_source_fallback_query(mapcache_context *ctx, mapcache_source *psource, mapcache_feature_info *fi) { mapcache_source_fallback *source = (mapcache_source_fallback*)psource; mapcache_source *subsource; int i; subsource = APR_ARRAY_IDX(source->sources,0,mapcache_source*); mapcache_source_query_info(ctx, subsource, fi); if(GC_HAS_ERROR(ctx)) { int first_error = ctx->get_error(ctx); char *first_error_message = ctx->get_error_message(ctx); ctx->log(ctx,MAPCACHE_INFO, "failed query_info on primary source \"%s\" on tileset \"%s\". Falling back on secondary sources", subsource->name,fi->map.tileset->name); ctx->clear_errors(ctx); for(i=1; isources->nelts; i++) { subsource = APR_ARRAY_IDX(source->sources,i,mapcache_source*); mapcache_source_query_info(ctx, subsource, fi); if(GC_HAS_ERROR(ctx)) { ctx->log(ctx,MAPCACHE_INFO, "failed query_info on fallback source \"%s\" of tileset \"%s\". Continuing with other fallback sources if available", subsource->name,fi->map.tileset->name); ctx->clear_errors(ctx); continue; } else { return; } } /* all backends failed, return primary error message */ ctx->set_error(ctx,first_error,first_error_message); return; } ctx->set_error(ctx,500,"fallback source does not support queries"); } /** * \private \memberof mapcache_source_fallback * \sa mapcache_source::configuration_parse() */ void _mapcache_source_fallback_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_source *psource, mapcache_cfg *config) { ezxml_t cur_node; mapcache_source_fallback *source = (mapcache_source_fallback*)psource; source->sources = apr_array_make(ctx->pool,3,sizeof(mapcache_source*)); for(cur_node = ezxml_child(node,"source"); cur_node; cur_node = cur_node->next) { mapcache_source *refsource = mapcache_configuration_get_source(config, cur_node->txt); if(!refsource) { ctx->set_error(ctx, 400, "fallback source \"%s\" references source \"%s\"," " but it is not configured (hint:referenced sources must be declared before this fallback source in the xml file)", psource->name, cur_node->txt); return; } APR_ARRAY_PUSH(source->sources,mapcache_source*) = refsource; } if(source->sources->nelts == 0) { ctx->set_error(ctx,400,"fallback source \"%s\" does not reference any child sources", psource->name); } } /** * \private \memberof mapcache_source_fallback * \sa mapcache_source::configuration_check() */ void _mapcache_source_fallback_configuration_check(mapcache_context *ctx, mapcache_cfg *cfg, mapcache_source *source) { } mapcache_source* mapcache_source_fallback_create(mapcache_context *ctx) { mapcache_source_fallback *source = apr_pcalloc(ctx->pool, sizeof(mapcache_source_fallback)); if(!source) { ctx->set_error(ctx, 500, "failed to allocate fallback source"); return NULL; } mapcache_source_init(ctx, &(source->source)); source->source.type = MAPCACHE_SOURCE_FALLBACK; source->source._render_map = _mapcache_source_fallback_render_map; source->source.configuration_check = _mapcache_source_fallback_configuration_check; source->source.configuration_parse_xml = _mapcache_source_fallback_configuration_parse_xml; source->source._query_info = _mapcache_source_fallback_query; return (mapcache_source*)source; } /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/source_gdal.c000066400000000000000000000643271316353564100172620ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching support file: GDAL datasource support (incomplete and disabled) * Author: Thomas Bonfort, Even Rouault and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * Copyright (c) 2004, Frank Warmerdam (for GDALAutoCreateWarpedVRT who CreateWarpedVRT is derived from) * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #include "ezxml.h" #include #include #ifdef USE_GDAL #include #include #include "gdalwarper.h" #include "cpl_string.h" #include "ogr_srs_api.h" #include "gdal_vrt.h" #define MAPCACHE_DEFAULT_RESAMPLE_ALG GRA_Bilinear /* Note: this will also work with GDAL >= 2.0 */ #if GDAL_VERSION_MAJOR < 2 #define USE_PRE_GDAL2_METHOD #endif /*#define USE_PRE_GDAL2_METHOD*/ typedef struct mapcache_source_gdal mapcache_source_gdal; /**\class mapcache_source_gdal * \brief GDAL mapcache_source * \implements mapcache_source */ struct mapcache_source_gdal { mapcache_source source; const char *datastr; /**< the gdal source string*/ const char *srs_wkt; GDALResampleAlg eResampleAlg; /**< resampling algorithm */ const char *srcOvrLevel; /**< strategy to pickup source overview: AUTO, NONE, AUTO-xxx, xxxx. See -ovr doc in http://www.gdal.org/gdalwarp.html. Only used for GDAL >= 2.0 (could probably be made to work for USE_PRE_GDAL2_METHOD with more work) */ int bUseConnectionPool; }; typedef struct { mapcache_source_gdal *gdal; const char *gdal_data; const char *dst_srs; } gdal_connection_params; typedef struct { GDALDatasetH hSrcDS; char *dst_srs_wkt; } gdal_connection; void mapcache_source_gdal_connection_constructor(mapcache_context *ctx, void **conn_, void *params) { gdal_connection_params *p = (gdal_connection_params*)params; gdal_connection *c = malloc(sizeof(gdal_connection)); OGRSpatialReferenceH hDstSRS; *conn_ = NULL; /* -------------------------------------------------------------------- */ /* Open source dataset. */ /* -------------------------------------------------------------------- */ c->hSrcDS = GDALOpen( p->gdal_data, GA_ReadOnly ); if( c->hSrcDS == NULL ) { ctx->set_error(ctx, 500, "Cannot open gdal source for %s .\n", p->gdal->source.name ); free(c); return; } /* -------------------------------------------------------------------- */ /* Check that there's 3 or 4 raster bands. */ /* -------------------------------------------------------------------- */ if ( GDALGetRasterCount(c->hSrcDS) != 3 && GDALGetRasterCount(c->hSrcDS) != 4) { ctx->set_error(ctx, 500, "Input gdal source for %s has %d raster bands, but only 3 or 4 are supported.\n", p->gdal->source.name, GDALGetRasterCount(c->hSrcDS) ); GDALClose(c->hSrcDS); free(c); return; } hDstSRS = OSRNewSpatialReference( NULL ); if( OSRSetFromUserInput( hDstSRS, p->dst_srs ) == OGRERR_NONE ) { c->dst_srs_wkt = NULL; OSRExportToWkt( hDstSRS, &c->dst_srs_wkt ); } else { ctx->set_error(ctx,500,"failed to parse gdal srs %s",p->dst_srs); GDALClose(c->hSrcDS); free(c); return; } OSRDestroySpatialReference( hDstSRS ); *conn_ = c; } void mapcache_source_gdal_connection_destructor(void *conn_) { gdal_connection *c = (gdal_connection*)conn_; CPLFree(c->dst_srs_wkt); GDALClose(c->hSrcDS); free(c); } static mapcache_pooled_connection* _gdal_get_connection(mapcache_context *ctx, mapcache_source_gdal *gdal, const char *dst_srs, const char *gdal_data) { mapcache_pooled_connection *pc; gdal_connection_params params; char *key; params.gdal = gdal; params.dst_srs = dst_srs; params.gdal_data = gdal_data; key = apr_pstrcat(ctx->pool, gdal_data, dst_srs, NULL); pc = mapcache_connection_pool_get_connection(ctx,key,mapcache_source_gdal_connection_constructor, mapcache_source_gdal_connection_destructor, ¶ms); return pc; } #ifdef USE_PRE_GDAL2_METHOD /* Creates a (virtual) dataset that matches an overview level of the source dataset. This dataset has references on the source dataset, so it should be closed before it. */ static GDALDatasetH CreateOverviewVRTDataset(GDALDatasetH hSrcDS, int iOvrLevel) { double adfSrcGeoTransform[6]; int iBand; GDALRasterBandH hFirstBand = GDALGetRasterBand(hSrcDS, 1); GDALRasterBandH hOvr = GDALGetOverview( hFirstBand, iOvrLevel ); int nFullResXSize = GDALGetRasterBandXSize(hFirstBand); int nFullResYSize = GDALGetRasterBandYSize(hFirstBand); int nVRTXSize = GDALGetRasterBandXSize(hOvr); int nVRTYSize = GDALGetRasterBandYSize(hOvr); VRTDatasetH hVRTDS = VRTCreate( nVRTXSize, nVRTYSize ); /* Scale geotransform */ if( GDALGetGeoTransform( hSrcDS, adfSrcGeoTransform) == CE_None ) { adfSrcGeoTransform[1] *= (double)nFullResXSize / nVRTXSize; adfSrcGeoTransform[2] *= (double)nFullResYSize / nVRTYSize; adfSrcGeoTransform[4] *= (double)nFullResXSize / nVRTXSize; adfSrcGeoTransform[5] *= (double)nFullResYSize / nVRTYSize; GDALSetProjection( hVRTDS, GDALGetProjectionRef(hSrcDS) ); GDALSetGeoTransform( hVRTDS, adfSrcGeoTransform ); } /* Scale GCPs */ if( GDALGetGCPCount(hSrcDS) > 0 ) { const GDAL_GCP* pasGCPsMain = GDALGetGCPs(hSrcDS); int nGCPCount = GDALGetGCPCount(hSrcDS); GDAL_GCP* pasGCPList = GDALDuplicateGCPs( nGCPCount, pasGCPsMain ); int i; for(i = 0; i < nGCPCount; i++) { pasGCPList[i].dfGCPPixel *= (double)nVRTXSize / nFullResXSize; pasGCPList[i].dfGCPLine *= (double)nVRTYSize / nFullResYSize; } GDALSetGCPs( hVRTDS, nGCPCount, pasGCPList, GDALGetGCPProjection(hSrcDS) ); GDALDeinitGCPs( nGCPCount, pasGCPList ); CPLFree( pasGCPList ); } /* Create bands */ for(iBand = 1; iBand <= GDALGetRasterCount(hSrcDS); iBand++ ) { GDALRasterBandH hSrcBand; GDALRasterBandH hVRTBand; int bNoDataSet = FALSE; double dfNoData; VRTAddBand( hVRTDS, GDT_Byte, NULL ); hVRTBand = GDALGetRasterBand(hVRTDS, iBand); hSrcBand = GDALGetOverview(GDALGetRasterBand(hSrcDS, iBand), iOvrLevel); dfNoData = GDALGetRasterNoDataValue(hSrcBand, &bNoDataSet); if( bNoDataSet ) GDALSetRasterNoDataValue(hVRTBand, dfNoData); /* Note: the consumer of this VRT is the warper, which doesn't do any */ /* subsampled RasterIO requests, so NEAR is fine */ VRTAddSimpleSource( hVRTBand, hSrcBand, 0, 0, nVRTXSize, nVRTYSize, 0, 0, nVRTXSize, nVRTYSize, "NEAR", VRT_NODATA_UNSET ); } return hVRTDS; } #endif /* Derived from GDALAutoCreateWarpedVRT(), with various improvements. */ /* Returns a warped VRT that covers the passed extent, in pszDstWKT. */ /* The provided width and height are used, but the size of the returned dataset */ /* may not match those values. In the USE_PRE_GDAL2_METHOD, it should match them. */ /* In the non USE_PRE_GDAL2_METHOD case, it might be a multiple of those values. */ /* phTmpDS is an output parameter (a temporary VRT in the USE_PRE_GDAL2_METHOD case). */ static GDALDatasetH CreateWarpedVRT( GDALDatasetH hSrcDS, const char *pszSrcWKT, const char *pszDstWKT, int width, int height, const mapcache_extent *extent, GDALResampleAlg eResampleAlg, double dfMaxError, char** papszWarpOptions, GDALDatasetH *phTmpDS ) { int i; GDALWarpOptions *psWO; double adfDstGeoTransform[6]; GDALDatasetH hDstDS; int nDstPixels, nDstLines; CPLErr eErr; int bHaveNodata = FALSE; char** papszOptions = NULL; /* -------------------------------------------------------------------- */ /* Populate the warp options. */ /* -------------------------------------------------------------------- */ psWO = GDALCreateWarpOptions(); psWO->papszWarpOptions = CSLDuplicate(papszWarpOptions); psWO->eResampleAlg = eResampleAlg; psWO->hSrcDS = hSrcDS; psWO->nBandCount = GDALGetRasterCount( hSrcDS ); if( psWO->nBandCount == 4 ) { psWO->nBandCount = 3; psWO->nSrcAlphaBand = 4; psWO->nDstAlphaBand = 4; } /* Due to the reprojection, we might get transparency in the edges */ else if( psWO->nBandCount == 3 ) psWO->nDstAlphaBand = 4; psWO->panSrcBands = (int*)CPLMalloc( sizeof(int) * psWO->nBandCount ); psWO->panDstBands = (int*)CPLMalloc( sizeof(int) * psWO->nBandCount ); for( i = 0; i < psWO->nBandCount; i++ ) { psWO->panSrcBands[i] = i+1; psWO->panDstBands[i] = i+1; } /* -------------------------------------------------------------------- */ /* Set nodata values if existing */ /* -------------------------------------------------------------------- */ GDALGetRasterNoDataValue( GDALGetRasterBand(hSrcDS, 1), &bHaveNodata); if( bHaveNodata ) { psWO->padfSrcNoDataReal = (double *) CPLMalloc(psWO->nBandCount*sizeof(double)); psWO->padfSrcNoDataImag = (double *) CPLCalloc(psWO->nBandCount, sizeof(double)); /* zero initialized */ for( i = 0; i < psWO->nBandCount; i++ ) { GDALRasterBandH hBand = GDALGetRasterBand( hSrcDS, i+1 ); double dfReal = GDALGetRasterNoDataValue( hBand, &bHaveNodata ); if( bHaveNodata ) { psWO->padfSrcNoDataReal[i] = dfReal; } else { psWO->padfSrcNoDataReal[i] = -123456.789; } } } /* -------------------------------------------------------------------- */ /* Create the transformer. */ /* -------------------------------------------------------------------- */ psWO->pfnTransformer = GDALGenImgProjTransform; psWO->pTransformerArg = GDALCreateGenImgProjTransformer( psWO->hSrcDS, pszSrcWKT, NULL, pszDstWKT, TRUE, 1.0, 0 ); if( psWO->pTransformerArg == NULL ) { GDALDestroyWarpOptions( psWO ); return NULL; } /* -------------------------------------------------------------------- */ /* Figure out the desired output bounds and resolution. */ /* -------------------------------------------------------------------- */ eErr = GDALSuggestedWarpOutput( hSrcDS, psWO->pfnTransformer, psWO->pTransformerArg, adfDstGeoTransform, &nDstPixels, &nDstLines ); if( eErr != CE_None ) { GDALDestroyTransformer( psWO->pTransformerArg ); GDALDestroyWarpOptions( psWO ); return NULL; } /* -------------------------------------------------------------------- */ /* To minimize the risk of extra resampling done by generic */ /* RasterIO itself and maximize resampling done in the wraper, */ /* adjust the resolution so that the overview factor of the output */ /* dataset that will indirectly query matches an exiting overview */ /* factor of the input dataset. */ /* -------------------------------------------------------------------- */ { double dfDesiredXRes = (extent->maxx - extent->minx) / width; double dfDesiredYRes = (extent->maxy - extent->miny) / height; double dfDesiredRes = MIN( dfDesiredXRes, dfDesiredYRes ); double dfGuessedFullRes = MIN( adfDstGeoTransform[1], fabs(adfDstGeoTransform[5]) ); double dfApproxDstOvrRatio = dfDesiredRes / dfGuessedFullRes; GDALRasterBandH hFirstBand = GDALGetRasterBand(hSrcDS, 1); int nOvrCount = GDALGetOverviewCount(hFirstBand); int nSrcXSize = GDALGetRasterBandXSize(hFirstBand); int i; double dfSrcOvrRatio = 1.0; #ifdef USE_PRE_GDAL2_METHOD int iSelectedOvr = -1; #endif for( i = 0; *phTmpDS == NULL && i < nOvrCount; i ++) { GDALRasterBandH hOvr = GDALGetOverview(hFirstBand, i); int nOvrXSize = GDALGetRasterBandXSize(hOvr); double dfCurOvrRatio = (double)nSrcXSize / nOvrXSize; if(dfCurOvrRatio > dfApproxDstOvrRatio+0.1 ) /* +0.1 to avoid rounding issues */ { break; } dfSrcOvrRatio = dfCurOvrRatio; #ifdef USE_PRE_GDAL2_METHOD iSelectedOvr = i; #endif } #ifdef USE_PRE_GDAL2_METHOD if( iSelectedOvr >= 0 ) { GDALDestroyTransformer( psWO->pTransformerArg ); GDALDestroyWarpOptions( psWO ); *phTmpDS = CreateOverviewVRTDataset(hSrcDS, iSelectedOvr); return CreateWarpedVRT( *phTmpDS, pszSrcWKT, pszDstWKT, width, height, extent, eResampleAlg, dfMaxError, papszWarpOptions, phTmpDS ); } #endif adfDstGeoTransform[1] = dfDesiredXRes / dfSrcOvrRatio; adfDstGeoTransform[5] = -dfDesiredYRes / dfSrcOvrRatio; } /* -------------------------------------------------------------------- */ /* Compute geotransform and raster dimension for our extent of */ /* interest. */ /* -------------------------------------------------------------------- */ adfDstGeoTransform[0] = extent->minx; adfDstGeoTransform[2] = 0.0; adfDstGeoTransform[3] = extent->maxy; adfDstGeoTransform[4] = 0.0; nDstPixels = (int)( (extent->maxx - extent->minx) / adfDstGeoTransform[1] + 0.5 ); nDstLines = (int)( (extent->maxy - extent->miny) / fabs(adfDstGeoTransform[5]) + 0.5 ); /*printf("nDstPixels=%d nDstLines=%d\n", nDstPixels, nDstLines);*/ /* -------------------------------------------------------------------- */ /* Update the transformer to include an output geotransform */ /* back to pixel/line coordinates. */ /* -------------------------------------------------------------------- */ GDALSetGenImgProjTransformerDstGeoTransform( psWO->pTransformerArg, adfDstGeoTransform ); /* -------------------------------------------------------------------- */ /* Do we want to apply an approximating transformation? */ /* -------------------------------------------------------------------- */ if( dfMaxError > 0.0 ) { psWO->pTransformerArg = GDALCreateApproxTransformer( psWO->pfnTransformer, psWO->pTransformerArg, dfMaxError ); psWO->pfnTransformer = GDALApproxTransform; GDALApproxTransformerOwnsSubtransformer(psWO->pTransformerArg, TRUE); } /* -------------------------------------------------------------------- */ /* Create the VRT file. */ /* -------------------------------------------------------------------- */ /* We could potentially used GDALCreateWarpedVRT() instead of this logic */ /* but GDALCreateWarpedVRT() in GDAL < 2.0.1 doesn't create the destination */ /* alpha band. */ papszOptions = CSLSetNameValue(NULL, "SUBCLASS", "VRTWarpedDataset"); hDstDS = GDALCreate( GDALGetDriverByName("VRT"), "", nDstPixels, nDstLines, psWO->nBandCount + ((psWO->nDstAlphaBand != 0) ? 1 : 0), GDT_Byte, papszOptions ); CSLDestroy(papszOptions); if( hDstDS == NULL ) { GDALDestroyWarpOptions( psWO ); return NULL; } psWO->hDstDS = hDstDS; GDALSetGeoTransform( hDstDS, adfDstGeoTransform ); if( GDALInitializeWarpedVRT( hDstDS, psWO ) != CE_None ) { GDALClose(hDstDS); GDALDestroyWarpOptions( psWO ); return NULL; } GDALDestroyWarpOptions( psWO ); return hDstDS; } /** * \private \memberof mapcache_source_gdal * \sa mapcache_source::render_metatile() */ void _mapcache_source_gdal_render_metatile(mapcache_context *ctx, mapcache_source *psource, mapcache_map *map) { mapcache_source_gdal *gdal = (mapcache_source_gdal*)psource; gdal_connection *gdal_conn; GDALDatasetH hDstDS; GDALDatasetH hTmpDS = NULL; mapcache_buffer *data; unsigned char *rasterdata; CPLErr eErr; mapcache_pooled_connection *pc = NULL; int bands_bgra[] = { 3, 2, 1, 4 }; /* mapcache buffer order is BGRA */ CPLErrorReset(); if(gdal->bUseConnectionPool == MAPCACHE_TRUE) { pc = _gdal_get_connection(ctx, gdal, map->grid_link->grid->srs, gdal->datastr ); GC_CHECK_ERROR(ctx); gdal_conn = (gdal_connection*) pc->connection; } else { gdal_connection_params params; params.gdal = gdal; params.dst_srs = map->grid_link->grid->srs; params.gdal_data = gdal->datastr; mapcache_source_gdal_connection_constructor(ctx, (void**)(&gdal_conn), ¶ms); GC_CHECK_ERROR(ctx); } hDstDS = CreateWarpedVRT( gdal_conn->hSrcDS, gdal->srs_wkt, gdal_conn->dst_srs_wkt, map->width, map->height, &map->extent, gdal->eResampleAlg, 0.125, NULL, &hTmpDS ); if( hDstDS == NULL ) { ctx->set_error(ctx, 500,"CreateWarpedVRT() failed"); if(gdal->bUseConnectionPool == MAPCACHE_TRUE) { mapcache_connection_pool_invalidate_connection(ctx,pc); } else { mapcache_source_gdal_connection_destructor(gdal_conn); } return; } if(GDALGetRasterCount(hDstDS) != 4) { ctx->set_error(ctx, 500,"gdal did not create a 4 band image"); GDALClose(hDstDS); /* close first this one, as it references hSrcDS */ if(gdal->bUseConnectionPool == MAPCACHE_TRUE) { mapcache_connection_pool_invalidate_connection(ctx,pc); } else { mapcache_source_gdal_connection_destructor(gdal_conn); } return; } data = mapcache_buffer_create(map->height*map->width*4,ctx->pool); rasterdata = data->buf; #if GDAL_VERSION_MAJOR >= 2 { GDALRasterIOExtraArg sExtraArg; INIT_RASTERIO_EXTRA_ARG(sExtraArg); if( gdal->eResampleAlg == GRA_Bilinear ) sExtraArg.eResampleAlg = GRIORA_Bilinear; else if( gdal->eResampleAlg == GRA_Cubic ) sExtraArg.eResampleAlg = GRIORA_Cubic; else if( gdal->eResampleAlg == GRA_CubicSpline ) sExtraArg.eResampleAlg = GRIORA_CubicSpline; else if( gdal->eResampleAlg == GRA_Lanczos ) sExtraArg.eResampleAlg = GRIORA_Lanczos; else if( gdal->eResampleAlg == GRA_Average ) sExtraArg.eResampleAlg = GRIORA_Average; if( gdal->srcOvrLevel != NULL ) { /* If the user specified a particular strategy to choose the source */ /* overview level, apply it now */ GDALSetMetadataItem(hDstDS, "SrcOvrLevel",gdal->srcOvrLevel, NULL); } /* Hopefully, given how we adjust hDstDS resolution, we should query */ /* exactly at the resolution of one overview level of hDstDS, and not */ /* do extra resampling in generic RasterIO, but just in case specify */ /* the resampling alg in sExtraArg. */ eErr = GDALDatasetRasterIOEx( hDstDS, GF_Read,0,0, GDALGetRasterXSize(hDstDS), GDALGetRasterYSize(hDstDS), rasterdata,map->width,map->height,GDT_Byte, 4, bands_bgra, 4,4*map->width,1, &sExtraArg ); } #else eErr = GDALDatasetRasterIO( hDstDS, GF_Read,0,0, GDALGetRasterXSize(hDstDS), GDALGetRasterYSize(hDstDS), rasterdata,map->width,map->height,GDT_Byte, 4, bands_bgra, 4,4*map->width,1 ); #endif if( eErr != CE_None ) { ctx->set_error(ctx, 500,"GDAL I/O error occurred"); GDALClose(hDstDS); /* close first this one, as it references hTmpDS or hSrcDS */ if( hTmpDS ) GDALClose(hTmpDS); /* references hSrcDS, so close before */ if(gdal->bUseConnectionPool == MAPCACHE_TRUE) { mapcache_connection_pool_invalidate_connection(ctx,pc); } else { mapcache_source_gdal_connection_destructor(gdal_conn); } return; } map->raw_image = mapcache_image_create(ctx); map->raw_image->w = map->width; map->raw_image->h = map->height; map->raw_image->stride = map->width * 4; map->raw_image->data = rasterdata; map->raw_image->has_alpha = MC_ALPHA_UNKNOWN; GDALClose( hDstDS ); /* close first this one, as it references hTmpDS or hSrcDS */ if( hTmpDS ) GDALClose(hTmpDS); /* references hSrcDS, so close before */ if(gdal->bUseConnectionPool == MAPCACHE_TRUE) { mapcache_connection_pool_release_connection(ctx,pc); } else { mapcache_source_gdal_connection_destructor(gdal_conn); } } /** * \private \memberof mapcache_source_gdal * \sa mapcache_source::configuration_parse() */ void _mapcache_source_gdal_configuration_parse(mapcache_context *ctx, ezxml_t node, mapcache_source *source, mapcache_cfg *config) { ezxml_t cur_node; mapcache_source_gdal *src = (mapcache_source_gdal*)source; if ((cur_node = ezxml_child(node,"data")) != NULL) { src->datastr = apr_pstrdup(ctx->pool,cur_node->txt); } if ((cur_node = ezxml_child(node,"connection_pooled")) != NULL) { if(!strcasecmp(cur_node->txt,"false")) { src->bUseConnectionPool = MAPCACHE_FALSE; } else if(!strcasecmp(cur_node->txt,"true")) { src->bUseConnectionPool = MAPCACHE_TRUE; } else { ctx->set_error(ctx,400,"failed to parse (%s). Expecting true or false",cur_node->txt); return; } } if ((cur_node = ezxml_child(node,"resample")) != NULL && *cur_node->txt) { if( EQUALN( cur_node->txt, "NEAR", 4) ) src->eResampleAlg = GRA_NearestNeighbour; else if( EQUAL( cur_node->txt, "BILINEAR") ) src->eResampleAlg = GRA_Bilinear; else if( EQUAL( cur_node->txt, "CUBIC") ) src->eResampleAlg = GRA_Cubic; else if( EQUAL( cur_node->txt, "CUBICSPLINE") ) src->eResampleAlg = GRA_CubicSpline; else if( EQUAL( cur_node->txt, "LANCZOS") ) src->eResampleAlg = GRA_Lanczos; #if GDAL_VERSION_MAJOR >= 2 else if( EQUAL( cur_node->txt, "AVERAGE") ) src->eResampleAlg = GRA_Average; #endif else { ctx->set_error(ctx, 500, "unsupported gdal : %s", cur_node->txt); return; } } if ((cur_node = ezxml_child(node,"overview-strategy")) != NULL && *cur_node->txt) { src->srcOvrLevel = apr_pstrdup(ctx->pool,cur_node->txt); } } /** * \private \memberof mapcache_source_gdal * \sa mapcache_source::configuration_check() */ void _mapcache_source_gdal_configuration_check(mapcache_context *ctx, mapcache_cfg *cfg, mapcache_source *source) { mapcache_source_gdal *src = (mapcache_source_gdal*)source; GDALDatasetH hDataset; /* check all required parameters are configured */ if( src->datastr == NULL || !strlen(src->datastr)) { ctx->set_error(ctx, 500, "gdal source %s has no data",source->name); return; } hDataset = GDALOpen(src->datastr,GA_ReadOnly); if( hDataset == NULL ) { ctx->set_error(ctx, 500, "gdalOpen failed on data %s", src->datastr); return; } if( GDALGetProjectionRef( hDataset ) != NULL && strlen(GDALGetProjectionRef( hDataset )) > 0 ) { src->srs_wkt = apr_pstrdup(ctx->pool,GDALGetProjectionRef( hDataset )); } else if( GDALGetGCPProjection( hDataset ) != NULL && strlen(GDALGetGCPProjection(hDataset)) > 0 && GDALGetGCPCount( hDataset ) > 1 ) { src->srs_wkt = apr_pstrdup(ctx->pool,GDALGetGCPProjection( hDataset )); } else { ctx->set_error(ctx, 500, "Input gdal source for %s has no defined SRS\n", source->name ); GDALClose(hDataset); return; } GDALClose(hDataset); } #endif //USE_GDAL mapcache_source* mapcache_source_gdal_create(mapcache_context *ctx) { #ifdef USE_GDAL mapcache_source_gdal *source = apr_pcalloc(ctx->pool, sizeof(mapcache_source_gdal)); if(!source) { ctx->set_error(ctx, 500, "failed to allocate gdal source"); return NULL; } mapcache_source_init(ctx, &(source->source)); source->source.type = MAPCACHE_SOURCE_GDAL; source->source._render_map = _mapcache_source_gdal_render_metatile; source->source.configuration_check = _mapcache_source_gdal_configuration_check; source->source.configuration_parse_xml = _mapcache_source_gdal_configuration_parse; source->eResampleAlg = MAPCACHE_DEFAULT_RESAMPLE_ALG; source->bUseConnectionPool = MAPCACHE_TRUE; GDALAllRegister(); return (mapcache_source*)source; #else ctx->set_error(ctx, 400, "failed to create gdal source, GDAL support is not compiled in this version"); return NULL; #endif } /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/source_mapserver.c000066400000000000000000000215231316353564100203460ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching support file: Mapserver Mapfile datasource * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #include "ezxml.h" #ifdef USE_MAPSERVER #include #include #ifdef APR_HAS_THREADS #include #endif #include #include #include /**\class mapcache_source_mapserver * \brief WMS mapcache_source * \implements mapcache_source */ typedef struct mapcache_source_mapserver mapcache_source_mapserver; struct mapcache_source_mapserver { mapcache_source source; char *mapfile; }; struct mc_mapobj { mapObj *map; mapcache_grid_link *grid_link; char *error; }; void mapcache_mapserver_connection_constructor(mapcache_context *ctx, void **conn_, void *params) { mapcache_source_mapserver *src = (mapcache_source_mapserver*) params; struct mc_mapobj *mcmap = calloc(1,sizeof(struct mc_mapobj)); mcmap->map = msLoadMap(src->mapfile,NULL); if(!mcmap->map) { errorObj *errors = NULL; ctx->set_error(ctx, 500, "Failed to load mapfile '%s'",src->mapfile); errors = msGetErrorObj(); while(errors) { ctx->set_error(ctx, 500, "Failed to load mapfile '%s'. Mapserver reports: %s",src->mapfile, errors->message); errors = errors->next; } return; } msMapSetLayerProjections(mcmap->map); *conn_ = mcmap; } void mapcache_mapserver_connection_destructor(void *conn_) { struct mc_mapobj *mcmap = (struct mc_mapobj*) conn_; msFreeMap(mcmap->map); free(mcmap); } static mapcache_pooled_connection* _mapserver_get_connection(mapcache_context *ctx, mapcache_map *map) { mapcache_pooled_connection *pc; char *key = apr_psprintf(ctx->pool, "ms_src_%s", map->tileset->source->name); pc = mapcache_connection_pool_get_connection(ctx, key, mapcache_mapserver_connection_constructor, mapcache_mapserver_connection_destructor, map->tileset->source); if(!GC_HAS_ERROR(ctx) && pc && pc->connection) { } return pc; } /** * \private \memberof mapcache_source_mapserver * \sa mapcache_source::render_map() */ void _mapcache_source_mapserver_render_map(mapcache_context *ctx, mapcache_map *map) { errorObj *errors = NULL; mapcache_pooled_connection *pc; struct mc_mapobj *mcmap; double dx, dy; rasterBufferObj rb; imageObj *image; pc = _mapserver_get_connection(ctx, map); GC_CHECK_ERROR(ctx); mcmap = pc->connection; GC_CHECK_ERROR(ctx); if(mcmap->grid_link != map->grid_link) { if (msLoadProjectionString(&(mcmap->map->projection), map->grid_link->grid->srs) != 0) { ctx->set_error(ctx,500, "Unable to set projection on mapObj."); errors = msGetErrorObj(); while(errors) { ctx->set_error(ctx,500, "Unable to set projection on mapObj. MapServer reports: %s", errors->message); errors = errors->next; } mapcache_connection_pool_invalidate_connection(ctx,pc); return; } switch(map->grid_link->grid->unit) { case MAPCACHE_UNIT_DEGREES: mcmap->map->units = MS_DD; break; case MAPCACHE_UNIT_FEET: mcmap->map->units = MS_FEET; break; case MAPCACHE_UNIT_METERS: mcmap->map->units = MS_METERS; break; } mcmap->grid_link = map->grid_link; } /* ** WMS extents are edge to edge while MapServer extents are center of ** pixel to center of pixel. Here we try to adjust the WMS extents ** in by half a pixel. */ dx = (map->extent.maxx - map->extent.minx) / (map->width*2); dy = (map->extent.maxy - map->extent.miny) / (map->height*2); mcmap->map->extent.minx = map->extent.minx + dx; mcmap->map->extent.miny = map->extent.miny + dy; mcmap->map->extent.maxx = map->extent.maxx - dx; mcmap->map->extent.maxy = map->extent.maxy - dy; msMapSetSize(mcmap->map, map->width, map->height); image = msDrawMap(mcmap->map, MS_FALSE); if(!image) { ctx->set_error(ctx,500, "MapServer failed to create image."); errors = msGetErrorObj(); while(errors) { ctx->set_error(ctx,500, "MapServer reports: %s", errors->message); errors = errors->next; } mapcache_connection_pool_invalidate_connection(ctx,pc); return; } if(image->format->vtable->supports_pixel_buffer) { if( MS_SUCCESS != image->format->vtable->getRasterBufferHandle(image,&rb)) { ctx->set_error(ctx,500,"failed to get mapserver raster buffer handle"); mapcache_connection_pool_invalidate_connection(ctx,pc); return; } } else { ctx->set_error(ctx,500,"format %s has no pixel export",image->format->name); mapcache_connection_pool_invalidate_connection(ctx,pc); return; } map->raw_image = mapcache_image_create(ctx); map->raw_image->w = map->width; map->raw_image->h = map->height; map->raw_image->stride = 4 * map->width; map->raw_image->data = malloc(map->width*map->height*4); memcpy(map->raw_image->data,rb.data.rgba.pixels,map->width*map->height*4); apr_pool_cleanup_register(ctx->pool, map->raw_image->data,(void*)free, apr_pool_cleanup_null); msFreeImage(image); mapcache_connection_pool_release_connection(ctx,pc); } void _mapcache_source_mapserver_query(mapcache_context *ctx, mapcache_source *psource, mapcache_feature_info *fi) { ctx->set_error(ctx,500,"mapserver source does not support queries"); } /** * \private \memberof mapcache_source_mapserver * \sa mapcache_source::configuration_parse() */ void _mapcache_source_mapserver_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_source *source) { ezxml_t cur_node; mapcache_source_mapserver *src = (mapcache_source_mapserver*)source; if ((cur_node = ezxml_child(node,"mapfile")) != NULL) { src->mapfile = apr_pstrdup(ctx->pool,cur_node->txt); } } /** * \private \memberof mapcache_source_mapserver * \sa mapcache_source::configuration_check() */ void _mapcache_source_mapserver_configuration_check(mapcache_context *ctx, mapcache_cfg *cfg, mapcache_source *source) { mapcache_source_mapserver *src = (mapcache_source_mapserver*)source; mapObj *map; /* check all required parameters are configured */ if(!src->mapfile) { ctx->set_error(ctx, 400, "mapserver source %s has no configured",source->name); } if(!src->mapfile) { ctx->set_error(ctx,400,"mapserver source \"%s\" has no mapfile configured",src->source.name); return; } msSetup(); /* do a test load to check the mapfile is correct */ map = msLoadMap(src->mapfile, NULL); if(!map) { msWriteError(stderr); ctx->set_error(ctx,400,"failed to load mapfile \"%s\"",src->mapfile); return; } msFreeMap(map); } mapcache_source* mapcache_source_mapserver_create(mapcache_context *ctx) { mapcache_source_mapserver *source = apr_pcalloc(ctx->pool, sizeof(mapcache_source_mapserver)); if(!source) { ctx->set_error(ctx, 500, "failed to allocate mapserver source"); return NULL; } mapcache_source_init(ctx, &(source->source)); source->source.type = MAPCACHE_SOURCE_MAPSERVER; source->source.render_map = _mapcache_source_mapserver_render_map; source->source.configuration_check = _mapcache_source_mapserver_configuration_check; source->source.configuration_parse_xml = _mapcache_source_mapserver_configuration_parse_xml; source->source.query_info = _mapcache_source_mapserver_query; return (mapcache_source*)source; } #else mapcache_source* mapcache_source_mapserver_create(mapcache_context *ctx) { ctx->set_error(ctx, 500, "mapserver source not configured for this build"); return NULL; } #endif /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/source_wms.c000066400000000000000000000242211316353564100171460ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching support file: WMS datasources * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #include "ezxml.h" #include #include typedef struct mapcache_source_wms mapcache_source_wms; /**\class mapcache_source_wms * \brief WMS mapcache_source * \implements mapcache_source */ struct mapcache_source_wms { mapcache_source source; apr_table_t *wms_default_params; /**< default WMS parameters (SERVICE,REQUEST,STYLES,VERSION) */ apr_table_t *getmap_params; /**< WMS parameters specified in configuration */ apr_table_t *getfeatureinfo_params; /**< WMS parameters specified in configuration */ mapcache_http *http; }; /** * \private \memberof mapcache_source_wms * \sa mapcache_source::render_map() */ void _mapcache_source_wms_render_map(mapcache_context *ctx, mapcache_source *psource, mapcache_map *map) { mapcache_source_wms *wms = (mapcache_source_wms*)psource; mapcache_http *http; apr_table_t *params = apr_table_clone(ctx->pool,wms->wms_default_params); apr_table_setn(params,"BBOX",apr_psprintf(ctx->pool,"%f,%f,%f,%f", map->extent.minx,map->extent.miny,map->extent.maxx,map->extent.maxy)); apr_table_setn(params,"WIDTH",apr_psprintf(ctx->pool,"%d",map->width)); apr_table_setn(params,"HEIGHT",apr_psprintf(ctx->pool,"%d",map->height)); apr_table_setn(params,"FORMAT","image/png"); apr_table_setn(params,"SRS",map->grid_link->grid->srs); apr_table_overlap(params,wms->getmap_params,APR_OVERLAP_TABLES_SET); if(map->dimensions && map->dimensions->nelts>0) { int i; for(i=0; idimensions->nelts; i++) { mapcache_requested_dimension *rdim = APR_ARRAY_IDX(map->dimensions,i,mapcache_requested_dimension*); /* set both DIM_key=val and key=val KVP params */ apr_table_setn(params,rdim->dimension->name,rdim->cached_value); if(strcasecmp(rdim->dimension->name,"TIME") && strcasecmp(rdim->dimension->name,"ELEVATION")) { char *dim_name = apr_pstrcat(ctx->pool,"DIM_",rdim->dimension->name,NULL); apr_table_setn(params,dim_name,rdim->cached_value); } } } /* if the source has no LAYERS parameter defined, then use the tileset name * as the LAYERS to request. When using mirror-mode, the source has no layers * defined, it is added based on the incoming request */ if(!apr_table_get(params,"layers")) { apr_table_set(params,"LAYERS",map->tileset->name); } map->encoded_data = mapcache_buffer_create(30000,ctx->pool); http = mapcache_http_clone(ctx, wms->http); http->url = mapcache_http_build_url(ctx,http->url,params); mapcache_http_do_request(ctx,http,map->encoded_data,NULL,NULL); GC_CHECK_ERROR(ctx); if(!mapcache_imageio_is_valid_format(ctx,map->encoded_data)) { char *returned_data = apr_pstrndup(ctx->pool,(char*)map->encoded_data->buf,map->encoded_data->size); ctx->set_error(ctx, 502, "wms request for tileset %s returned an unsupported format:\n%s", map->tileset->name, returned_data); } } void _mapcache_source_wms_query(mapcache_context *ctx, mapcache_source *source, mapcache_feature_info *fi) { mapcache_map *map = (mapcache_map*)fi; mapcache_http *http; mapcache_source_wms *wms = (mapcache_source_wms*)source; apr_table_t *params = apr_table_clone(ctx->pool,wms->wms_default_params); apr_table_overlap(params,wms->getmap_params,0); apr_table_setn(params,"BBOX",apr_psprintf(ctx->pool,"%f,%f,%f,%f", map->extent.minx,map->extent.miny,map->extent.maxx,map->extent.maxy)); apr_table_setn(params,"REQUEST","GetFeatureInfo"); apr_table_setn(params,"WIDTH",apr_psprintf(ctx->pool,"%d",map->width)); apr_table_setn(params,"HEIGHT",apr_psprintf(ctx->pool,"%d",map->height)); apr_table_setn(params,"SRS",map->grid_link->grid->srs); apr_table_setn(params,"X",apr_psprintf(ctx->pool,"%d",fi->i)); apr_table_setn(params,"Y",apr_psprintf(ctx->pool,"%d",fi->j)); apr_table_setn(params,"INFO_FORMAT",fi->format); apr_table_overlap(params,wms->getfeatureinfo_params,0); if(map->dimensions && map->dimensions->nelts>0) { int i; for(i=0; idimensions->nelts; i++) { mapcache_requested_dimension *rdim = APR_ARRAY_IDX(map->dimensions,i,mapcache_requested_dimension*); /* set both DIM_key=val and key=val KVP params */ apr_table_setn(params,rdim->dimension->name,rdim->cached_value); if(strcasecmp(rdim->dimension->name,"TIME") && strcasecmp(rdim->dimension->name,"ELEVATION")) { char *dim_name = apr_pstrcat(ctx->pool,"DIM_",rdim->dimension->name,NULL); apr_table_setn(params,dim_name,rdim->cached_value); } } } fi->data = mapcache_buffer_create(30000,ctx->pool); http = mapcache_http_clone(ctx, wms->http); http->url = mapcache_http_build_url(ctx,http->url,params); mapcache_http_do_request(ctx,http,fi->data,NULL,NULL); GC_CHECK_ERROR(ctx); } /** * \private \memberof mapcache_source_wms * \sa mapcache_source::configuration_parse() */ void _mapcache_source_wms_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_source *source, mapcache_cfg *config) { ezxml_t cur_node; mapcache_source_wms *src = (mapcache_source_wms*)source; if ((cur_node = ezxml_child(node,"getmap")) != NULL) { ezxml_t gm_node; if ((gm_node = ezxml_child(cur_node,"params")) != NULL) { for(gm_node = gm_node->child; gm_node; gm_node = gm_node->sibling) { apr_table_set(src->getmap_params, gm_node->name, gm_node->txt); } } else { ctx->set_error(ctx,400,"wms source %s has no block (should contain at least child)",source->name); return; } } else { ctx->set_error(ctx,400,"wms source %s has no block",source->name); return; } if ((cur_node = ezxml_child(node,"getfeatureinfo")) != NULL) { ezxml_t fi_node; if ((fi_node = ezxml_child(cur_node,"info_formats")) != NULL) { char *key,*last; char *iformats; source->info_formats = apr_array_make(ctx->pool,3,sizeof(char*)); iformats = apr_pstrdup(ctx->pool,fi_node->txt); for (key = apr_strtok(iformats, "," , &last); key != NULL; key = apr_strtok(NULL, ",", &last)) { APR_ARRAY_PUSH(source->info_formats,char*) = key; } } else { ctx->set_error(ctx,400,"wms source %s has no tag",source->name); return; } if ((fi_node = ezxml_child(cur_node,"params")) != NULL) { for(fi_node = fi_node->child; fi_node; fi_node = fi_node->sibling) { apr_table_set(src->getfeatureinfo_params, fi_node->name, fi_node->txt); } } else { ctx->set_error(ctx,400,"wms source %s has no block (should contain at least child)",source->name); return; } } if ((cur_node = ezxml_child(node,"http")) != NULL) { src->http = mapcache_http_configuration_parse_xml(ctx,cur_node); } } /** * \private \memberof mapcache_source_wms * \sa mapcache_source::configuration_check() */ void _mapcache_source_wms_configuration_check(mapcache_context *ctx, mapcache_cfg *cfg, mapcache_source *source) { mapcache_source_wms *src = (mapcache_source_wms*)source; /* check all required parameters are configured */ if(!src->http) { ctx->set_error(ctx, 400, "wms source %s has no request configured",source->name); } if(!apr_table_get(src->getmap_params,"LAYERS")) { if(cfg->mode == MAPCACHE_MODE_NORMAL) { ctx->set_error(ctx, 400, "wms source %s has no LAYERS", source->name); } } if(source->info_formats) { if(!apr_table_get(src->getfeatureinfo_params,"QUERY_LAYERS")) { ctx->set_error(ctx, 400, "wms source %s has no QUERY_LAYERS", source->name); } } } mapcache_source* mapcache_source_wms_create(mapcache_context *ctx) { mapcache_source_wms *source = apr_pcalloc(ctx->pool, sizeof(mapcache_source_wms)); if(!source) { ctx->set_error(ctx, 500, "failed to allocate wms source"); return NULL; } mapcache_source_init(ctx, &(source->source)); source->source.type = MAPCACHE_SOURCE_WMS; source->source._render_map = _mapcache_source_wms_render_map; source->source.configuration_check = _mapcache_source_wms_configuration_check; source->source.configuration_parse_xml = _mapcache_source_wms_configuration_parse_xml; source->source._query_info = _mapcache_source_wms_query; source->wms_default_params = apr_table_make(ctx->pool,4);; source->getmap_params = apr_table_make(ctx->pool,4); source->getfeatureinfo_params = apr_table_make(ctx->pool,4); apr_table_add(source->wms_default_params,"VERSION","1.1.1"); apr_table_add(source->wms_default_params,"REQUEST","GetMap"); apr_table_add(source->wms_default_params,"SERVICE","WMS"); apr_table_add(source->wms_default_params,"STYLES",""); return (mapcache_source*)source; } /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/strptime.c000066400000000000000000000242311316353564100166300ustar00rootroot00000000000000/* * Copyright (c) 1999 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * 3. Neither the name of KTH 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 KTH AND ITS 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 KTH OR ITS 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. */ #if defined(_WIN32) && !defined(__CYGWIN__) #include #include #include #include #include #include #include "util.h" static const char *abb_weekdays[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", NULL }; static const char *full_weekdays[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", NULL }; static const char *abb_month[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", NULL }; static const char *full_month[] = { "January", "February", "Mars", "April", "May", "June", "July", "August", "September", "October", "November", "December", NULL, }; static const char *ampm[] = { "am", "pm", NULL }; /* * tm_year is relative this year */ const int tm_year_base = 1900; /* * Return TRUE iff `year' was a leap year. * Needed for strptime. */ static int is_leap_year (int year) { return (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0); } /* Needed for strptime. */ static int match_string (const char **buf, const char **strs) { int i = 0; for (i = 0; strs[i] != NULL; ++i) { int len = strlen (strs[i]); if (strncasecmp (*buf, strs[i], len) == 0) { *buf += len; return i; } } return -1; } /* Needed for strptime. */ static int first_day (int year) { int ret = 4; for (; year > 1970; --year) ret = (ret + 365 + is_leap_year (year) ? 1 : 0) % 7; return ret; } /* * Set `timeptr' given `wnum' (week number [0, 53]) * Needed for strptime */ static void set_week_number_sun (struct tm *timeptr, int wnum) { int fday = first_day (timeptr->tm_year + tm_year_base); timeptr->tm_yday = wnum * 7 + timeptr->tm_wday - fday; if (timeptr->tm_yday < 0) { timeptr->tm_wday = fday; timeptr->tm_yday = 0; } } /* * Set `timeptr' given `wnum' (week number [0, 53]) * Needed for strptime */ static void set_week_number_mon (struct tm *timeptr, int wnum) { int fday = (first_day (timeptr->tm_year + tm_year_base) + 6) % 7; timeptr->tm_yday = wnum * 7 + (timeptr->tm_wday + 6) % 7 - fday; if (timeptr->tm_yday < 0) { timeptr->tm_wday = (fday + 1) % 7; timeptr->tm_yday = 0; } } /* * Set `timeptr' given `wnum' (week number [0, 53]) * Needed for strptime */ static void set_week_number_mon4 (struct tm *timeptr, int wnum) { int fday = (first_day (timeptr->tm_year + tm_year_base) + 6) % 7; int offset = 0; if (fday < 4) offset += 7; timeptr->tm_yday = offset + (wnum - 1) * 7 + timeptr->tm_wday - fday; if (timeptr->tm_yday < 0) { timeptr->tm_wday = fday; timeptr->tm_yday = 0; } } /* strptime: roken */ /* extern "C" */ char * /* strptime (const char *buf, const char *format, struct tm *timeptr) */ strptime (const char *buf, const char *format, struct tm *timeptr) { char c; for (; (c = *format) != '\0'; ++format) { char *s; int ret; if (isspace (c)) { while (isspace (*buf)) ++buf; } else if (c == '%' && format[1] != '\0') { c = *++format; if (c == 'E' || c == 'O') c = *++format; switch (c) { case 'A' : ret = match_string (&buf, full_weekdays); if (ret < 0) return NULL; timeptr->tm_wday = ret; break; case 'a' : ret = match_string (&buf, abb_weekdays); if (ret < 0) return NULL; timeptr->tm_wday = ret; break; case 'B' : ret = match_string (&buf, full_month); if (ret < 0) return NULL; timeptr->tm_mon = ret; break; case 'b' : case 'h' : ret = match_string (&buf, abb_month); if (ret < 0) return NULL; timeptr->tm_mon = ret; break; case 'C' : ret = strtol (buf, &s, 10); if (s == buf) return NULL; timeptr->tm_year = (ret * 100) - tm_year_base; buf = s; break; case 'c' : abort (); case 'D' : /* %m/%d/%y */ s = strptime (buf, "%m/%d/%y", timeptr); if (s == NULL) return NULL; buf = s; break; case 'd' : case 'e' : ret = strtol (buf, &s, 10); if (s == buf) return NULL; timeptr->tm_mday = ret; buf = s; break; case 'H' : case 'k' : ret = strtol (buf, &s, 10); if (s == buf) return NULL; timeptr->tm_hour = ret; buf = s; break; case 'I' : case 'l' : ret = strtol (buf, &s, 10); if (s == buf) return NULL; if (ret == 12) timeptr->tm_hour = 0; else timeptr->tm_hour = ret; buf = s; break; case 'j' : ret = strtol (buf, &s, 10); if (s == buf) return NULL; timeptr->tm_yday = ret - 1; buf = s; break; case 'm' : ret = strtol (buf, &s, 10); if (s == buf) return NULL; timeptr->tm_mon = ret - 1; buf = s; break; case 'M' : ret = strtol (buf, &s, 10); if (s == buf) return NULL; timeptr->tm_min = ret; buf = s; break; case 'n' : if (*buf == '\n') ++buf; else return NULL; break; case 'p' : ret = match_string (&buf, ampm); if (ret < 0) return NULL; if (timeptr->tm_hour == 0) { if (ret == 1) timeptr->tm_hour = 12; } else timeptr->tm_hour += 12; break; case 'r' : /* %I:%M:%S %p */ s = strptime (buf, "%I:%M:%S %p", timeptr); if (s == NULL) return NULL; buf = s; break; case 'R' : /* %H:%M */ s = strptime (buf, "%H:%M", timeptr); if (s == NULL) return NULL; buf = s; break; case 'S' : ret = strtol (buf, &s, 10); if (s == buf) return NULL; timeptr->tm_sec = ret; buf = s; break; case 't' : if (*buf == '\t') ++buf; else return NULL; break; case 'T' : /* %H:%M:%S */ case 'X' : s = strptime (buf, "%H:%M:%S", timeptr); if (s == NULL) return NULL; buf = s; break; case 'u' : ret = strtol (buf, &s, 10); if (s == buf) return NULL; timeptr->tm_wday = ret - 1; buf = s; break; case 'w' : ret = strtol (buf, &s, 10); if (s == buf) return NULL; timeptr->tm_wday = ret; buf = s; break; case 'U' : ret = strtol (buf, &s, 10); if (s == buf) return NULL; set_week_number_sun (timeptr, ret); buf = s; break; case 'V' : ret = strtol (buf, &s, 10); if (s == buf) return NULL; set_week_number_mon4 (timeptr, ret); buf = s; break; case 'W' : ret = strtol (buf, &s, 10); if (s == buf) return NULL; set_week_number_mon (timeptr, ret); buf = s; break; case 'x' : s = strptime (buf, "%Y:%m:%d", timeptr); if (s == NULL) return NULL; buf = s; break; case 'y' : ret = strtol (buf, &s, 10); if (s == buf) return NULL; if (ret < 70) timeptr->tm_year = 100 + ret; else timeptr->tm_year = ret; buf = s; break; case 'Y' : ret = strtol (buf, &s, 10); if (s == buf) return NULL; timeptr->tm_year = ret - tm_year_base; buf = s; break; case 'Z' : abort (); case '\0' : --format; /* FALLTHROUGH */ case '%' : if (*buf == '%') ++buf; else return NULL; break; default : if (*buf == '%' || *++buf == c) ++buf; else return NULL; break; } } else { if (*buf == c) ++buf; else return NULL; } } return (char *)buf; } #endif mapcache-rel-1-6-1/lib/tileset.c000066400000000000000000001352351316353564100164410ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching support file: high level tile access * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #include #include #include #include #ifdef _WIN32 #include #endif char* mapcache_tileset_tile_resource_key(mapcache_context *ctx, mapcache_tile *tile) { char *lockname = apr_psprintf(ctx->pool, "%d-%d-%d-%s", tile->z,tile->y/tile->tileset->metasize_y,tile->x/tile->tileset->metasize_x, tile->tileset->name); /* if the tileset has multiple grids, add the name of the current grid to the lock key*/ if(tile->tileset->grid_links->nelts > 1) { lockname = apr_pstrcat(ctx->pool,lockname,tile->grid_link->grid->name,NULL); } if(tile->dimensions && tile->dimensions->nelts>0) { int i; for(i=0; idimensions->nelts; i++) { mapcache_requested_dimension *rdim = APR_ARRAY_IDX(tile->dimensions,i,mapcache_requested_dimension*); char *dimvalue = apr_pstrdup(ctx->pool,rdim->cached_value); char *iter = dimvalue; while(*iter) { if(*iter == '/') *iter='_'; iter++; } lockname = apr_pstrcat(ctx->pool,lockname,dimvalue,NULL); } } return lockname; } char* mapcache_tileset_metatile_resource_key(mapcache_context *ctx, mapcache_metatile *mt) { return mapcache_tileset_tile_resource_key(ctx,&mt->tiles[0]); } void mapcache_tileset_configuration_check(mapcache_context *ctx, mapcache_tileset *tileset) { /* check we have all we want */ if(tileset->_cache == NULL) { /* TODO: we should allow tilesets with no caches */ ctx->set_error(ctx, 400, "tileset \"%s\" has no cache configured.", tileset->name); return; } if(apr_is_empty_array(tileset->grid_links)) { ctx->set_error(ctx, 400, "tileset \"%s\" has no grids configured", tileset->name); return; } #ifdef USE_PROJ /* not implemented yet, will be used to automatically calculate wgs84bbox with proj */ else if(tileset->wgs84bbox[0]>=tileset->wgs84bbox[2]) { mapcache_grid_link *sgrid = APR_ARRAY_IDX(tileset->grid_links,0,mapcache_grid_link*); double *extent = sgrid->grid->extent; if(sgrid->restricted_extent) { extent = sgrid->restricted_extent; } } #endif if(!tileset->format && tileset->source && tileset->source->type == MAPCACHE_SOURCE_GDAL) { ctx->set_error(ctx,400, "tileset \"%s\" references a gdal source. tag is missing and mandatory in this case", tileset->name); return; } if(tileset->metabuffer < 0 || tileset->metasize_x < 1 || tileset->metasize_y < 1) { ctx->set_error(ctx,400,"tileset \"%s\" has invalid metasize %d,%d or metabuffer %d", tileset->name,tileset->metasize_x,tileset->metasize_y,tileset->metabuffer); return; } if(!tileset->format && ( tileset->metasize_x != 1 || tileset->metasize_y != 1 || tileset->metabuffer != 0 || tileset->watermark)) { if(tileset->watermark) { ctx->set_error(ctx,400,"tileset \"%s\" has no configured, but it is needed for the watermark", tileset->name); return; } else { ctx->set_error(ctx,400,"tileset \"%s\" has no configured, but it is needed for metatiling", tileset->name); return; } } } void mapcache_tileset_add_watermark(mapcache_context *ctx, mapcache_tileset *tileset, const char *filename) { apr_file_t *f; apr_finfo_t finfo; int rv; mapcache_buffer *watermarkdata; apr_size_t size; if(apr_file_open(&f, filename, APR_FOPEN_READ|APR_FOPEN_BUFFERED|APR_FOPEN_BINARY, APR_OS_DEFAULT, ctx->pool) != APR_SUCCESS) { ctx->set_error(ctx,500, "failed to open watermark image %s",filename); return; } rv = apr_file_info_get(&finfo, APR_FINFO_SIZE, f); if(rv != APR_SUCCESS || !finfo.size) { ctx->set_error(ctx, 500, "watermark %s has no data",filename); return; } watermarkdata = mapcache_buffer_create(finfo.size,ctx->pool); //manually add the data to our buffer size = finfo.size; apr_file_read(f,watermarkdata->buf,&size); watermarkdata->size = size; if(size != finfo.size) { ctx->set_error(ctx, 500, "failed to copy watermark image data, got %d of %d bytes",(int)size, (int)finfo.size); return; } apr_file_close(f); tileset->watermark = mapcache_imageio_decode(ctx,watermarkdata); } void mapcache_tileset_tile_validate_z(mapcache_context *ctx, mapcache_tile *tile) { if(tile->z < tile->grid_link->minz || tile->z >= tile->grid_link->maxz) { ctx->set_error(ctx,404,"invalid tile z level"); } } void mapcache_tileset_tile_validate_x(mapcache_context *ctx, mapcache_tile *tile) { mapcache_extent_i limits; limits = tile->grid_link->grid_limits[tile->z]; if(tile->xx>=limits.maxx) { ctx->set_error(ctx, 404, "tile x=%d not in [%d,%d[", tile->x,limits.minx,limits.maxx); } } void mapcache_tileset_tile_validate_y(mapcache_context *ctx, mapcache_tile *tile) { mapcache_extent_i limits; limits = tile->grid_link->grid_limits[tile->z]; if(tile->yy>=limits.maxy) { ctx->set_error(ctx, 404, "tile y=%d not in [%d,%d[", tile->y,limits.miny,limits.maxy); } } void mapcache_tileset_tile_validate(mapcache_context *ctx, mapcache_tile *tile) { mapcache_extent_i limits; if(tile->z < tile->grid_link->minz || tile->z >= tile->grid_link->maxz) { ctx->set_error(ctx,404,"invalid tile z level"); return; } limits = tile->grid_link->grid_limits[tile->z]; if(tile->xx>=limits.maxx) { ctx->set_error(ctx, 404, "tile x=%d not in [%d,%d[", tile->x,limits.minx,limits.maxx); return; } if(tile->yy>=limits.maxy) { ctx->set_error(ctx, 404, "tile y=%d not in [%d,%d[", tile->y,limits.miny,limits.maxy); return; } } void mapcache_tileset_get_map_tiles(mapcache_context *ctx, mapcache_tileset *tileset, mapcache_grid_link *grid_link, mapcache_extent *bbox, int width, int height, int *ntiles, mapcache_tile ***tiles, mapcache_grid_link **effectively_used_grid_link) { double resolution; int level; int bl_x,bl_y,tr_x,tr_y; int mx,my,Mx,My; int x,y; int i=0; resolution = mapcache_grid_get_resolution(bbox, width, height); *effectively_used_grid_link = mapcache_grid_get_closest_wms_level(ctx,grid_link,resolution,&level); /* we don't want to assemble tiles that have already been reassembled from a lower level */ if((*effectively_used_grid_link)->outofzoom_strategy == MAPCACHE_OUTOFZOOM_REASSEMBLE && level > (*effectively_used_grid_link)->max_cached_zoom) { level = (*effectively_used_grid_link)->max_cached_zoom; } mapcache_grid_get_xy(ctx,(*effectively_used_grid_link)->grid,bbox->minx,bbox->miny,level,&bl_x,&bl_y); mapcache_grid_get_xy(ctx,(*effectively_used_grid_link)->grid,bbox->maxx,bbox->maxy,level,&tr_x,&tr_y); Mx = MAPCACHE_MAX(MAPCACHE_MIN(MAPCACHE_MAX(tr_x,bl_x),(*effectively_used_grid_link)->grid_limits[level].maxx),(*effectively_used_grid_link)->grid_limits[level].minx); My = MAPCACHE_MAX(MAPCACHE_MIN(MAPCACHE_MAX(tr_y,bl_y),(*effectively_used_grid_link)->grid_limits[level].maxy),(*effectively_used_grid_link)->grid_limits[level].miny); mx = MAPCACHE_MIN(MAPCACHE_MAX(MAPCACHE_MIN(tr_x,bl_x),(*effectively_used_grid_link)->grid_limits[level].minx),(*effectively_used_grid_link)->grid_limits[level].maxx); my = MAPCACHE_MIN(MAPCACHE_MAX(MAPCACHE_MIN(tr_y,bl_y),(*effectively_used_grid_link)->grid_limits[level].miny),(*effectively_used_grid_link)->grid_limits[level].maxy); *ntiles = (Mx-mx+1)*(My-my+1); i=0; *tiles = (mapcache_tile**)apr_pcalloc(ctx->pool, *ntiles*sizeof(mapcache_tile*)); for(x=mx; x<=Mx; x++) { for(y=my; y<=My; y++) { mapcache_tile *tile = mapcache_tileset_tile_create(ctx->pool,tileset, (*effectively_used_grid_link)); tile->x = x; tile->y = y; tile->z = level; mapcache_tileset_tile_validate(ctx,tile); if(GC_HAS_ERROR(ctx)) { //clear the error message ctx->clear_errors(ctx); } else { (*tiles)[i++]=tile; } } } *ntiles = i; } mapcache_image* mapcache_tileset_assemble_map_tiles(mapcache_context *ctx, mapcache_tileset *tileset, mapcache_grid_link *grid_link, mapcache_extent *bbox, int width, int height, int ntiles, mapcache_tile **tiles, mapcache_resample_mode mode) { double hresolution = mapcache_grid_get_horizontal_resolution(bbox, width); double vresolution = mapcache_grid_get_vertical_resolution(bbox, height); mapcache_extent tilebbox; mapcache_tile *toplefttile=NULL; int mx=INT_MAX,my=INT_MAX,Mx=INT_MIN,My=INT_MIN; int i; mapcache_image *image; mapcache_image *srcimage; double tileresolution, dstminx, dstminy, hf, vf; #ifdef DEBUG /* we know at least one tile contains data */ for(i=0; inodata) { break; } } if(i==ntiles) { ctx->set_error(ctx,500,"###BUG#### mapcache_tileset_assemble_map_tiles called with no tiles containing data"); return NULL; } #endif image = mapcache_image_create_with_data(ctx,width,height); if(ntiles == 0) { image->has_alpha = MC_ALPHA_YES; image->is_blank = MC_EMPTY_YES; return image; } /* compute the number of tiles horizontally and vertically */ for(i=0; ix < mx) mx = tile->x; if(tile->y < my) my = tile->y; if(tile->x > Mx) Mx = tile->x; if(tile->y > My) My = tile->y; } /* create image that will contain the unscaled tiles data */ srcimage = mapcache_image_create_with_data(ctx, (Mx-mx+1)*tiles[0]->grid_link->grid->tile_sx, (My-my+1)*tiles[0]->grid_link->grid->tile_sy); /* copy the tiles data into the src image */ for(i=0; igrid->origin) { case MAPCACHE_GRID_ORIGIN_BOTTOM_LEFT: if(tile->x == mx && tile->y == My) { toplefttile = tile; } ox = (tile->x - mx) * tile->grid_link->grid->tile_sx; oy = (My - tile->y) * tile->grid_link->grid->tile_sy; break; case MAPCACHE_GRID_ORIGIN_TOP_LEFT: if(tile->x == mx && tile->y == my) { toplefttile = tile; } ox = (tile->x - mx) * tile->grid_link->grid->tile_sx; oy = (tile->y - my) * tile->grid_link->grid->tile_sy; break; case MAPCACHE_GRID_ORIGIN_BOTTOM_RIGHT: if(tile->x == Mx && tile->y == My) { toplefttile = tile; } ox = (Mx - tile->x) * tile->grid_link->grid->tile_sx; oy = (My - tile->y) * tile->grid_link->grid->tile_sy; break; case MAPCACHE_GRID_ORIGIN_TOP_RIGHT: if(tile->x == Mx && tile->y == my) { toplefttile = tile; } ox = (Mx - tile->x) * tile->grid_link->grid->tile_sx; oy = (tile->y - my) * tile->grid_link->grid->tile_sy; break; default: ctx->set_error(ctx,500,"BUG: invalid grid origin"); return NULL; } if(tile->nodata) continue; fakeimg.stride = srcimage->stride; fakeimg.data = &(srcimage->data[oy*srcimage->stride+ox*4]); if(!tile->raw_image) { mapcache_imageio_decode_to_image(ctx,tile->encoded_data,&fakeimg); } else { int r; unsigned char *srcptr = tile->raw_image->data; unsigned char *dstptr = fakeimg.data; for(r=0; rraw_image->h; r++) { memcpy(dstptr,srcptr,tile->raw_image->stride); srcptr += tile->raw_image->stride; dstptr += fakeimg.stride; } } } assert(toplefttile); /* copy/scale the srcimage onto the destination image */ tileresolution = toplefttile->grid_link->grid->levels[toplefttile->z]->resolution; mapcache_grid_get_tile_extent(ctx,toplefttile->grid_link->grid, toplefttile->x, toplefttile->y, toplefttile->z, &tilebbox); /*compute the pixel position of top left corner*/ dstminx = (tilebbox.minx-bbox->minx)/hresolution; dstminy = (bbox->maxy-tilebbox.maxy)/vresolution; hf = tileresolution/hresolution; vf = tileresolution/vresolution; if(fabs(hf-1)<0.0001 && fabs(vf-1)<0.0001) { //use nearest resampling if we are at the resolution of the tiles mapcache_image_copy_resampled_nearest(ctx,srcimage,image,dstminx,dstminy,hf,vf); } else { switch(mode) { case MAPCACHE_RESAMPLE_BILINEAR: mapcache_image_copy_resampled_bilinear(ctx,srcimage,image,dstminx,dstminy,hf,vf,0); break; default: mapcache_image_copy_resampled_nearest(ctx,srcimage,image,dstminx,dstminy,hf,vf); break; } } /* free the memory of the temporary source image */ apr_pool_cleanup_run(ctx->pool, srcimage->data, (void*)free) ; return image; } /* * compute the metatile that should be rendered for the given tile */ mapcache_metatile* mapcache_tileset_metatile_get(mapcache_context *ctx, mapcache_tile *tile) { mapcache_metatile *mt = (mapcache_metatile*)apr_pcalloc(ctx->pool, sizeof(mapcache_metatile)); int i,j,blx,bly; mapcache_tileset *tileset = tile->tileset; mapcache_grid *grid = tile->grid_link->grid; double res = grid->levels[tile->z]->resolution; double gbuffer,gwidth,gheight,fullgwidth,fullgheight; mt->map.tileset = tileset; mt->map.grid_link = tile->grid_link; mt->z = tile->z; mt->x = tile->x / tileset->metasize_x; if(tile->x < 0) mt->x --; mt->y = tile->y / tileset->metasize_y; if(tile->y < 0) mt->y --; blx = mt->x * tileset->metasize_x; bly = mt->y * tileset->metasize_y; /* adjust the size of the the metatile so it does not extend past the grid limits. * If we don't do this, we end up with cut labels on the edges of the tile grid */ if(blx+tileset->metasize_x-1 >= grid->levels[tile->z]->maxx) { mt->metasize_x = grid->levels[tile->z]->maxx - blx; } else { mt->metasize_x = tileset->metasize_x; } if(bly+tileset->metasize_y-1 >= grid->levels[tile->z]->maxy) { mt->metasize_y = grid->levels[tile->z]->maxy - bly; } else { mt->metasize_y = tileset->metasize_y; } mt->ntiles = mt->metasize_x * mt->metasize_y; mt->tiles = (mapcache_tile*)apr_pcalloc(ctx->pool, mt->ntiles * sizeof(mapcache_tile)); mt->map.width = mt->metasize_x * grid->tile_sx + 2 * tileset->metabuffer; mt->map.height = mt->metasize_y * grid->tile_sy + 2 * tileset->metabuffer; mt->map.dimensions = tile->dimensions; /* buffer in geographical units */ gbuffer = res * tileset->metabuffer; /* adjusted metatile size in geographical units */ gwidth = res * mt->metasize_x * grid->tile_sx; gheight = res * mt->metasize_y * grid->tile_sy; /* configured metatile size in geographical units */ fullgwidth = res * tileset->metasize_x * grid->tile_sx; fullgheight = res * tileset->metasize_y * grid->tile_sy; switch(grid->origin) { case MAPCACHE_GRID_ORIGIN_BOTTOM_LEFT: mt->map.extent.minx = grid->extent.minx + mt->x * fullgwidth - gbuffer; mt->map.extent.miny = grid->extent.miny + mt->y * fullgheight - gbuffer; mt->map.extent.maxx = mt->map.extent.minx + gwidth + 2 * gbuffer; mt->map.extent.maxy = mt->map.extent.miny + gheight + 2 * gbuffer; break; case MAPCACHE_GRID_ORIGIN_TOP_LEFT: mt->map.extent.minx = grid->extent.minx + mt->x * fullgwidth - gbuffer; mt->map.extent.maxy = grid->extent.maxy - mt->y * fullgheight + gbuffer; mt->map.extent.maxx = mt->map.extent.minx + gwidth + 2 * gbuffer; mt->map.extent.miny = mt->map.extent.maxy - gheight - 2 * gbuffer; break; case MAPCACHE_GRID_ORIGIN_BOTTOM_RIGHT: case MAPCACHE_GRID_ORIGIN_TOP_RIGHT: ctx->set_error(ctx,500,"origin not implemented"); return NULL; } for(i=0; imetasize_x; i++) { for(j=0; jmetasize_y; j++) { mapcache_tile *t = &(mt->tiles[i*mt->metasize_y+j]); t->dimensions = tile->dimensions; t->grid_link = tile->grid_link; t->z = tile->z; t->x = blx + i; t->y = bly + j; t->tileset = tile->tileset; } } return mt; } /* * do the actual rendering and saving of a metatile: * - query the datasource for the image data * - split the resulting image along the metabuffer / metatiles * - save each tile to cache */ void mapcache_tileset_render_metatile(mapcache_context *ctx, mapcache_metatile *mt) { mapcache_tileset *tileset = mt->map.tileset; if(!tileset->source || tileset->read_only) { ctx->set_error(ctx,500,"tileset_render_metatile called on tileset with no source or that is read-only"); return; } mapcache_source_render_map(ctx, tileset->source, &mt->map); GC_CHECK_ERROR(ctx); mapcache_image_metatile_split(ctx, mt); GC_CHECK_ERROR(ctx); mapcache_cache_tile_multi_set(ctx, tileset->_cache, mt->tiles, mt->ntiles); } /* * allocate and initialize a new tileset */ mapcache_tileset* mapcache_tileset_create(mapcache_context *ctx) { mapcache_tileset* tileset = (mapcache_tileset*)apr_pcalloc(ctx->pool, sizeof(mapcache_tileset)); tileset->metasize_x = tileset->metasize_y = 1; tileset->metabuffer = 0; tileset->expires = 300; /*set a reasonable default to 5 mins */ tileset->auto_expire = 0; tileset->read_only = 0; tileset->metadata = apr_table_make(ctx->pool,3); tileset->dimensions = NULL; tileset->format = NULL; tileset->grid_links = NULL; tileset->config = NULL; tileset->store_dimension_assemblies = 1; tileset->dimension_assembly_type = MAPCACHE_DIMENSION_ASSEMBLY_NONE; tileset->subdimension_read_only = 0; return tileset; } mapcache_tileset* mapcache_tileset_clone(mapcache_context *ctx, mapcache_tileset *src) { mapcache_tileset* dst = (mapcache_tileset*)apr_pcalloc(ctx->pool, sizeof(mapcache_tileset)); dst->metasize_x = src->metasize_x; dst->metasize_y = src->metasize_y; dst->metabuffer = src->metabuffer; dst->expires = src->expires; dst->auto_expire = src->auto_expire; dst->metadata = src->metadata; dst->dimensions = src->dimensions; dst->format = src->format; dst->grid_links = src->grid_links; dst->config = src->config; dst->name = src->name; dst->_cache = src->_cache; dst->source = src->source; dst->watermark = src->watermark; dst->wgs84bbox = src->wgs84bbox; dst->format = src->format; dst->store_dimension_assemblies = src->store_dimension_assemblies; dst->dimension_assembly_type = src->dimension_assembly_type; dst->subdimension_read_only = src->subdimension_read_only; return dst; } /* * allocate and initialize a tile for a given tileset */ mapcache_tile* mapcache_tileset_tile_create(apr_pool_t *pool, mapcache_tileset *tileset, mapcache_grid_link *grid_link) { mapcache_tile *tile = (mapcache_tile*)apr_pcalloc(pool, sizeof(mapcache_tile)); tile->tileset = tileset; if(tileset->auto_expire) { tile->expires = tileset->auto_expire; } else { tile->expires = tileset->expires; } tile->grid_link = grid_link; if(tileset->dimensions) { int i; tile->dimensions = apr_array_make(pool,tileset->dimensions->nelts,sizeof(mapcache_requested_dimension*)); for(i=0; idimensions->nelts; i++) { mapcache_dimension *dimension = APR_ARRAY_IDX(tileset->dimensions,i,mapcache_dimension*); mapcache_requested_dimension *rdim = apr_pcalloc(pool,sizeof(mapcache_requested_dimension)); rdim->requested_value = dimension->default_value; rdim->cached_value = NULL; rdim->dimension = dimension; APR_ARRAY_PUSH(tile->dimensions,mapcache_requested_dimension*) = rdim; } } return tile; } mapcache_tile* mapcache_tileset_tile_clone(apr_pool_t *pool, mapcache_tile *src) { mapcache_tile *tile = (mapcache_tile*)apr_pcalloc(pool, sizeof(mapcache_tile)); tile->tileset = src->tileset; tile->expires = src->expires; tile->grid_link = src->grid_link; tile->dimensions = mapcache_requested_dimensions_clone(pool, src->dimensions); tile->x = src->x; tile->y = src->y; tile->z = src->z; tile->allow_redirect = src->allow_redirect; return tile; } mapcache_map* mapcache_tileset_map_clone(apr_pool_t *pool, mapcache_map *src) { mapcache_map *map = (mapcache_map*)apr_pcalloc(pool, sizeof(mapcache_map)); map->tileset = src->tileset; map->expires = src->expires; map->grid_link = src->grid_link; map->dimensions = mapcache_requested_dimensions_clone(pool, src->dimensions); map->height = src->height; map->width = src->width; map->extent = src->extent; return map; } /* * allocate and initialize a map for a given tileset */ mapcache_map* mapcache_tileset_map_create(apr_pool_t *pool, mapcache_tileset *tileset, mapcache_grid_link *grid_link) { mapcache_map *map = (mapcache_map*)apr_pcalloc(pool, sizeof(mapcache_map)); map->tileset = tileset; map->grid_link = grid_link; if(tileset->dimensions) { int i; map->dimensions = apr_array_make(pool,tileset->dimensions->nelts,sizeof(mapcache_requested_dimension*)); for(i=0; idimensions->nelts; i++) { mapcache_dimension *dimension = APR_ARRAY_IDX(tileset->dimensions,i,mapcache_dimension*); mapcache_requested_dimension *rdim = apr_pcalloc(pool,sizeof(mapcache_requested_dimension)); rdim->requested_value = dimension->default_value; rdim->cached_value = NULL; rdim->dimension = dimension; APR_ARRAY_PUSH(map->dimensions,mapcache_requested_dimension*) = rdim; } } return map; } /* * allocate and initialize a feature_info for a given tileset */ mapcache_feature_info* mapcache_tileset_feature_info_create(apr_pool_t *pool, mapcache_tileset *tileset, mapcache_grid_link *grid_link) { mapcache_feature_info *fi = (mapcache_feature_info*)apr_pcalloc(pool, sizeof(mapcache_feature_info)); fi->map.tileset = tileset; fi->map.grid_link = grid_link; if(tileset->dimensions) { int i; fi->map.dimensions = apr_array_make(pool,tileset->dimensions->nelts,sizeof(mapcache_requested_dimension*)); for(i=0; idimensions->nelts; i++) { mapcache_dimension *dimension = APR_ARRAY_IDX(tileset->dimensions,i,mapcache_dimension*); mapcache_requested_dimension *rdim = apr_pcalloc(pool,sizeof(mapcache_requested_dimension)); rdim->requested_value = dimension->default_value; rdim->cached_value = NULL; rdim->dimension = dimension; APR_ARRAY_PUSH(fi->map.dimensions,mapcache_requested_dimension*) = rdim; } } return fi; } void mapcache_tileset_assemble_out_of_zoom_tile(mapcache_context *ctx, mapcache_tile *tile) { mapcache_extent tile_bbox; double shrink_x, shrink_y, scalefactor; int x[4],y[4]; int i, n=1; mapcache_tile *childtile; assert(tile->grid_link->outofzoom_strategy == MAPCACHE_OUTOFZOOM_REASSEMBLE); /* we have at most 4 tiles composing the requested tile */ mapcache_grid_get_tile_extent(ctx,tile->grid_link->grid,tile->x,tile->y,tile->z, &tile_bbox); /* shrink the extent so we do not fall exactly on a tile boundary, to avoid rounding errors when computing the x,y of the lower level tile(s) we will need */ shrink_x = (tile_bbox.maxx - tile_bbox.minx) / (tile->grid_link->grid->tile_sx * 1000); /* 1/1000th of a pixel */ shrink_y = (tile_bbox.maxy - tile_bbox.miny) / (tile->grid_link->grid->tile_sy * 1000); /* 1/1000th of a pixel */ tile_bbox.maxx -= shrink_x; tile_bbox.maxy -= shrink_y; tile_bbox.minx += shrink_x; tile_bbox.miny += shrink_y; /* compute the x,y of the lower level tiles we'll use for reassembling (we take them from the grid_link->max_cached_zoom, * which is the closest level were we can consume tiles from the cache */ mapcache_grid_get_xy(ctx,tile->grid_link->grid,tile_bbox.minx, tile_bbox.miny, tile->grid_link->max_cached_zoom, &x[0], &y[0]); mapcache_grid_get_xy(ctx,tile->grid_link->grid,tile_bbox.maxx, tile_bbox.maxy, tile->grid_link->max_cached_zoom, &x[1], &y[1]); if(x[0] != x[1] || y[0] != y[1]) { /* no use computing these if the first two were identical */ n = 4; mapcache_grid_get_xy(ctx,tile->grid_link->grid,tile_bbox.minx, tile_bbox.maxy, tile->grid_link->max_cached_zoom, &x[2], &y[2]); mapcache_grid_get_xy(ctx,tile->grid_link->grid,tile_bbox.maxx, tile_bbox.miny, tile->grid_link->max_cached_zoom, &x[3], &y[3]); } tile_bbox.maxx += shrink_x; tile_bbox.maxy += shrink_y; tile_bbox.minx -= shrink_x; tile_bbox.miny -= shrink_y; childtile = mapcache_tileset_tile_clone(ctx->pool,tile); childtile->z = tile->grid_link->max_cached_zoom; scalefactor = childtile->grid_link->grid->levels[childtile->z]->resolution/tile->grid_link->grid->levels[tile->z]->resolution; tile->nodata = 1; for(i=0;ix = x[i]; childtile->y = y[i]; mapcache_tileset_tile_get(ctx,childtile); GC_CHECK_ERROR(ctx); if(childtile->nodata) { /* silently skip empty tiles */ childtile->nodata = 0; /* reset flag */ continue; } if(!childtile->raw_image) { childtile->raw_image = mapcache_imageio_decode(ctx, childtile->encoded_data); GC_CHECK_ERROR(ctx); } if(tile->nodata) { /* we defer the creation of the actual image bytes, no use allocating before knowing that one of the child tiles actually contains data*/ tile->raw_image = mapcache_image_create_with_data(ctx,tile->grid_link->grid->tile_sx, tile->grid_link->grid->tile_sy); tile->nodata = 0; } /* now copy/scale the srcimage onto the destination image */ mapcache_grid_get_tile_extent(ctx,childtile->grid_link->grid, childtile->x, childtile->y, childtile->z, &childtile_bbox); /*compute the pixel position of top left corner*/ dstminx = (childtile_bbox.minx-tile_bbox.minx)/tile->grid_link->grid->levels[tile->z]->resolution; dstminy = (tile_bbox.maxy-childtile_bbox.maxy)/tile->grid_link->grid->levels[tile->z]->resolution; /* * ctx->log(ctx, MAPCACHE_DEBUG, "factor: %g. start: %g,%g (im size: %g)",scalefactor,dstminx,dstminy,scalefactor*256); */ if(scalefactor <= tile->grid_link->grid->tile_sx/2) /*FIXME: might fail for non-square tiles, also check tile_sy */ mapcache_image_copy_resampled_bilinear(ctx,childtile->raw_image,tile->raw_image,dstminx,dstminy,scalefactor,scalefactor,1); else { /* no use going through bilinear resampling if the requested scalefactor maps less than 4 pixels onto the * resulting tile, plus pixman has some rounding bugs in this case, see * https://bugs.freedesktop.org/show_bug.cgi?id=46277 */ unsigned int row,col; unsigned char *srcpixptr; unsigned char *row_ptr; unsigned int dstminxi = - dstminx / scalefactor; unsigned int dstminyi = - dstminy / scalefactor; srcpixptr = &(childtile->raw_image->data[dstminyi * childtile->raw_image->stride + dstminxi * 4]); /* ctx->log(ctx, MAPCACHE_WARN, "factor: %g. pixel: %d,%d (val:%d)",scalefactor,dstminxi,dstminyi,*((unsigned int*)srcpixptr)); */ row_ptr = tile->raw_image->data; for(row=0;rowraw_image->h;row++) { unsigned char *pix_ptr = row_ptr; for(col=0;colraw_image->w;col++) { *((unsigned int*)pix_ptr) = *((unsigned int*)srcpixptr); pix_ptr += 4; } row_ptr += tile->raw_image->stride; } } /* do some cleanup, a bit in advance as we won't be using this tile's data anymore */ apr_pool_cleanup_run(ctx->pool,childtile->raw_image->data,(void*)free); childtile->raw_image = NULL; childtile->encoded_data = NULL; } } void mapcache_tileset_outofzoom_get(mapcache_context *ctx, mapcache_tile *tile) { assert(tile->grid_link->outofzoom_strategy != MAPCACHE_OUTOFZOOM_NOTCONFIGURED); if(tile->grid_link->outofzoom_strategy == MAPCACHE_OUTOFZOOM_REASSEMBLE) { mapcache_tileset_assemble_out_of_zoom_tile(ctx, tile); } else {/* if(tile->grid_link->outofzoom_strategy == MAPCACHE_OUTOFZOOM_PROXY) */ if(ctx->config->non_blocking) { ctx->set_error(ctx,404,"cannot proxy out-of-zoom tile, I'm configured in non-blocking mode"); return; } ctx->set_error(ctx,500,"Proxying out of zoom tiles not implemented"); } } int mapcache_tileset_tile_get_readonly(mapcache_context *ctx, mapcache_tile *tile) { int ret = mapcache_cache_tile_get(ctx, tile->tileset->_cache, tile); if(GC_HAS_ERROR(ctx)) return ret; if(ret == MAPCACHE_SUCCESS && tile->tileset->auto_expire && tile->mtime && tile->tileset->source && !tile->tileset->read_only) { /* the cache is in auto-expire mode, and can return the tile modification date, * and there is a source configured so we can possibly update it, * so we check to see if it is stale */ apr_time_t now = apr_time_now(); apr_time_t stale = tile->mtime + apr_time_from_sec(tile->tileset->auto_expire); if(staleget_error(ctx) == 404) { ctx->clear_errors(ctx); } ret = MAPCACHE_CACHE_MISS; } } return ret; } typedef struct { mapcache_tile *tile; int cache_status; } mapcache_subtile; static void mapcache_tileset_tile_get_without_subdimensions(mapcache_context *ctx, mapcache_tile *tile, int read_only); void mapcache_tileset_tile_set_get_with_subdimensions(mapcache_context *ctx, mapcache_tile *tile) { apr_array_header_t *subtiles; mapcache_extent extent; mapcache_subtile st; mapcache_image *assembled_image = NULL; mapcache_buffer *assembled_buffer = NULL; int i,j,k,n_subtiles = 1,assembled_nodata = 1; /* we can be here in two cases: * - either we didn't look up the tile directly (need to split dimension into sub-dimension and reassemble dynamically) * - either the direct lookup failed and we need to render/assemble the tiles from subdimensions */ subtiles = apr_array_make(ctx->pool,1,sizeof(mapcache_subtile)); st.tile = tile; APR_ARRAY_PUSH(subtiles,mapcache_subtile) = st; mapcache_grid_get_tile_extent(ctx,tile->grid_link->grid,tile->x,tile->y,tile->z,&extent); if(GC_HAS_ERROR(ctx)) goto cleanup; for(i=0;idimensions->nelts; i++) { mapcache_requested_dimension *rdim = APR_ARRAY_IDX(tile->dimensions,i,mapcache_requested_dimension*); apr_array_header_t *single_subdimension = rdim->dimension->get_entries_for_value(ctx,rdim->dimension,rdim->requested_value, tile->tileset, &extent, tile->grid_link->grid); if(GC_HAS_ERROR(ctx)) /* invalid dimension given */ goto cleanup; #ifdef DEBUG { char *dims = ""; int i; for(i=0;inelts;i++) dims = apr_pstrcat(ctx->pool,dims,APR_ARRAY_IDX(single_subdimension,i,char*)," ",NULL); ctx->log(ctx,MAPCACHE_DEBUG,"tile (%d,%d,%d) dimension (%s) returned: %s", tile->z,tile->y,tile->x,rdim->dimension->name,dims); } #endif if(single_subdimension->nelts == 0) { /* not an error, but no subdimension was found: we need to return an empty tile */ tile->nodata = 1; if(tile->tileset->store_dimension_assemblies) { tile->raw_image = mapcache_image_create_with_data(ctx,tile->grid_link->grid->tile_sx, tile->grid_link->grid->tile_sy); tile->raw_image->has_alpha = MC_ALPHA_YES; tile->raw_image->is_blank = MC_EMPTY_YES; tile->encoded_data = tile->tileset->format->write(ctx, tile->raw_image, tile->tileset->format); /* set the key for the dimension so it can be stored with the requested dimension */ for(j=0;jdimensions->nelts;j++) { mapcache_requested_dimension *dim = APR_ARRAY_IDX(tile->dimensions,j,mapcache_requested_dimension*); dim->cached_value = dim->requested_value; } mapcache_cache_tile_set(ctx, tile->tileset->_cache, tile); GC_CHECK_ERROR(ctx); } return; } else { for(j=0;jnelts;k++) { st.tile = mapcache_tileset_tile_clone(ctx->pool,APR_ARRAY_IDX(subtiles,j,mapcache_subtile).tile); APR_ARRAY_PUSH(subtiles,mapcache_subtile)=st; } } n_subtiles *= single_subdimension->nelts; /* foreach of the subtiles, now set the actual subdimension we are going to be using the "j%nelts" part takes care of looping over and over through the individual subdimensions */ for(j=0;jdimension->name, APR_ARRAY_IDX(single_subdimension,j%single_subdimension->nelts,char*)); } } } /* our subtiles array now contains a list of tiles with subdimensions split up, we now need to fetch them from the cache */ /* note that subtiles[0].tile == tile */ for(i=subtiles->nelts-1; i>=0; i--) { mapcache_tile *subtile = APR_ARRAY_IDX(subtiles,i,mapcache_subtile).tile; mapcache_tileset_tile_get_without_subdimensions(ctx, subtile, (tile->tileset->subdimension_read_only||!tile->tileset->source)?1:0); /* creates the tile from the source, takes care of metatiling */ if(GC_HAS_ERROR(ctx)) goto cleanup; if(!subtile->nodata) { assembled_nodata = 0; if(!assembled_buffer && !assembled_image) { /* first "usable" subtile */ assembled_buffer = subtile->encoded_data; assembled_image = subtile->raw_image; } else { /* need to merge current assembled tile over this subtile */ if(!assembled_image) { assembled_image = mapcache_imageio_decode(ctx,assembled_buffer); if(GC_HAS_ERROR(ctx)) goto cleanup; assembled_buffer = NULL; /* the image data went stale as we're merging something */ } if(!subtile->raw_image) { subtile->raw_image = mapcache_imageio_decode(ctx,subtile->encoded_data); if(GC_HAS_ERROR(ctx)) goto cleanup; } mapcache_image_merge(ctx, subtile->raw_image, assembled_image); assembled_image = subtile->raw_image; assembled_image->has_alpha = MC_ALPHA_UNKNOWN; /* we've merged two images, we now have no idea if it's transparent or not */ if(GC_HAS_ERROR(ctx)) goto cleanup; } if((subtile->encoded_data && mapcache_imageio_header_sniff(ctx,subtile->encoded_data) == GC_JPEG)|| (subtile->raw_image && subtile->raw_image->has_alpha == MC_ALPHA_NO)) { /* the returned image is fully opaque, we don't need to get/decode/merge any further subtiles */ if(assembled_image) assembled_image->has_alpha = MC_ALPHA_NO; break; } } } tile->encoded_data = assembled_buffer; tile->raw_image = assembled_image; tile->nodata = assembled_nodata; /* TODO: how should the no data case be handled generically? * uncomment the following block if this nodata state should be returned to * the requester immediately, without this info being stored to the cache. * Leaving this uncommented will cause a no-data tile to be (maybe, depending * on the cache's actual configuration) written to the cache */ /* if(tile->nodata) { goto cleanup; } */ if(!tile->nodata && !tile->encoded_data) { tile->encoded_data = tile->tileset->format->write(ctx, tile->raw_image, tile->tileset->format); GC_CHECK_ERROR(ctx); } if(tile->tileset->store_dimension_assemblies) { int already_stored = 1; /*depending on the type of dimension, we may have no nead to store the resulting tile*/ if(n_subtiles != 1) already_stored = 0; /*if we had to merge multiple subdimensions, then we always have to store the resulting assembly*/ /* set the key for the dimension so it can be stored with the requested dimension */ for(j=0;jdimensions->nelts;j++) { mapcache_requested_dimension *dim = APR_ARRAY_IDX(tile->dimensions,j,mapcache_requested_dimension*); if(strcmp(dim->cached_value,dim->requested_value)) { already_stored = 0; /*the subdimension is different than the requested dimension, we need to store the resulting tile*/ } dim->cached_value = dim->requested_value; } if(!already_stored) { if(tile->nodata) { tile->raw_image = mapcache_image_create_with_data(ctx,tile->grid_link->grid->tile_sx, tile->grid_link->grid->tile_sy); tile->raw_image->has_alpha = MC_ALPHA_YES; tile->raw_image->is_blank = MC_EMPTY_YES; tile->encoded_data = tile->tileset->format->write(ctx, tile->raw_image, tile->tileset->format); GC_CHECK_ERROR(ctx); } mapcache_cache_tile_set(ctx, tile->tileset->_cache, tile); GC_CHECK_ERROR(ctx); } } cleanup: return; } void mapcache_tileset_tile_get_with_subdimensions(mapcache_context *ctx, mapcache_tile *tile) { int i,ret; assert(tile->dimensions); if(tile->tileset->store_dimension_assemblies) { for(i=0;idimensions->nelts;i++) { mapcache_requested_dimension *dim = APR_ARRAY_IDX(tile->dimensions,i,mapcache_requested_dimension*); dim->cached_value = dim->requested_value; } ret = mapcache_tileset_tile_get_readonly(ctx,tile); GC_CHECK_ERROR(ctx); if(ret == MAPCACHE_SUCCESS) { /* update the tile expiration time */ if(tile->tileset->auto_expire && tile->mtime) { apr_time_t now = apr_time_now(); apr_time_t expire_time = tile->mtime + apr_time_from_sec(tile->tileset->auto_expire); tile->expires = apr_time_sec(expire_time-now); } return; } for(i=0;idimensions->nelts;i++) { /* unset the cached dimension we setup earlier on */ mapcache_requested_dimension *dim = APR_ARRAY_IDX(tile->dimensions,i,mapcache_requested_dimension*); dim->cached_value = NULL; } } return mapcache_tileset_tile_set_get_with_subdimensions(ctx,tile); } /** * \brief return the image data for a given tile * this call uses a global (interprocess+interthread) mutex if the tile was not found * in the cache. * the processing here is: * - if the tile is found in the cache, return it. done * - if it isn't found: * - aquire mutex * - check if the tile isn't being rendered by another thread/process * - if another thread is rendering, wait for it to finish and return it's data * - otherwise, lock all the tiles corresponding to the request (a metatile has multiple tiles) * - release mutex * - call the source to render the metatile, and save the tiles to disk * - aquire mutex * - unlock the tiles we have rendered * - release mutex * */ static void mapcache_tileset_tile_get_without_subdimensions(mapcache_context *ctx, mapcache_tile *tile, int read_only) { int ret; mapcache_metatile *mt=NULL; ret = mapcache_cache_tile_get(ctx, tile->tileset->_cache, tile); GC_CHECK_ERROR(ctx); if(ret == MAPCACHE_SUCCESS && tile->tileset->auto_expire && tile->mtime && tile->tileset->source && !tile->tileset->read_only) { /* the cache is in auto-expire mode, and can return the tile modification date, * and there is a source configured so we can possibly update it, * so we check to see if it is stale */ apr_time_t now = apr_time_now(); apr_time_t stale = tile->mtime + apr_time_from_sec(tile->tileset->auto_expire); if(staleset_error(ctx,404,"tile not in cache, and no source configured for tileset %s", tile->tileset->name); */ tile->nodata = 1; return; } /* bail out in non-blocking mode */ if(ctx->config->non_blocking) { ctx->set_error(ctx,404,"tile not in cache, and configured for readonly mode"); return; } } if (ret == MAPCACHE_CACHE_MISS || ret == MAPCACHE_CACHE_RELOAD) { int isLocked = MAPCACHE_FALSE; void *lock; /* If the tile does not exist or stale, we must take action before re-asking for it */ if( !read_only && !ctx->config->non_blocking) { /* * is the tile already being rendered by another thread ? * the call is protected by the same mutex that sets the lock on the tile, * so we can assure that: * - if the lock does not exist, then this thread should do the rendering * - if the lock exists, we should wait for the other thread to finish */ /* aquire a lock on the metatile */ mt = mapcache_tileset_metatile_get(ctx, tile); isLocked = mapcache_lock_or_wait_for_resource(ctx, ctx->config->locker, mapcache_tileset_metatile_resource_key(ctx,mt), &lock); GC_CHECK_ERROR(ctx); if(isLocked == MAPCACHE_TRUE) { /* no other thread is doing the rendering, do it ourselves */ #ifdef DEBUG ctx->log(ctx, MAPCACHE_DEBUG, "cache miss/reload: tileset %s - tile %d %d %d", tile->tileset->name,tile->x, tile->y,tile->z); #endif /* this will query the source to create the tiles, and save them to the cache */ mapcache_tileset_render_metatile(ctx, mt); if(GC_HAS_ERROR(ctx)) { /* temporarily clear error state so we don't mess up with error handling in the locker */ void *error; ctx->pop_errors(ctx,&error); mapcache_unlock_resource(ctx, ctx->config->locker, lock); ctx->push_errors(ctx,error); } else { mapcache_unlock_resource(ctx, ctx->config->locker, lock); } } } if (ret == MAPCACHE_CACHE_RELOAD && GC_HAS_ERROR(ctx)) /* If we tried to reload a stale tile but failed, we know we have already * fetched it from the cache. We can then ignore errors and just use old tile. */ ctx->clear_errors(ctx); else { /* Else, check for errors and try to fetch the tile from the cache. */ GC_CHECK_ERROR(ctx); ret = mapcache_cache_tile_get(ctx, tile->tileset->_cache, tile); GC_CHECK_ERROR(ctx); if(ret != MAPCACHE_SUCCESS) { if(isLocked == MAPCACHE_FALSE) { ctx->set_error(ctx, 500, "tileset %s: unknown error (another thread/process failed to create the tile I was waiting for)", tile->tileset->name); } else { /* shouldn't really happen, as the error ought to have been caught beforehand */ ctx->set_error(ctx, 500, "tileset %s: failed to re-get tile %d %d %d from cache after set", tile->tileset->name,tile->x,tile->y,tile->z); } } } } /* update the tile expiration time */ if(tile->tileset->auto_expire && tile->mtime) { apr_time_t now = apr_time_now(); apr_time_t expire_time = tile->mtime + apr_time_from_sec(tile->tileset->auto_expire); tile->expires = apr_time_sec(expire_time-now); } } void mapcache_tileset_tile_get(mapcache_context *ctx, mapcache_tile *tile) { if(tile->grid_link->outofzoom_strategy != MAPCACHE_OUTOFZOOM_NOTCONFIGURED && tile->z > tile->grid_link->max_cached_zoom) { mapcache_tileset_outofzoom_get(ctx, tile); return; } if(tile->dimensions) { if(tile->tileset->dimension_assembly_type != MAPCACHE_DIMENSION_ASSEMBLY_NONE) { return mapcache_tileset_tile_get_with_subdimensions(ctx,tile); } else { int i; mapcache_requested_dimension *rdim; mapcache_extent extent; mapcache_grid_get_tile_extent(ctx,tile->grid_link->grid,tile->x,tile->y,tile->z,&extent); for(i=0; idimensions->nelts; i++) { apr_array_header_t *rdim_vals; rdim = APR_ARRAY_IDX(tile->dimensions,i,mapcache_requested_dimension*); rdim_vals = rdim->dimension->get_entries_for_value(ctx,rdim->dimension,rdim->requested_value, tile->tileset, NULL, tile->grid_link->grid); GC_CHECK_ERROR(ctx); if(rdim_vals->nelts > 1) { ctx->set_error(ctx,500,"dimension (%s) for tileset (%s) returned invalid number (%d) of subdimensions (1 expected)", rdim->dimension->name, tile->tileset->name, rdim_vals->nelts); return; } if(rdim_vals->nelts == 0) { ctx->set_error(ctx,404,"dimension (%s) for tileset (%s) returned no subdimensions (1 expected)",rdim->dimension->name, tile->tileset->name); return; } rdim->cached_value = APR_ARRAY_IDX(rdim_vals,0,char*); } } } return mapcache_tileset_tile_get_without_subdimensions(ctx,tile, (tile->tileset->read_only||!tile->tileset->source)?1:0); } void mapcache_tileset_tile_delete(mapcache_context *ctx, mapcache_tile *tile, int whole_metatile) { int i; /*delete the tile itself*/ mapcache_cache_tile_delete(ctx,tile->tileset->_cache, tile); GC_CHECK_ERROR(ctx); if(whole_metatile) { mapcache_metatile *mt = mapcache_tileset_metatile_get(ctx, tile); for(i=0; intiles; i++) { mapcache_tile *subtile = &mt->tiles[i]; /* skip deleting the actual tile */ if(subtile->x == tile->x && subtile->y == tile->y) continue; mapcache_cache_tile_delete(ctx,subtile->tileset->_cache,subtile); /* silently pass failure if the tile was not found */ if(ctx->get_error(ctx) == 404) { ctx->clear_errors(ctx); } GC_CHECK_ERROR(ctx); } } } /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/lib/util.c000066400000000000000000000454501316353564100157440ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapCache tile caching support file: common utility functions * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache.h" #include "util.h" #include #include #include #include #include #ifndef _WIN32 #include #endif #ifndef M_PI #define M_PI 3.14159265358979323846264338327 #endif #ifdef _WIN32 typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef unsigned long int uint64_t; #endif const double mapcache_meters_per_unit[MAPCACHE_UNITS_COUNT] = {1.0,6378137.0 * 2.0 * M_PI / 360,0.3048}; static char encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; static int mod_table[] = {0, 2, 1}; char *base64_encode(apr_pool_t *pool, const unsigned char *data, size_t input_length) { int i,j; char *encoded_data; size_t output_length = 4 * ((input_length + 2) / 3) + 1; encoded_data = (char*)apr_pcalloc(pool,output_length*sizeof(char)); if (encoded_data == NULL) return NULL; for (i = 0, j = 0; i < input_length;) { uint32_t octet_a; uint32_t octet_b; uint32_t octet_c; uint32_t triple; octet_a = i < input_length ? (unsigned char)data[i++] : 0; octet_b = i < input_length ? (unsigned char)data[i++] : 0; octet_c = i < input_length ? (unsigned char)data[i++] : 0; triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c; encoded_data[j++] = encoding_table[(triple >> 3 * 6) & 0x3F]; encoded_data[j++] = encoding_table[(triple >> 2 * 6) & 0x3F]; encoded_data[j++] = encoding_table[(triple >> 1 * 6) & 0x3F]; encoded_data[j++] = encoding_table[(triple >> 0 * 6) & 0x3F]; } for (i = 0; i < mod_table[input_length % 3]; i++) encoded_data[output_length - 2 - i] = '='; encoded_data[output_length-1]=0; return encoded_data; } int mapcache_util_extract_int_list(mapcache_context *ctx, const char* cargs, const char *sdelim, int **numbers, int *numbers_count) { char *last, *key, *endptr; char *args = apr_pstrdup(ctx->pool,cargs); int tmpcount=1; const char *delim = (sdelim)?sdelim:" ,\t\r\n"; char sep; int i; *numbers_count = 0; i=strlen(delim); while(i--) { sep = delim[i]; for(key=args; *key; key++) { if(*key == sep) tmpcount++; } } *numbers = (int*)apr_pcalloc(ctx->pool,tmpcount*sizeof(int)); for (key = apr_strtok(args, delim, &last); key != NULL; key = apr_strtok(NULL, delim, &last)) { (*numbers)[(*numbers_count)++] = (int)strtol(key,&endptr,10); if(*endptr != 0) return MAPCACHE_FAILURE; } return MAPCACHE_SUCCESS; } int mapcache_util_extract_double_list(mapcache_context *ctx, const char* cargs, const char *sdelim, double **numbers, int *numbers_count) { char *last, *key, *endptr; char *args = apr_pstrdup(ctx->pool,cargs); int tmpcount=1; const char *delim = (sdelim)?sdelim:" ,\t\r\n"; char sep; int i; *numbers_count = 0; i=strlen(delim); while(i--) { sep = delim[i]; for(key=args; *key; key++) { if(*key == sep) tmpcount++; } } *numbers = (double*)apr_pcalloc(ctx->pool,tmpcount*sizeof(double)); for (key = apr_strtok(args, delim, &last); key != NULL; key = apr_strtok(NULL, delim, &last)) { (*numbers)[(*numbers_count)++] = strtod(key,&endptr); if(*endptr != 0) return MAPCACHE_FAILURE; } return MAPCACHE_SUCCESS; } char *mapcache_util_str_replace(apr_pool_t *pool, const char *string, const char *substr, const char *replacement ) { char *tok = NULL; char *newstr = NULL; tok = strstr( string, substr ); if( tok == NULL ) return apr_pstrdup( pool, string ); newstr = apr_pcalloc(pool, strlen( string ) - strlen( substr ) + strlen( replacement ) + 1 ); memcpy( newstr, string, tok - string ); memcpy( newstr + (tok - string), replacement, strlen( replacement ) ); memcpy( newstr + (tok - string) + strlen( replacement ), tok + strlen( substr ), strlen( string ) - strlen( substr ) - ( tok - string ) ); memset( newstr + strlen( string ) - strlen( substr ) + strlen( replacement ), 0, 1 ); return newstr; } char* mapcache_util_str_sanitize(apr_pool_t *pool, const char *str, const char* from, char to) { char *pstr = apr_pstrdup(pool,str); size_t pos = strcspn(pstr,from); if(pstr[pos]) { pstr = apr_pstrdup(pool,pstr); while(pstr[pos]) { ((char*)pstr)[pos]=to; pos += strcspn(&pstr[pos],from); } } return pstr; } char* mapcache_util_str_xml_escape(apr_pool_t *pool, const char *str, mapcache_util_xml_section_type xml_section_type) { int outpos = 0; char* outstr = apr_pcalloc(pool, 6 * strlen(str) + 1); for( ; *str != '\0'; str ++ ) { if( xml_section_type == MAPCACHE_UTIL_XML_SECTION_COMMENT ) { if( *str == '-' ) { memcpy(outstr + outpos, "-", 5); outpos += 5; } else { outstr[outpos] = *str; outpos ++; } } else { if( *str == '&' ) { memcpy(outstr + outpos, "&", 5); outpos += 5; } else if( *str == '<' ) { memcpy(outstr + outpos, "<", 4); outpos += 4; } else if( *str == '>' ) { memcpy(outstr + outpos, ">", 4); outpos += 4; } else if( *str == '"' ) { memcpy(outstr + outpos, """, 6); outpos += 6; } else if( *str == '\'' ) { /* See https://github.com/mapserver/mapserver/issues/1040 */ memcpy(outstr + outpos, "'", 5); outpos += 5; } else { outstr[outpos] = *str; outpos ++; } } } return outstr; } #if APR_MAJOR_VERSION < 1 || (APR_MAJOR_VERSION < 2 && APR_MINOR_VERSION < 3) APR_DECLARE(apr_table_t *) apr_table_clone(apr_pool_t *p, const apr_table_t *t) { const apr_array_header_t *array = apr_table_elts(t); apr_table_entry_t *elts = (apr_table_entry_t *) array->elts; apr_table_t *new = apr_table_make(p, array->nelts); int i; for (i = 0; i < array->nelts; i++) { apr_table_add(new, elts[i].key, elts[i].val); } return new; } #endif int _mapcache_context_get_error_default(mapcache_context *ctx) { return ctx->_errcode; } char* _mapcache_context_get_error_msg_default(mapcache_context *ctx) { return ctx->_errmsg; } void _mapcache_context_set_exception_default(mapcache_context *ctx, char *key, char *msg, ...) { char *fullmsg; va_list args; if(!ctx->exceptions) { ctx->exceptions = apr_table_make(ctx->pool,1); } va_start(args,msg); fullmsg = apr_pvsprintf(ctx->pool,msg,args); va_end(args); apr_table_set(ctx->exceptions,key,fullmsg); } void _mapcache_context_set_error_default(mapcache_context *ctx, int code, char *msg, ...) { char *new_msg; va_list args; va_start(args,msg); new_msg = apr_pvsprintf(ctx->pool,msg,args); va_end(args); if(ctx->_errmsg) { ctx->_errmsg = apr_pstrcat(ctx->pool, ctx->_errmsg, "\n", new_msg, NULL); } else { ctx->_errmsg = new_msg; ctx->_errcode = code; } } void _mapcache_context_clear_error_default(mapcache_context *ctx) { ctx->_errcode = 0; ctx->_errmsg = NULL; if(ctx->exceptions) { apr_table_clear(ctx->exceptions); } } struct _error_log { int _errcode; char *_errmsg; apr_table_t *exceptions; }; void _mapcache_context_pop_errors(mapcache_context *ctx, void **error) { struct _error_log *e = (struct _error_log*)apr_pcalloc(ctx->pool, sizeof(struct _error_log)); e->_errcode = ctx->_errcode; e->_errmsg = ctx->_errmsg; e->exceptions = ctx->exceptions; ctx->_errcode = 0; ctx->_errmsg = NULL; ctx->exceptions = NULL; *error = e; } void _mapcache_context_push_errors(mapcache_context *ctx, void *error) { struct _error_log *e = (struct _error_log*)error; if(e->_errcode) ctx->_errcode = e->_errcode; if(e->_errmsg) { if(ctx->_errmsg) { ctx->_errmsg = apr_psprintf(ctx->pool,"%s\n%s",e->_errmsg,ctx->_errmsg); } else { ctx->_errmsg = e->_errmsg; } } if(e->exceptions) { if(ctx->exceptions) { apr_table_overlap(ctx->exceptions, e->exceptions, APR_OVERLAP_TABLES_SET); } else { ctx->exceptions = e->exceptions; } } } void mapcache_context_init(mapcache_context *ctx) { ctx->_errcode = 0; ctx->_errmsg = NULL; ctx->get_error = _mapcache_context_get_error_default; ctx->get_error_message = _mapcache_context_get_error_msg_default; ctx->set_error = _mapcache_context_set_error_default; ctx->set_exception = _mapcache_context_set_exception_default; ctx->clear_errors = _mapcache_context_clear_error_default; ctx->pop_errors = _mapcache_context_pop_errors; ctx->push_errors = _mapcache_context_push_errors; ctx->headers_in = NULL; } void mapcache_context_copy(mapcache_context *src, mapcache_context *dst) { dst->_contenttype = src->_contenttype; dst->_errcode = src->_errcode; dst->_errmsg = src->_errmsg; dst->clear_errors = src->clear_errors; dst->clone = src->clone; dst->config = src->config; dst->get_error = src->get_error; dst->get_error_message = src->get_error_message; dst->get_instance_id = src->get_instance_id; dst->log = src->log; dst->set_error = src->set_error; dst->pool = src->pool; dst->set_exception = src->set_exception; dst->service = src->service; dst->exceptions = src->exceptions; dst->supports_redirects = src->supports_redirects; dst->pop_errors = src->pop_errors; dst->push_errors = src->push_errors; dst->connection_pool = src->connection_pool; dst->headers_in = src->headers_in; } char* mapcache_util_get_tile_dimkey(mapcache_context *ctx, mapcache_tile *tile, char* sanitized_chars, char *sanitize_to) { char *key = apr_pstrdup(ctx->pool,""); if(tile->dimensions) { int i = tile->dimensions->nelts; if(i>1) { while(i--) { mapcache_requested_dimension *entry = APR_ARRAY_IDX(tile->dimensions,i,mapcache_requested_dimension*); if(i) { key = apr_pstrcat(ctx->pool,key,entry->cached_value,(sanitized_chars?sanitize_to:"#"),NULL); } else { key = apr_pstrcat(ctx->pool,key,entry->cached_value,NULL); } } return key; } else if(i) { mapcache_requested_dimension *entry = APR_ARRAY_IDX(tile->dimensions,0,mapcache_requested_dimension*); key = apr_pstrdup(ctx->pool,entry->cached_value); } if(sanitized_chars) key = mapcache_util_str_sanitize(ctx->pool,key,sanitized_chars,*sanitize_to); } return key; } void mapcache_util_quadkey_decode(mapcache_context *ctx, const char *quadkey, int *x, int *y, int *z) { int i; if(!quadkey || !*quadkey) { *z = *x = *y = 0; return; } *z = strlen(quadkey); *x = *y = 0; for (i = *z; i; i--) { int mask = 1 << (i - 1); switch (quadkey[*z - i]) { case '0': break; case '1': *x |= mask; break; case '2': *y |= mask; break; case '3': *x |= mask; *y |= mask; break; default: ctx->set_error(ctx, 400, "Invalid Quadkey sequence"); return; } } } char* mapcache_util_quadkey_encode(mapcache_context *ctx, int x, int y, int z) { int i; char *key = apr_pcalloc(ctx->pool, z+1); memset(key,'0',z); for (i = z; i > 0; i--) { int mask = 1 << (i - 1); if ((x & mask) != 0) { key[z - i]++; } if ((y & mask) != 0) { key[z - i] += 2; } } return key; } char* mapcache_util_get_tile_key(mapcache_context *ctx, mapcache_tile *tile, char *template, char* sanitized_chars, char *sanitize_to) { char *path; if(template) { path = apr_pstrdup(ctx->pool, template); if(strstr(path,"{x}")) path = mapcache_util_str_replace(ctx->pool,path, "{x}", apr_psprintf(ctx->pool,"%d",tile->x)); else if(strstr(path,"{inv_x}")) path = mapcache_util_str_replace(ctx->pool,path, "{inv_x}", apr_psprintf(ctx->pool,"%d", tile->grid_link->grid->levels[tile->z]->maxx - tile->x - 1)); if(strstr(path,"{y}")) path = mapcache_util_str_replace(ctx->pool,path, "{y}", apr_psprintf(ctx->pool,"%d",tile->y)); else if(strstr(path,"{inv_y}")) path = mapcache_util_str_replace(ctx->pool,path, "{inv_y}", apr_psprintf(ctx->pool,"%d", tile->grid_link->grid->levels[tile->z]->maxy - tile->y - 1)); if(strstr(path,"{z}")) path = mapcache_util_str_replace(ctx->pool,path, "{z}", apr_psprintf(ctx->pool,"%d",tile->z)); else if(strstr(path,"{inv_z}")) path = mapcache_util_str_replace(ctx->pool,path, "{inv_z}", apr_psprintf(ctx->pool,"%d", tile->grid_link->grid->nlevels - tile->z - 1)); if(strstr(path,"{quadkey}")) { char *quadkey = mapcache_util_quadkey_encode(ctx, tile->x, tile->y, tile->z); path = mapcache_util_str_replace(ctx->pool,path, "{quadkey}", quadkey); } if(tile->dimensions) { if(strstr(path,"{dim:")) { char *dimstring=""; int i = tile->dimensions->nelts; while(i--) { char *single_dim; mapcache_requested_dimension *entry = APR_ARRAY_IDX(tile->dimensions,i,mapcache_requested_dimension*); /* compute value for eventual {dim} replacement */ dimstring = apr_pstrcat(ctx->pool,dimstring,"#",entry->dimension->name,"#",entry->cached_value,NULL); /* check for {dim:name} replacement */ single_dim = apr_pstrcat(ctx->pool,"{dim:",entry->dimension->name,"}",NULL); if(strstr(path,single_dim)) { path = mapcache_util_str_replace(ctx->pool,path, single_dim, entry->cached_value); } } } if(strstr(path,"{dim}")) { path = mapcache_util_str_replace(ctx->pool,path, "{dim}", mapcache_util_get_tile_dimkey(ctx,tile,sanitized_chars,sanitize_to)); } } if(strstr(path,"{tileset}")) path = mapcache_util_str_replace(ctx->pool, path, "{tileset}", tile->tileset->name); if(strstr(path,"{grid}")) path = mapcache_util_str_replace(ctx->pool, path, "{grid}", tile->grid_link->grid->name); if(strstr(path,"{ext}")) path = mapcache_util_str_replace(ctx->pool, path, "{ext}", tile->tileset->format ? tile->tileset->format->extension : "png"); } else { char *separator = "/"; /* we'll concatenate the entries ourself */ path = apr_pstrcat(ctx->pool, tile->tileset->name,separator, tile->grid_link->grid->name,separator, NULL); if(tile->dimensions) { path = apr_pstrcat(ctx->pool,path, mapcache_util_get_tile_dimkey(ctx,tile,sanitized_chars,sanitize_to), separator,NULL); } path = apr_pstrcat(ctx->pool,path, apr_psprintf(ctx->pool, "%d", tile->z),separator, apr_psprintf(ctx->pool, "%d", tile->y),separator, apr_psprintf(ctx->pool, "%d", tile->x),separator, tile->tileset->format?tile->tileset->format->extension:"png", NULL); } return path; } void mapcache_make_parent_dirs(mapcache_context *ctx, char *filename) { char *hackptr1,*hackptr2=NULL; apr_status_t ret; char errmsg[120]; /* find the location of the last '/' in the string */ hackptr1 = filename; while(*hackptr1) { if(*hackptr1 == '/') hackptr2 = hackptr1; hackptr1++; } if(hackptr2) { /* terminate string on last '/' */ *hackptr2 = '\0'; } ret = apr_dir_make_recursive(filename,APR_OS_DEFAULT,ctx->pool); if(hackptr2) { *hackptr2 = '/'; } if(APR_SUCCESS != ret) { /* * apr_dir_make_recursive sometimes sends back this error, although it should not. * ignore this one */ if(!APR_STATUS_IS_EEXIST(ret)) { ctx->set_error(ctx, 500, "failed to create directory %s: %s",filename, apr_strerror(ret,errmsg,120)); } } } #if defined(_WIN32) && !defined(__CYGWIN__) int strncasecmp(const char *s1, const char *s2, int len) { register const char *cp1, *cp2; int cmp = 0; cp1 = s1; cp2 = s2; if(len == 0) return(0); if (!*cp1) return -1; else if (!*cp2) return 1; while(*cp1 && *cp2 && len) { if((cmp = (toupper(*cp1) - toupper(*cp2))) != 0) return(cmp); cp1++; cp2++; len--; } if(len == 0) { return(0); } if(*cp1 || *cp2) { if (*cp1) return(1); else return (-1); } return(0); } #include void mapcache_gettimeofday(struct mctimeval* tp, void* tzp) { struct _timeb theTime; _ftime(&theTime); tp->tv_sec = theTime.time; tp->tv_usec = theTime.millitm * 1000; } #endif /* vim: ts=2 sts=2 et sw=2 */ mapcache-rel-1-6-1/mapcache.xml000066400000000000000000000030761316353564100163360ustar00rootroot00000000000000 /tmp /tmp/{tileset}-{z}-{grid}.db image/png basic http://vmap0.tiles.osgeo.org/wms/vmap0 vmap0 sqlite WGS84 GoogleMapsCompatible PNG 5 5 10 3600 JPEG assemble bilinear JPEG 4096 report /tmp 300 mapcache-rel-1-6-1/mapcache.xml.sample000066400000000000000000001166501316353564100176210ustar00rootroot00000000000000 my mapcache service woot! this is a service abstract! this is a custom grid I made up for an example EPSG:4326 EPSG:foobar 256 256 -180 -90 180 90 0.1 0.05 0.025 0.0125 Lambert 1993 -357823.2365 6037008.6939 1313632.3628 7230727.3772 EPSG:2154 IGNF:LAMB93 2048 1024 512 256 128 64 32 16 8 4 2 1 0.5 0.25 0.125 0.0625 m 256 256 -9.62 41.18 10.3 51.54 EPSG:4171 IGNF:RGF93 0.026726773770953713 0.013363386885476856 0.006681693442738428 0.003340846721369214 0.001670423360684607 0.0008352116803423035 0.00041760584017115176 0.00020880292008557588 0.00010440146004278794 0.00005220073002139397 0.000026100365010696985 0.000013050182505348493 0.000006525091252674246 0.000003262545626337123 0.0000016312728131685616 0.0000008156364065842808 dd 256 256 Géoportail - France métropolitaine -524288 4456448 786432 5767168 EPSG:310024802 IGNF:GEOPORTALFXX EPSG:310024001 2048 1024 512 256 128 64 32 16 8 4 2 1 0.5 0.25 0.125 0.0625 m 256 256 Géoportail - Antilles françaises -6791168 1761280 -6553600 2023424 EPSG:310915814 IGNF:GEOPORTALANF EPSG:310495002 2048 1024 512 256 128 64 32 16 8 4 2 1 0.5 0.25 0.125 0.0625 m 256 256 Géoportail - Guyane -6070272 235047 -5726208 647168 EPSG:310486805 IGNF:GEOPORTALGUF EPSG:310486003 2048 1024 512 256 128 64 32 16 8 4 2 1 0.5 0.25 0.125 0.0625 m 256 256 Géoportail - Mayotte 4901888 -1447936 4932608 -1405952 EPSG:310702807 IGNF:GEOPORTALMYT EPSG:310702005 2048 1024 512 256 128 64 32 16 8 4 2 1 0.5 0.25 0.125 0.0625 m 256 256 Géoportail - Réunion et dépendances 5734400 -2383872 5808128 -2318336 EPSG:310700806 IGNF:GEOPORTALREU EPSG:310700004 2048 1024 512 256 128 64 32 16 8 4 2 1 0.5 0.25 0.125 0.0625 m 256 256 Géoportail - Nouvelle-Calédonie 16777216 -2555904 17301504 -2162688 EPSG:310547809 IGNF:GEOPORTALNCL 2048 1024 512 256 128 64 32 16 8 4 2 1 0.5 0.25 0.125 0.0625 m 256 256 Géoportail - Saint-Pierre et Miquelon -4325376 5177344 -4259840 5308416 EPSG:310706808 IGNF:GEOPORTALSPM EPSG:310706006 2048 1024 512 256 128 64 32 16 8 4 2 1 0.5 0.25 0.125 0.0625 m 256 256 Géoportail - Wallis et Futuna -19267584 -1638400 -19005440 -1441792 EPSG:310642810 IGNF:GEOPORTALWLF 2048 1024 512 256 128 64 32 16 8 4 2 1 0.5 0.25 0.125 0.0625 m 256 256 Géoportail - Crozet 3801088 -5242880 4128768 -5046272 EPSG:310642801 IGNF:GEOPORTALCRZ 2048 1024 512 256 128 64 32 16 8 4 2 1 0.5 0.25 0.125 0.0625 m 256 256 Géoportail - Kerguelen 4915200 -5636096 5177344 -5373952 EPSG:310642812 IGNF:GEOPORTALKER 2048 1024 512 256 128 64 32 16 8 4 2 1 0.5 0.25 0.125 0.0625 m 256 256 Géoportail - Polynésie française -16384000 -2097152 -15990784 -1703936 EPSG:310032811 IGNF:GEOPORTALPYF EPSG:310032009 2048 1024 512 256 128 64 32 16 8 4 2 1 0.5 0.25 0.125 0.0625 m 256 256 Géoportail - Amsterdam et Saint-Paul -6791168 1761280 -6553600 2023424 EPSG:310642813 IGNF:GEOPORTALASP 2048 1024 512 256 128 64 32 16 8 4 2 1 0.5 0.25 0.125 0.0625 m 256 256 Terre Adélie 1950 196098 225276 720386 749564 EPSG:2986 IGNF:TERA50STEREO 2048 1024 512 256 128 64 32 16 8 4 2 1 0.5 0.25 0.125 0.0625 m 256 256 Géoportail - Monde -20037504 -10018752 20037504 10018752 EPSG:310642901 IGNF:MILLER 39135.75 19567.875 9783.9375 4891.96875 2445.984375 m 256 256 /tmp /tmp/mysqlitetiles.db value create table if not exists tiles(tileset text, grid text, x integer, y integer, z integer, data blob, dim text, ctime datetime, primary key(tileset,grid,x,y,z,dim)) select 1 from tiles where x=:x and y=:y and z=:z and dim=:dim and tileset=:tileset and grid=:grid select data,strftime("%s",ctime) from tiles where tileset=:tileset and grid=:grid and x=:x and y=:y and z=:z and dim=:dim insert or replace into tiles(tileset,grid,x,y,z,data,dim,ctime) values (:tileset,:grid,:x,:y,:z,:data,:dim,datetime('now')) delete from tiles where x=:x and y=:y and z=:z and dim=:dim and tileset=:tileset and grid=:grid /tmp/foo/ /tmp/ {tileset}-{grid}-{dim}-{z}-{y}-{x}.{ext} https://myserver/webdav/{tileset}/{grid}/{z}/{x}/{y}.{ext} my-virtualhost-alias.domain.com foo foo foo foo https://foo.s3.amazonaws.com/tiles/{tileset}/{grid}/{z}/{x}/{y}/{ext} foo.s3.amazonaws.com foo foo/sdsvd eu-west-1 REDUCED_REDUNDANCY public-read https://foo.blob.core.windows.net/tiles/{tileset}/{grid}/{z}/{x}/{y}/{ext} foo.blob.core.windows.net foo foobarcccccccccccccccccccccyA== tiles https://storage.googleapis.com/mytiles-mapcache/{tileset}/{grid}/{z}/{x}/{y}.{ext} GOOGPGDWFDG345SDFGSD sdfgsdSDFwedfwefr2345324dfsGdsfgs public-read /dev/shm/google-mapcache.header 10 3 GOOGPGDWFDG345SDFGSD sdfgsdSDFwedfwefr2345324dfsGdsfgs 10 3 fast 256 75 RGB true best PNG_BEST JPEG image/png basic http://vmap0.tiles.osgeo.org/wms/vmap0 30 300 http://localhost/cgi-bin/mapserv? image/png default /Users/tbonfort/dev/mapserver-utils/osm-google.map http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi image/png nexrad_base_reflect true http://geoservices.brgm.fr/geologie? image/png GRAVI_BASE true text/plain,application/vnd.ogc.gml GRAVI_BASE vmap0 sqlite WGS84 g vmap0 map blabla PNG 5 5 10 3600 86400 foobar,foobarbaz,foo,bar ^(?!.*\.\.)[a-zA-Z0-9\./]*\.map$ 0/5000/1000 nexrad disk mixed WGS84 basic disk PNG WGS84 5 5 30 osm mapserver served map of midi-pyrénées see http://mapserver-utils.googlecode.com osm sqlite PNG FXX MILLER WGS84 g 5 5 1 10 JPEG assemble bilinear myjpeg 4096 report /tmp 0.01 /tmp localhost 11211 memcache-host 11212 0.3 true info true mapcache-rel-1-6-1/mod_geocache.doxyfile000066400000000000000000002043141316353564100202130ustar00rootroot00000000000000# Doxyfile 1.7.2 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" "). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = mod-mapcache # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 0.1-dev # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this # tag. The format is ext=language, where ext is a file extension, and language # is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, # C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions # you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will roughly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = YES # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = YES # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST = YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or macro consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. The create the layout file # that represents doxygen's defaults, run doxygen with the -l option. # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = src include # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.vhd *.vhdl FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the stylesheet and background images # according to this color. Hue is specified as an angle on a colorwheel, # see http://en.wikipedia.org/wiki/Hue for more information. # For instance the value 0 represents red, 60 is yellow, 120 is green, # 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of # the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to # the luminance component of the colors in the HTML output. Values below # 100 gradually make the output lighter, whereas values above 100 make # the output darker. The value divided by 100 is the actual gamma applied, # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated # that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [0,1..20]) # that doxygen will group on one line in the generated HTML documentation. # Note that a value of 0 will completely suppress the enum values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are # not supported properly for IE 6.0, but are supported on all modern browsers. # Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see http://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the mathjax.org site, so you can quickly see the result without installing # MathJax, but it is strongly recommended to install a local copy of MathJax # before deployment. MATHJAX_RELPATH = http://www.mathjax.org/mathjax # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvantages are that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option also works with HAVE_DOT disabled, but it is recommended to # install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = NO # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = NO # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans.ttf # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif. # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES mapcache-rel-1-6-1/nginx/000077500000000000000000000000001316353564100151705ustar00rootroot00000000000000mapcache-rel-1-6-1/nginx/CMakeLists.txt000066400000000000000000000001461316353564100177310ustar00rootroot00000000000000 configure_file ( "${PROJECT_SOURCE_DIR}/nginx/config.in" "${PROJECT_BINARY_DIR}/nginx/config" ) mapcache-rel-1-6-1/nginx/README000066400000000000000000000045261316353564100160570ustar00rootroot00000000000000minimal install instructions: - configure nginx with ./configure --add-module=/path/to/mapcache/nginx the supplied nginx.conf contains an example configuration to load mapcache. the relevant part is: location ~ ^/mapcache(?/.*|$) { set $url_prefix "/mapcache"; mapcache /home/tbonfort/dev/mapserver-trunk/mapcache/mapcache.xml; } the and $url_prefix are important and are used by mapcache to parse the incoming requests. before running nginx, set LD_LIBRARY_PATH to where libmapcache was installed if that is a non standard location. Note that nginx processes are scarse and would be locked when mapcache is doing a curl request for a metatile, or when waiting for a metatile to be rendered. So as not to lock down the whole nginx server in this case, mapcache will fail with a 404 error if a requested tile cannot be found in it's cache. It is up to the administrator of the server to forward these failed requests to an external fastcgi or apache mapcache instance running with the same configuration file. Here is a configuration block which forwards these 404 requests: location ~ ^/mapcache(?/.*|$) { set $url_prefix "/mapcache"; mapcache /path/to/etc/mapcache.xml; #error_page 404 = @apache_mapcache; error_page 404 = @fcgi_mapcache; } #proxy for a mapcache instance running on another server location @apache_mapcache { proxy_pass http://localhost:8081; # this supposes you have mapcache as a module running in an apache httpd server, where # you would have set the httpd.conf to contain: # MapcacheAlias /mapcache /path/to/etc/mapcache.xml; } #mapcache as fcgi running with an external spawning manager (e.g. spawn-fcgi or fcgistarter) #(make sure mapcache is built with fastcgi support) #eg: # export MAPCACHE_CONFIG_FILE=/path/to/etc/mapcache.xml # /usr/local/httpd-2.4/bin/fcgistarter -c /usr/local/bin/mapcache -p 9001 -N 20 location @fcgi_mapcache { fastcgi_pass localhost:9001; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param PATH_INFO $path_info; } mapcache-rel-1-6-1/nginx/config.in000066400000000000000000000005331316353564100167660ustar00rootroot00000000000000ngx_addon_name=ngx_http_mapcache_module HTTP_MODULES="$HTTP_MODULES ngx_http_mapcache_module" NGX_ADDON_SRCS="$NGX_ADDON_SRCS @CMAKE_SOURCE_DIR@/nginx/ngx_http_mapcache_module.c" CORE_LIBS="$CORE_LIBS -lmapcache @APR_LIBRARIES@ @APU_LIBRARIES@" CFLAGS="$CFLAGS @APR_CPPFLAGS@" CORE_INCS="$CORE_INCS @PROJECT_BINARY_DIR@/include @APR_INCLUDE_DIR@" mapcache-rel-1-6-1/nginx/nginx.conf000066400000000000000000000074121316353564100171660ustar00rootroot00000000000000 #user nobody; worker_processes 4; #master_process on; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 5; #gzip on; server { listen 8083; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ ^/mapcache(?/.*|$) { set $url_prefix "/mapcache"; mapcache /home/tbonfort/dev/mapserver-trunk/mapcache/mapcache.xml; } location ~ ^/mapcache(?/.*|$) { set $url_prefix "/mapcache"; mapcache /home/tbonfort/dev/mapcache/mapcache-local.xml; #don't render uncached tiles ourself, forward them to fcgi or apache instance #error_page 404 = @apache_mapcache; error_page 404 = @fcgi_mapcache; } #proxy for a mapcache instance running on another server location @apache_mapcache { proxy_pass http://localhost:8081; } #mapcache as fcgi running with an external spawning manager (e.g. spawn-fcgi or fcgistarter) location @fcgi_mapcache { fastcgi_pass localhost:9001; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param PATH_INFO $path_info; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443; # server_name localhost; # ssl on; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_timeout 5m; # ssl_protocols SSLv2 SSLv3 TLSv1; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} } mapcache-rel-1-6-1/nginx/ngx_http_mapcache_module.c000066400000000000000000000247721316353564100223710ustar00rootroot00000000000000#include #include #include #include "../include/mapcache.h" #include #include #include apr_pool_t *process_pool = NULL; static char *ngx_http_mapcache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); static ngx_command_t ngx_http_mapcache_commands[] = { { ngx_string("mapcache"), NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, ngx_http_mapcache, NGX_HTTP_LOC_CONF_OFFSET, 0, NULL }, ngx_null_command }; typedef struct { mapcache_context ctx; ngx_http_request_t *r; } mapcache_ngx_context; static void ngx_mapcache_context_log(mapcache_context *c, mapcache_log_level level, char *message, ...) { mapcache_ngx_context *ctx = (mapcache_ngx_context*)c; va_list args; if(!c->config || level >= c->config->loglevel) { va_start(args,message); ngx_log_error(NGX_LOG_ALERT, ctx->r->connection->log, 0, apr_pvsprintf(c->pool,message,args)); va_end(args); } } static mapcache_context* ngx_mapcache_context_clone(mapcache_context *ctx) { mapcache_context *nctx = (mapcache_context*)apr_pcalloc(ctx->pool, sizeof(mapcache_ngx_context)); mapcache_context_copy(ctx,nctx); ((mapcache_ngx_context*)nctx)->r = ((mapcache_ngx_context*)ctx)->r; apr_pool_create(&nctx->pool,ctx->pool); return nctx; } static void * ngx_http_mapcache_create_conf(ngx_conf_t *cf) { apr_initialize(); atexit(apr_terminate); apr_pool_initialize(); apr_pool_create(&process_pool,NULL); mapcache_context *ctx = apr_pcalloc(process_pool, sizeof(mapcache_ngx_context)); ctx->pool = process_pool; ctx->connection_pool = NULL; mapcache_context_init(ctx); ctx->log = ngx_mapcache_context_log; ctx->clone = ngx_mapcache_context_clone; ctx->config = NULL; return ctx; } static void ngx_http_mapcache_write_response(mapcache_context *ctx, ngx_http_request_t *r, mapcache_http_response *response) { if(response->mtime) { time_t if_modified_since; if(r->headers_in.if_modified_since) { if_modified_since = ngx_http_parse_time(r->headers_in.if_modified_since->value.data, r->headers_in.if_modified_since->value.len); if (if_modified_since != NGX_ERROR) { apr_time_t apr_if_m_s; apr_time_ansi_put ( &apr_if_m_s, if_modified_since); if(apr_if_m_smtime) { r->headers_out.status = NGX_HTTP_NOT_MODIFIED; ngx_http_send_header(r); return; } } } char *datestr; datestr = apr_palloc(ctx->pool, APR_RFC822_DATE_LEN); apr_rfc822_date(datestr, response->mtime); apr_table_setn(response->headers,"Last-Modified",datestr); } if(response->headers && !apr_is_empty_table(response->headers)) { const apr_array_header_t *elts = apr_table_elts(response->headers); int i; for(i=0; inelts; i++) { apr_table_entry_t entry = APR_ARRAY_IDX(elts,i,apr_table_entry_t); if(!strcasecmp(entry.key,"Content-Type")) { r->headers_out.content_type.len = strlen(entry.val); r->headers_out.content_type.data = (u_char*)entry.val; } else { ngx_table_elt_t *h; h = ngx_list_push(&r->headers_out.headers); if (h == NULL) { return; } h->key.len = strlen(entry.key) ; h->key.data = (u_char*)entry.key ; h->value.len = strlen(entry.val) ; h->value.data = (u_char*)entry.val ; h->hash = 1; } } } if(response->data) { r->headers_out.content_length_n = response->data->size; } int rc; r->headers_out.status = response->code; rc = ngx_http_send_header(r); if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { return; } if(response->data) { ngx_buf_t *b; ngx_chain_t out; b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t)); if (b == NULL) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Failed to allocate response buffer."); return; } b->pos = ngx_pcalloc(r->pool,response->data->size); memcpy(b->pos,response->data->buf,response->data->size); b->last = b->pos + response->data->size; b->memory = 1; b->last_buf = 1; b->flush = 1; out.buf = b; out.next = NULL; ngx_http_output_filter(r, &out); } } static ngx_http_module_t ngx_http_mapcache_module_ctx = { NULL, /* preconfiguration */ NULL, /* postconfiguration */ NULL, /* create main configuration */ NULL, /* init main configuration */ NULL, /* create server configuration */ NULL, /* merge server configuration */ ngx_http_mapcache_create_conf, /* create location configuration */ NULL /* merge location configuration */ }; static ngx_int_t ngx_mapcache_init_process(ngx_cycle_t *cycle) { apr_initialize(); atexit(apr_terminate); apr_pool_initialize(); apr_pool_create(&process_pool,NULL); return NGX_OK; } static void ngx_mapcache_exit_process(ngx_cycle_t *cycle) { apr_pool_destroy(process_pool); } ngx_module_t ngx_http_mapcache_module = { NGX_MODULE_V1, &ngx_http_mapcache_module_ctx, /* module context */ ngx_http_mapcache_commands, /* module directives */ NGX_HTTP_MODULE, /* module type */ NULL, /* init master */ NULL, /* init module */ ngx_mapcache_init_process,/* init process */ NULL, /* init thread */ NULL, /* exit thread */ ngx_mapcache_exit_process, /* exit process */ ngx_mapcache_exit_process, /* exit master */ NGX_MODULE_V1_PADDING }; static ngx_str_t pathinfo_str = ngx_string("path_info"); static ngx_int_t pathinfo_index; static ngx_str_t urlprefix_str = ngx_string("url_prefix"); static ngx_int_t urlprefix_index; static ngx_int_t ngx_http_mapcache_handler(ngx_http_request_t *r) { int ret = NGX_HTTP_OK; if (!(r->method & (NGX_HTTP_GET))) { return NGX_HTTP_NOT_ALLOWED; } mapcache_ngx_context *ngctx = ngx_http_get_module_loc_conf(r, ngx_http_mapcache_module); mapcache_context *ctx = (mapcache_context*)ngctx; apr_pool_create(&(ctx->pool),process_pool); ngctx->r = r; mapcache_request *request = NULL; mapcache_http_response *http_response; ngx_http_variable_value_t *pathinfovv = ngx_http_get_indexed_variable(r, pathinfo_index); char* pathInfo = apr_pstrndup(ctx->pool, (char*)pathinfovv->data, pathinfovv->len); char *sparams = apr_pstrndup(ctx->pool, (char*)r->args.data, r->args.len); apr_table_t *params = mapcache_http_parse_param_string(ctx, sparams); mapcache_service_dispatch_request(ctx,&request,pathInfo,params,ctx->config); if(GC_HAS_ERROR(ctx) || !request) { ngx_http_mapcache_write_response(ctx,r, mapcache_core_respond_to_error(ctx)); goto cleanup; } http_response = NULL; if(request->type == MAPCACHE_REQUEST_GET_CAPABILITIES) { mapcache_request_get_capabilities *req = (mapcache_request_get_capabilities*)request; ngx_http_variable_value_t *urlprefixvv = ngx_http_get_indexed_variable(r, urlprefix_index); char *url = apr_pstrcat(ctx->pool, "http://", apr_pstrndup(ctx->pool, (char*)r->headers_in.host->value.data, r->headers_in.host->value.len), apr_pstrndup(ctx->pool, (char*)urlprefixvv->data, urlprefixvv->len), "/", NULL ); http_response = mapcache_core_get_capabilities(ctx,request->service,req,url,pathInfo,ctx->config); } else if( request->type == MAPCACHE_REQUEST_GET_TILE) { mapcache_request_get_tile *req_tile = (mapcache_request_get_tile*)request; http_response = mapcache_core_get_tile(ctx,req_tile); } else if( request->type == MAPCACHE_REQUEST_GET_MAP) { mapcache_request_get_map *req_map = (mapcache_request_get_map*)request; http_response = mapcache_core_get_map(ctx,req_map); #ifdef NGINX_RW } else if( request->type == MAPCACHE_REQUEST_PROXY ) { mapcache_request_proxy *req_proxy = (mapcache_request_proxy*)request; http_response = mapcache_core_proxy_request(ctx, req_proxy); } else if( request->type == MAPCACHE_REQUEST_GET_FEATUREINFO) { mapcache_request_get_feature_info *req_fi = (mapcache_request_get_feature_info*)request; http_response = mapcache_core_get_featureinfo(ctx,req_fi); #endif #ifdef DEBUG } else { ctx->set_error(ctx,500,"###BUG### unknown request type"); #endif } if(GC_HAS_ERROR(ctx)) { // ngx_http_mapcache_write_response(ctx,r, mapcache_core_respond_to_error(ctx)); goto cleanup; } #ifdef DEBUG if(!http_response) { ctx->set_error(ctx,500,"###BUG### NULL response"); ngx_http_mapcache_write_response(ctx,r, mapcache_core_respond_to_error(ctx)); goto cleanup; } #endif ngx_http_mapcache_write_response(ctx,r,http_response); cleanup: if(GC_HAS_ERROR(ctx)) ret = ctx->_errcode?ctx->_errcode:500; ctx->clear_errors(ctx); apr_pool_destroy(ctx->pool); return ret; } static char * ngx_http_mapcache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { mapcache_context *ctx = conf; ngx_str_t *value; value = cf->args->elts; char *conffile = (char*)value[1].data; ctx->config = mapcache_configuration_create(ctx->pool); mapcache_configuration_parse(ctx,conffile,ctx->config,1); if(GC_HAS_ERROR(ctx)) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,ctx->get_error_message(ctx)); return NGX_CONF_ERROR; } mapcache_configuration_post_config(ctx, ctx->config); if(GC_HAS_ERROR(ctx)) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,ctx->get_error_message(ctx)); return NGX_CONF_ERROR; } if(mapcache_config_services_enabled(ctx, ctx->config) <= 0) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "no mapcache s configured/enabled, no point in continuing."); return NGX_CONF_ERROR; } mapcache_connection_pool_create(&ctx->connection_pool,ctx->pool); ctx->config->non_blocking = 1; ngx_http_core_loc_conf_t *clcf; clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); clcf->handler = ngx_http_mapcache_handler; pathinfo_index = ngx_http_get_variable_index(cf, &pathinfo_str); if (pathinfo_index == NGX_ERROR) { return NGX_CONF_ERROR; } urlprefix_index = ngx_http_get_variable_index(cf, &urlprefix_str); if (urlprefix_index == NGX_ERROR) { return NGX_CONF_ERROR; } return NGX_CONF_OK; } mapcache-rel-1-6-1/nmake.opt000066400000000000000000000233771316353564100157000ustar00rootroot00000000000000 ######################################################################## # nmake.opt - mapcache ######################################################################## #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Uncomment the following if you are building for 64-bit windows # (x64). You'll need to have PATH, INCLUDE and LIB set up for 64-bit # compiles. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #WIN64=YES #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Check compiler version given in command line # nmake -f makefile.vc MSVC_VER=xxxx # 1310 = 7.1 (2003) 1400 = 8.0 (2005) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ !IFNDEF MSVC_VER #assume msvc 7.1 MSVC_VER=1500 !ENDIF #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # File locations and where to install things # ---------------------------------------------------------------------- # If you are using the MapServer Build Kit, almost everything should be # relative to this directory throughout this option file. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Set the following to point to the directory adjacent to the dependent libs. !IFNDEF MAPCACHE_BASE MAPCACHE_BASE = D:\build\mapserver-buildkit-2008\mapcache-git-master #MAPCACHE_BASE = . !ENDIF #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Optmization, debug, and related compile flags. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ !IF $(MSVC_VER) == 1400 # Optimized, with using MSVCRT. OPTFLAGS = /nologo /Ox /MD $(WARNING_LEVEL) $(DEBUG) /EHsc /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE # Debug with MSVCRT #OPTFLAGS = /nologo /Zi /MD $(WARNING_LEVEL) $(DEBUG) /EHsc /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE #LDFLAGS = /NODEFAULTLIB:msvcrt /NODEFAULTLIB:libcd /DEBUG !ELSE # Optimized, with using MSVCRT. OPTFLAGS = /nologo /Ox /MD $(WARNING_LEVEL) $(DEBUG) /EHsc # Debug with MSVCRT #OPTFLAGS = /nologo /Zi /MDd $(WARNING_LEVEL) $(DEBUG) /EHsc #LDFLAGS = /NODEFAULTLIB:msvcrt /NODEFAULTLIB:libcd /DEBUG !ENDIF # Set the Warning level for the compiler (defaults to W1) WARNING_LEVEL=/W3 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Debugging Options # ---------------------------------------------------------------------- #NEED_NONBLOCKING_STDERR=-DNEED_NONBLOCKING_STDERR ENABLE_STDERR_DEBUG=-DENABLE_STDERR_DEBUG # Set the linker debug option LDEBUG=/debug # DEBUG Build flags # Set the DEBUG flag if you wish to make a debug build DEBUG=/DDEBUG #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # APR: Apache Protable Runtime library #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ APR_DIR = $(MAPCACHE_BASE)\..\apr-1.4.5 APR_ICONV_DIR = $(MAPCACHE_BASE)\..\apr-iconv-1.2.1 APR_UTIL_DIR = $(MAPCACHE_BASE)\..\apr-util-1.4.1 # APACHE HTTPD (Only required for apache module) APACHE_DIR=$(MAPCACHE_BASE)\..\httpd-2.2.22 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # PNG support #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PNG_DIR=$(MAPCACHE_BASE)\..\libpng-1.5.10 ZLIB_DIR=$(MAPCACHE_BASE)\..\zlib-1.2.7 ZLIB_INC=-I$(ZLIB_DIR) CURL=-DUSE_CURL CURL_DIR=$(MAPCACHE_BASE)\..\curl-7.25.0 WINSOCK_LIB ="C:\Program Files\Microsoft SDKs\Windows\v6.1\Lib\WS2_32.Lib" JPEG_DIR=$(MAPCACHE_BASE)\..\jpeg-8d JPEG_INC = -I$(JPEG_DIR) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # SQLite3 Support # ---------------------------------------------------------------------- # Uncomment, and update accordingly. SQLITE_DEF=-DUSE_SQLITE SQLITE_DIR=$(MAPCACHE_BASE)\..\libspatialite-amalgamation-2.3.1 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # TIFF Support # ---------------------------------------------------------------------- # Uncomment, and update accordingly. TIFF_DEF=-DUSE_TIFF -DUSE_TIFF_WRITE TIFF_DIR=$(MAPCACHE_BASE)\..\libtiff-4.0.1 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # GEOTIFF Support # ---------------------------------------------------------------------- # Uncomment, and update accordingly. GEOTIFF_DEF=-DUSE_GEOTIFF GEOTIFF_DIR=$(MAPCACHE_BASE)\..\libgeotiff-svn-05232012 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # FastCGI Support # ---------------------------------------------------------------------- # Uncomment, and update accordingly. FCGI_DEF=-DUSE_FASTCGI FCGI_DIR=$(MAPCACHE_BASE)\..\fcgi-2.4.0 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # GDAL/OGR Support # ---------------------------------------------------------------------- # Uncomment, and update accordingly. #GDAL_DEF=-DUSE_GDAL #GDAL_DIR=$(MAPCACHE_BASE)\..\gdal-trunk #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # GEOS Support # ---------------------------------------------------------------------- # Uncomment, and update accordingly. #GEOS_DEF=-DUSE_GEOS #GEOS_DIR=$(MAPCACHE_BASE)\..\geos-3.3.7 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Berkeley DB Support # ---------------------------------------------------------------------- # Uncomment, and update accordingly. BDB_DEF=-DUSE_BDB BDB_DIR=$(MAPCACHE_BASE)\..\berkeley-db-5.3.21 ######################################################################## # Section II: Mapserver Rendering Configuration ######################################################################## ######################################################################## # Section VI: Support Libraries. ######################################################################## #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # REGEX Libary # ---------------------------------------------------------------------- # VC++ does not include the REGEX library... so we must provide our one. # The following definitions will try to build GNU regex-0.12 located in the # regex-0.12 sub-directory. # If it was not included in the source distribution, then you can get it from: # ftp://ftp.gnu.org/pub/gnu/regex/regex-0.12.tar.gz # Provide the full path to the REGEX project directory # You do not need this library if you are compiling for PHP mapscript. # In that case the PHP regex library will be used instead #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ REGEX_DIR=$(MAPCACHE_BASE)\..\regex-0.12 # Set the png support libaries !IFDEF PNG_DIR !IFNDEF PNG_LIB PNG_LIB=$(PNG_DIR)\projects\visualc71\Win32_LIB_Release\libpng.lib $(ZLIB_DIR)/contrib/vstudio/vc9/x86/ZlibDllRelease/zlibwapi.lib !ENDIF PNG_INC=-I$(PNG_DIR) !ENDIF CURL_INC = -I$(CURL_DIR)/include CURL_LIB = $(CURL_DIR)/lib/libcurl_imp.lib !IFDEF JPEG_DIR JPEG_LIB=$(JPEG_DIR)/libjpeg.lib !ENDIF !IFDEF SQLITE_DIR SQLITE_LIB=$(SQLITE_DIR)\lib\spatialite_i.lib SQLITE_INC=-I$(SQLITE_DIR)\include !ENDIF !IFDEF TIFF_DIR TIFF_LIB=$(TIFF_DIR)\libtiff\libtiff_i.lib TIFF_INC=-I$(TIFF_DIR)\libtiff !ENDIF !IFDEF GEOTIFF_DIR GEOTIFF_LIB=$(GEOTIFF_DIR)\geotiff_i.lib GEOTIFF_INC=-I$(GEOTIFF_DIR) -I$(GEOTIFF_DIR)\libxtiff !ENDIF FCGI_LIB=$(FCGI_DIR)\libfcgi\Release\libfcgi.lib FCGI_INC=-I$(FCGI_DIR)\include !IFDEF GDAL_DIR GDAL_INC = -I$(GDAL_DIR)/gcore -I$(GDAL_DIR)/alg -I$(GDAL_DIR)/ogr -I$(GDAL_DIR)/port GDAL_LIB = $(GDAL_DIR)/gdal_i.lib !ENDIF !IFDEF GEOS_DIR GEOS_LIB=$(GEOS_DIR)/src/geos_c_i.lib GEOS_INC=-I$(GEOS_DIR)/include -I$(GEOS_DIR)/capi !ENDIF !IFDEF BDB_DIR BDB_LIB=$(BDB_DIR)/build_windows/Win32/Release/libdb53.lib BDB_INC=-I$(BDB_DIR)/build_windows !ENDIF ######################################################################## # Section VII: Variable Setup ######################################################################## # Should not need to be updated. ######################################################################## MAPCACHE_LIB = mapcache.lib MAPCACHE_INC= -I$(MAPCACHE_BASE)\include #APR APR_INC=-I$(APR_DIR)\include -I$(APR_ICONV_DIR)\include -I$(APR_UTIL_DIR)\include #APR_LIB=$(APR_DIR)/lib/apr-1.lib $(APR_DIR)/lib/aprutil-1.lib $(APR_DIR)/lib/libapr-1.lib $(APR_DIR)/lib/libaprutil-1.lib #APR_LIB=$(APR_DIR)/LibR/apr-1.lib $(APR_DIR)/Release/libapr-1.lib $(APR_ICONV_DIR)/LibR/apriconv-1.lib $(APR_UTIL_DIR)/LibR/aprutil-1.lib $(APR_UTIL_DIR)/Release/libaprutil-1.lib APR_LIB=$(APR_DIR)/Release/libapr-1.lib $(APR_ICONV_DIR)/Release/libapriconv-1.lib $(APR_UTIL_DIR)/Release/libaprutil-1.lib #APACHE APACHE_INC=-I$(APACHE_DIR)\include APACHE_LIB=$(APACHE_DIR)\Release\libhttpd.lib # Setup REGEX object and includes REGEX_OBJ=$(REGEX_DIR)\regex.obj REGEX_INC=-I$(REGEX_DIR) # REGEX needs some special flags... here they are for VC++ 6.0 REGEX_OPT=-DHAVE_STRING_H -DREGEX_MALLOC ####################################################################### # Section IX: Collect compiler flags ######################################################################## # Should not need to be updated. ######################################################################## !IFNDEF EXTERNAL_LIBS EXTERNAL_LIBS= $(PNG_LIB) $(CURL_LIB) $(JPEG_LIB) $(APR_LIB) $(APACHE_LIB) $(FRIBIDI_LIB) $(SQLITE_LIB) $(TIFF_LIB) $(GEOTIFF_LIB) $(FCGI_LIB) $(GDAL_LIB) $(GEOS_LIB) $(BDB_LIB) !ENDIF LIBS=$(MAPCACHE_LIB) $(EXTERNAL_LIBS) !IFNDEF INCLUDES INCLUDES=$(MAPCACHE_INC) $(APR_INC) $(APACHE_INC) $(REGEX_INC) $(PNG_INC) $(ZLIB_INC) $(CURL_INC) $(JPEG_INC) $(SQLITE_INC) $(TIFF_INC) $(GEOTIFF_INC) $(FCGI_INC) $(GDAL_INC) $(GEOS_INC) $(BDB_INC) !ENDIF MAPCACHE_DEFS =$(REGEX_OPT) $(SQLITE_DEF) $(TIFF_DEF) $(GEOTIFF_DEF) $(FCGI_DEF) $(GDAL_DEF) $(GEOS_DEF) $(BDB_DEF) !IFDEF WIN64 MAPCACHE_CFLAGS=$(INCLUDES) $(MAPCACHE_DEFS) -DWIN32 -D_WIN32 -DUSE_GENERIC_MS_NINT !ELSE MAPCACHE_CFLAGS=$(INCLUDES) $(MAPCACHE_DEFS) -DWIN32 -D_WIN32 !ENDIF mapcache-rel-1-6-1/packaging/000077500000000000000000000000001316353564100157715ustar00rootroot00000000000000mapcache-rel-1-6-1/packaging/centos/000077500000000000000000000000001316353564100172645ustar00rootroot00000000000000mapcache-rel-1-6-1/packaging/centos/mapcache.spec000066400000000000000000000025721316353564100217070ustar00rootroot00000000000000Name: mapcache Version: 1.1dev Release: 1%{?dist} Summary: Caching server for WMS layers Group: Development/Tools License: MIT URL: http://mapserver.org/trunk/en/mapcache/ Source: mapcache-%{version}.tar.gz #Obtain source using git archive available at https://github.com/mapserver/mapcache: #git archive --format=tar --prefix=mapcache-1.1dev/ master | gzip > mapcache-1.1dev.tar.gz #or adjust archive available at: https://github.com/mapserver/mapcache/archive/master.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Requires: webserver BuildRequires: httpd-devel fcgi-devel cmake libcurl-devel BuildRequires: geos-devel proj-devel gdal-devel libjpeg-turbo-devel BuildRequires: libpng-devel libtiff-devel pixman-devel sqlite-devel %description MapCache is a server that implements tile caching to speed up access to WMS layers. The primary objectives are to be fast and easily deployable, while offering the essential features (and more!) expected from a tile caching solution. %prep %setup -q -n %{name}-%{version} %build %cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr . make %{?_smp_mflags} %install rm -rf %{buildroot} make DESTDIR=%{buildroot} \ install %clean rm -rf %{buildroot} %files %defattr(-,root,root) %doc INSTALL README* LICENSE %{_bindir}/* %{_libdir}/* %changelog mapcache-rel-1-6-1/release-notes.sh000077500000000000000000000005131316353564100171510ustar00rootroot00000000000000#!/bin/bash commitdiff=$1 if test -z $commitdiff; then echo "usage: $0 startcommit..endcommit" exit fi git --no-pager log --no-merges --pretty=format:'%s (%an) : `%h `__' $commitdiff | gsed 's!#\([0-9]\+\)! `#\1 `__ !g' mapcache-rel-1-6-1/release.sh000077500000000000000000000040531316353564100160260ustar00rootroot00000000000000#!/bin/bash ms_version=$1 echo "release steps for mapcache version $ms_version (mapcache-$ms_version.tar.gz)" echo "" ms_version_suffix=`echo $ms_version | cut -s -d- -f2` if [ -z $ms_version_suffix ]; then ms_version_num=$ms_version else ms_version_num=`echo $ms_version | cut -s -d- -f1` fi ms_version_major=`echo $ms_version_num | cut -d. -f1` ms_version_minor=`echo $ms_version_num | cut -d. -f2` ms_version_revision=`echo $ms_version_num | cut -d. -f3` tagname=rel-$ms_version_major-$ms_version_minor-$ms_version_revision if [ ! -z $ms_version_suffix ]; then tagname=$tagname-$ms_version_suffix fi echo "#" echo "# make sure:" echo "# - you are on branch-$ms_version_major-$ms_version_minor" echo "# - you have edited HISTORY.TXT with changes related to this release" echo "#" echo "" echo "sed -i '/set (MAPCACHE_VERSION_MAJOR/c\set (MAPCACHE_VERSION_MAJOR $ms_version_major)' CMakeLists.txt" echo "sed -i '/set (MAPCACHE_VERSION_MINOR/c\set (MAPCACHE_VERSION_MINOR $ms_version_minor)' CMakeLists.txt" echo "sed -i '/set (MAPCACHE_VERSION_REVISION/c\set (MAPCACHE_VERSION_REVISION $ms_version_revision)' CMakeLists.txt" if [ ! -z $ms_version_suffix ]; then echo "sed -i '/set (MAPCACHE_VERSION_SUFFIX/c\set (MAPCACHE_VERSION_SUFFIX \"-$ms_version_suffix\")' CMakeLists.txt" else echo "sed -i '/set (MAPCACHE_VERSION_SUFFIX/c\set (MAPCACHE_VERSION_SUFFIX \"\")' CMakeLists.txt" fi echo "git add CMakeLists.txt" echo "git commit -m \"update for $ms_version release\"" echo "git tag -a $tagname -m \"Create $ms_version tag\"" echo "git push origin branch-$ms_version_major-$ms_version_minor --tags" echo "git archive --format=tar.gz --prefix=mapcache-$ms_version/ $tagname >/tmp/mapcache-$ms_version.tar.gz" echo "scp /tmp/mapcache-$ms_version.tar.gz download.osgeo.org:/osgeo/download/mapserver" echo "" echo "#" echo "#optionally update doc site, these commands need tweaking before being ran" echo "#" echo "/path/to/docs/scripts/changelog.sh rel-previous-tag..$tagname >> /path/to/docs/en/development/changelog/changelog-$ms_version_major-$ms_version_minor.txt" mapcache-rel-1-6-1/scripts/000077500000000000000000000000001316353564100155345ustar00rootroot00000000000000mapcache-rel-1-6-1/scripts/vagrant/000077500000000000000000000000001316353564100171765ustar00rootroot00000000000000mapcache-rel-1-6-1/scripts/vagrant/mapcache.sh000077500000000000000000000002661316353564100213020ustar00rootroot00000000000000#!/bin/sh NUMTHREADS=2 # we have 2 cpus configured export NUMTHREADS cd /vagrant mkdir build_vagrant cd build_vagrant cmake -DWITH_MEMCACHE=1 .. make -j $NUMTHREADS make install mapcache-rel-1-6-1/scripts/vagrant/packages.sh000077500000000000000000000011501316353564100213100ustar00rootroot00000000000000#!/bin/sh sed -i 's#deb http://us.archive.ubuntu.com/ubuntu/#deb mirror://mirrors.ubuntu.com/mirrors.txt#' /etc/apt/sources.list export DEBIAN_FRONTEND=noninteractive apt-get update apt-get install -y python-software-properties add-apt-repository -y ppa:ubuntugis/ubuntugis-unstable apt-get update apt-get -y upgrade # install packages we need apt-get install -q -y build-essential pkg-config cmake libgeos-dev rake vim \ bison flex libgdal1-dev libproj-dev libpng12-dev libjpeg-dev libfcgi-dev \ libcurl4-gnutls-dev apache2-prefork-dev libtiff4-dev libpixman-1-dev \ libsqlite3-dev libmemcached-dev mapcache-rel-1-6-1/scripts/vagrant/virtualbox-fix.sh000077500000000000000000000002321316353564100225150ustar00rootroot00000000000000#!/bin/sh if [ ! -e "/usr/lib/VBoxGuestAdditions" ]; then ln -s /opt/VBoxGuestAdditions-4.3.10/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions fi mapcache-rel-1-6-1/static/000077500000000000000000000000001316353564100153345ustar00rootroot00000000000000mapcache-rel-1-6-1/static/bench_cached.png000066400000000000000000000556471316353564100204310ustar00rootroot00000000000000‰PNG  IHDR€§¨îqgsRGB®Îé pHYs  šœtIMEÚ  ’ʺ›tEXtCommentCreated with GIMPW IDATxÚìÝy\TåþðÏ0# .‚ ‹b,"™ † *¨¸äŽ–VšËÕPÔT®zͬkÞ{³ÅLSsé§¢’-"¸ç’"®€$:‚šš²+² œß‡FB aø¼_½zÍ<œ9sæ;3~æyÎsΑ‚"""ª[:,˜ˆˆˆLDDD `"""01€‰ˆˆÀDDDÄ&""b˜ˆˆˆLDDÄ&"""0˜ˆˆˆÀDDD `"""b1€‰ˆˆˆLÔÐ8;;oܸ±Ú744<{ölå˸»»¯Y³æùÛDÄ&"Mrss[·núî°aÃY–ªÖHãd,Q“²lÙ2íÚà‚‚===¾qÄ0UH¥R­X±ÂÂÂBWW×ÖÖöàÁƒvìØÑ­[7¹\nllìíí——WÉÂrrr¦L™¢P(,--Õ /_¾¼C‡r¹ÜÅÅ%,,LlÏÌÌœ0a‚¾¾~çÎ8ðü&Mž<ùâÅ‹‹-’H$mÛ¶EÅÃÎ=…ZPPµµµx{×®]‰ääÉ“  ÅåË—8;;¯^½ú7Þ000èڵ믿þúÛo¿õêÕ«Y³fC† ÉÌÌîïïocc#“ÉŒß|óÍç7ÆÙÙyÅŠ#FŒhÕªÕ—_~ù‚/_=ß±cÇ€€õÚ /\¸PÉk|~{ž¯‘æ D¤!sæÌ±´´}ÿþýsçÎuïÞ}éÒ¥•,ìääÔ¦M›mÛ¶ÅÅÅ-_¾ÜÐÐðÉ“'‚ ÌŸ?¿OŸ>¡¡¡÷îÝ[½zµ‘‘Ñ£GAxýõ×»wï}õêUWWW™L\f«\]]¿úê+õÝ|ñÅÏß®è)ÔRSSÄÇÇ ‚ðüÃØØxÅŠ‚ „††êëëççç«·ûöí7nÜxóÍ7ííí=<<Μ9ó믿ÚÙÙ‰¯=))I&“íÞ½;!!A©TîØ±ãùJ:99µjÕêìÙ³‚ dggWòòœœ~ûí·˜˜˜þýû«_¾••Õ¾}ûÔkS(çÏŸ¯è5V´=eêF¤q `"ÍHOO—ÉdÇŽ«d™#GŽØØØT²°““Ó¬Y³ÄÛ*•ÊÐÐ0888##CWW7..N½X¯^½vîÜùðáC .ˆ¡¡¡ªÀ=E™UÙÛÛïÝ»W›U«Võïß_„/¾øÂÝÝýùíW*•<(Þ]»v­‹‹‹ 1112™¬Lº?_oooñvå/?,,LlŒˆˆP¿ür¸¢õT´= `ªmÜL¤J¥R¥R¹»»—i¿xñâ¿þõ¯¨¨¨ÜÜ\-Z´¨daêRR©ÔØØ833S©TÚÙÙ•^,11166Võ°­T*­öÆ—ûeëׯßùó瘒’âããóé§Ÿœ?¾_¿~Ïo›6mÊ܇ \]]mllFŒáéé9aƒç7ÉÞÞ¾òm‹_µØÒ£G™LV×ø‚ÛCÄ}ÀDÚ$77wäÈ‘C‡ýã?Š‹‹ƒƒƒ‹ŠŠþæ;©£Sf'Qqq1€¬¬¬Ò¿—/_..¬]©TZí®ä)Êð¹sçÎ;×·o_ccã—^z),,ìâÅ‹¥¸Ìö—¾+‚ØræÌ™Ÿ~ú©C‡ÿùÏzôè‘““óü&©Óô·­4‰DR¦†•¬ç·‡ˆLÔ@988Èd²Ò·nÝÊÈÈX²d‰‰‰‰D"‰‰‰©dáÊ×|âĉçûˆ‚ ÄÅÅ©Ÿ«  àù‡K¥R1ªñϰR©ýñãÇòóó£££ûõë'.`jjjooVÕv~2ˆˆ¨VÉ´b+:äååUTTdmm}âÄ ]]]ýû÷wssëØ±ã­[·Þÿý±cdž„„¤¥¥™ššªkff–ššZÕv~2ˆˆˆ èèè”””õë×1"""¢yóæ^^^â_­­­{÷î}õêU“2•H$害ªí/òW""jjª½'W;¸yóæŽŽŽŽŽŽýúõ366>zôè¤I“J/гgOñññvvvR©´t699ÙÃÃÃØØ¸JíµQëB"‘ð%ð%ð-àKàKÐÔK¨öcµì8ࢢ¢r§(GFFèСƒ\.ïÞ½ûùóçÅöÔÔÔØØX—ª¶ó7Õzß¹›;wî‘#G"""Ž;6dÈccã´´4A¼½½>|åÊ•½{÷ZYY¹¹¹‰ËïÚµK¡P)•ÊQ£F9::ªTªj´—K+*V9¾¾n?__BCx Z0ýäÉooïäää-Z¸¹¹…„„´nÝ@ZZÚÌ™3=zdll,•J«ÑNDDT‹Ã×Ú>þ^÷ÃýÜéR¿¢ÝãÛGgu‡» ø.pûùø´ô%ð\ФMŠPä o¼‚/ñe;´Š¡_á«XIJ2D¤uÀ¤M¶`K34CoœÆé$øÀ'±žð´†õ|Ì?†c¹Èe•ˆH;zÏ‚®Z½$¬X½I@BôAHt)ó§ÄÇñã8ˆÞè= Æc¸=ìY4"j°¡À0i…Xè ïçÓÀËxy –¨»Å7pƒÝb¢ÒÜÝÝ׬YóüíÚãìì¼qãFVžLZï0_ÅÕðAå‹Âp Ælöxp-aɽÅÔ4¹¹¹­[·N}wذaŽŽŽ,Kƒ"c ¨áËFö{xïÿðÍÐìÅõ2^{ÆÙÈ>ÓGqt-ÖêAï5¼6õz5QU-[¶ŒE`˜¨ÊVbe?ô„AÕ{xénñ`·˜½É“'_¼xqÑ¢E‰¤mÛ¶¨xØY¥R-_¾\< ‹‹‹úZp*•jÅŠººº¶¶¶°cÇŽnݺÉårcccoooõ¥ÙË]@NNΔ)S …¥¥e```åÏÈ&jp¢åÿ/ñ¥FÖVfo±JOx¾„—¸·˜WWׯ¾úJ„äääJ–ôõõ={öl``àÍ›7Ç7|øð´´4ï½÷Þž={¶mÛvçέ[·J¥ëÖ­»}ûöÂÃÃW®\)®¤Ü…|ùå—ýû÷ŠŠš2eÊÔ©S³²²*yƦH &vâ4í¢T¯ ¯n¶×ê³\®~.|>PØBh1D²VX{C¸Áâ“VS°hÀ€_|ñE™ÛºººqqqêÅzõêµsçÎôôt™LvìØ±JÖäÈA*ZØÉÉiÖ¬Y%_d•ÊÐÐ088¸¢gä©(‰œÍجýé˜^«ÏRzoñ/øEÜ[,‡|8†so15bJ¥²°°ÐÎήtcbb¢R©T©Tîîîe–¿xñâ¿þõ¯¨¨¨ÜÜ\-Z´WRîÂÔÓ¾¤R©±±qfffEÏXþöÕ×å_ëêXS05\ HX…U!‘ Ž¾‡†0‹±c1[ü%¾|oòØbj”Š‹‹dee– ÚçÎÍÍ9r¤¯¯ïŒCBBFŽYùúuttÊ ¸VôŒõ„õ…û€©áZ€³1»Üë@é½Ås0GÜ[lî-&­ •Jÿö2™ìĉ嶇„„”n¼uëVFFÆ’%KLLL$ILLL% Wõ›&05P‡q81˱¼Þ·Dì‹oàA 9‰š´‚……Å¥K—’““ÓÓÓ+ZÆÈÈÈÇÇgÞ¼yAAAñññ‘‘‘+V¬P*•FFF³fÍòöö>~üx||ü™3gNž€VhUÑ/ñšš¿ö<ä=ÅÓj?\U²j²È(]ó"½ŠW_Çë¯á5üöÕ½Gxt'žà‰–™È,F±ø9)“ å6й¨þÁ*æ¢ø9‘Fñƒýâµ Œp2ãáø1>f)*’‹Ü|ä—û'B2*z ø¯Õ †SiâP[Í·\ú5™Ó.ƒ¬9š×dÊüÈÈGþE\ @@(Bcðëx}FŸ±Ú–ˆÄ "0‘.p±†u ´Ð-¤Ša)…ôùFu.–nÔêP`œ0€ŠÃ8¼‹Ão íÐ#jÜÒ‘~÷aß%\ˆ0aFÕ0ìggçiӦ͛7¯~7£÷¤Þ¦³MÓÜÓâ7#½à5CÁ—½&¡ÀqPƒìù˜¿›™¾TÇZ£õtL?†cwqw ÆìÅ^ XŒÅXø‹žT†››Ûºuë^p±8Ä­Æjg8_ßq]ÕYõoü; I~ðÑü²3€©Aø7þ=b KAõÅFS1õŽÜýñ¿û,`1£wcw%cûT®«¸zÿ÷?Ÿòù` NBÒ—ø2à ã˜Å±!¢ ]Ö‡L E¢¾Ãwk°†¥ † ZMÁ”ƒ8ø&bb‚¬`5#ýà÷kã+ºÐ½³³óûï¿?tèP ‹Î;«/t_Ñò*•jÅŠººº¶¶¶êåsrr¦L™¢P(,--Õ /_¾¼C‡r¹ÜÅÅ%,,ìù ó÷÷·±±‘ÉdÆÆÆo¾ù&€É“'_¼xqÑ¢E‰¤mÛ¶Ùc¯Õ^‹U‹m`ãšêúàу¤‘Iñ:ñ?µýi r¤>CVEÛÙä𪙼p½_ñ×YpÞ)ìd)¨Áz"<Ù+ìõ¼Z-† ÷ Û 4¸~??¿Ó§Oß¿ÿܹsÝ»w_ºt©ú’ºÍ›7 áØ±cÍš5‹­dù9sæXZZ;vìþýûâ9™Å•´iÓfÛ¶mqqqË—/744|òä‰ óçÏïÓ§Ohhè½{÷V¯^mddôèÑ_^TRR’L&Û½{wBB‚R©Ü±cG¹WÞ¹kçº_×ýãÉ?Ìžš5»Ó¬Ï/}"…ÈÊ/H\îv6ÁP`œ0€ëÙ×ÂׄÅB1KA _¶ýƒðÃaBK¡åaȷ·…‡š} õ…îÅìœ1c†úOÆ Sgíó˧§§Ëd²cÇŽ•YÀÉÉiÖ¬Y%¿wU*CCÃàààŒŒ ]]ݸ¸8õb½zõÚ¹ó/¿ƒcbbd2Y™TV'k¡PxJ85[˜ÝVhÛCèñá?JAYzã+ àŠ¶³ †‡ ©>‰WüÝŠ­æ´Ô¸) ˜ˆ‰û°/‰31óN½„—<á¹ ÛâaµW{ñâE777…B!‘HFŽ™’’¢þ“úšö^~ùeñÂAå.¯T*U*•»»ûóëW¯D*•gff*•ÊÂÂB;;;ÉŸ®\¹’˜˜XúQ®®®666S¦LÙ½{wnn.€|ä?îûø{Ïïۡ݇øÐÖ_ÿúµ›ÁjÅj‰C™/W%ÛY†’zùû€©I˜ù>ðáu HëÀàu¼þ#~LBÒlÌF°-laÐlIAJ•V%^è~èСüñGqqqpppQQ‘ú¯*•J}»°°ðo—/ÿz2{‹‹‹dee•î-_¾¼Ì£Îœ9óÓO?uèÐaÕšU6Ël&ª&¶C»„·ÌšG!ê2.ÏÍûîàw«´1UØC ¡^þcSãw‡¯ãzC¸â/QµéC<Æï‘8óÏã|tñ€Ç&lJFò‹¬¡¢ Ý‹JÏ spp¨hyñZ÷!!!/ò¤âÂ'Nœ¨|±lìÔÁ©·?½ýð·‡I£’:Üî‹ØW¼âåfóÊ7^*•–{€l•¶³qcSýÈFö<ÌÛ‚-•œX‘H»’x,Æ~‡ï‘¸‹Bꇰ‘XÉ+ºÐ½è—_~Ù¾}{BBÂgŸ}1}úôŠ–722š5k–··÷ñãÇãããÅÉM=©‘‘‘ϼyó‚‚‚âãã###W¬X!ŽoHCÚNìì—ÙÏ,ßìÿ²þ¯_F¿ÿíýŸÎpyzóLajaaqéÒ¥äääôôôJ6¾ôbežúÅ·³‘㬠Nª¾‚ï;Â;¬5bO…§‡…ÃS…©­…Ön‚Û:aÝáA¹KîÝ»×ÜÜÜÂÂÂÕÕuÓ¦M …B=jÕªU£FjÖ¬YÇŽ+_¾  `Ù²eíÚµ“Éd¶¶¶‡W²aÃõsYYY‰²V­Zeee%“ÉÌÌÌ&Mšó0f³°y°0¸¥Ðòuáõµ kŒвeK©TÚ¥K—~øA\Cttt×®]¥R©™™Y%Sf±Ò³ ËÝÎ& <±bÕðT”…¨av×M`ÂjP£W€‚_ðKâ =ì'`ÂxŒ·„åß>°nÎ"y÷ˆÀë¸þ^ñC1´!œf¹Ñ‡‚Œå£:V„¢wñîgøŒéKM„ô^Ãk¯áµBžÆé|‚O^ÂKbwDÇzÙªÛ¸½û÷cÿ=܃1ïãýA¤=¾_u†Luí|£€b*¦²ÔÔèBw† ð-Ørgð*^툎¯ãõ ˜Ð ê`®áZ ÷cÿ#<‡qŸâÓ …”ïNÝÓ‚IX_}õU—.]är¹B¡4hPtt´úOkÖ¬177×××:tè½{÷4ÞNxøK$ƒl†lö$$}‚O~Çï½ÑÛΟá³ßñ»z±ˆˆM?ÿŠ_—c¹=ìGaT&27có<؈1é[oþ.n??¿ü1<<üĉžžž&&&¹¹¹‚ ìÚµK¡P*•ÊQ£F½üòË*•Jƒíœ„UÆ ãþ-ü›u *C%¨N §çsÄK}"|rS¸YÃu E…‹¾‚oG¡£`÷¾ð~„ÁR7œIXZ'ׯ_ ž>ÍÉÉiñâÅb{JJŠT*=uê”ÛÀwP8h'Ø=ž²D•$ñYáì\an;¡Ý+Â+ÿþ+ÄV#Ëç sÛ í» Ý>>ŽbXØÀÚtpffæŽ;lmm;uꔟŸݯ_?ñO¦¦¦öööaaašjçЈƩ¯øË‰*!…tlÄÆxÄoÀ†T¤ nè¶ «nàF%,@ÁÏøyfµC»eXf‹„ü†ß>ÂGŽp¬ûâìì¼qãF¾¡•î‰Ð‡òòò***²¶¶>qâ„®®nbbbQQ‘©©©z33³ÔÔÔ´´4´ó“¡qá#xxÀƒ¥ z:Ðé‡~ýÐoÖ]Æå Á–h9&`‚:Sów'öcÿ1늮^ðú¾È1NÄ~!ÑÑÑ)))ëׯ1bDDDÄóËH$åOêÑT{å ðààÊE"r/ö^Ã5–‚¨Iì WW¸®ÅÚP„ `F( p…k&2Oâd/ôñ_à‹¶hËrÕž¿M‡ª¿³Ú yóæŽŽŽƒ HLLå¿D5 Hú Ï—øòîíÄÎ6h3ÃÇï§pj6f‹é›žžîå奯¯ß¹sç   CCógÏP©TË—/ïСƒ\.wqqQïhËÉÉ™9s¦‘‘‘B¡7nœú‚H*•jÅŠººº¶¶¶°cÇŽnݺÉårcccooï¼¼¼JW>eÊ…Baii¨^¸Ü-iø4þ¿– º¨¨H¼Ô†\.ïÞ½ûùóçÅöÔÔÔØØXMµó«®A›°É†<ð—HƒIì—OðÉtL7†qé?ýãÿHLL ?tèÐÆóóóÅv__ß³gÏÞ¼ysܸqÇOKK0kÖ¬K—.?~<<<<33sôèÑb¨¼÷Þ{{öìÙ¶mÛ;w¶nÝj``@*•®[·îöíÛ_¹r¥¸òrðå—_öïß?**jÊ”)S§NÍÊʪdKš¢†?ÇlîܹGމˆˆ8vìØ!CŒÓÒÒÔ‡‰‡9::–>¬¨æíœ­„&‚IU§qQ5¤¦¦J$’ˆˆ’c¢¢¢gddèêêŠÇˆzõêµsç·êèèœ>}ºäÛúàD"¹téRzzºL&;vìX%ÏuäÈA*ZØÉÉiÖ¬Y%³U*CCÃJ¶¤i΂ւ}ÀOž<ñööNNNnÑ¢…››[HHHëÖ­¼óÎ;)))sçÎMKKëß¿ÿáÇ¥R©ÛI#ÞÃ{s1—Wü%ªqqq‰¤GâÝW^yEWW€R©,,,´³ûË×0111..®¸¸¸OŸ>b‹xM¥RY\\¬R©ÜÝÝˬÿâÅ‹ÿú׿¢¢¢rss´hÑB\y¹ pt,™)&•J333+Ú’ò;úõt¶ž:Û©¨¼{÷îŠþ´dÉ’%K–Ô^;ÕÐATBù=¾g)ˆêQqq1€¬¬,CCÃ2Šž[”››;räH__߇„„Œ9²ò‡èèè”p­hKê7ë ¯Lµ%Ùïá=^ñ—¨ÎØÙÙ©GžüöÛo………d2Ù‰'ž_^GG'44T¼ÿàÁƒ®]»ŠË‡„„”^øÖ­[K–,111‘H$111b{¹ W¤¢-išÀT[>ć1Ðî,QÝhӦ͘1cæÎ{íÚ5¥RùÏþS&“I$###ŸyóæÅÇÇGFF®X±B©Tš˜˜Lœ8qþüùW®\¹~ýúÔ©S{öìéââbdd4kÖ,ooïãÇÇÇÇŸ9sæäÉ“–––r¹üÈ‘#nß¾½víZñIË]¸¢-¬hKšèÆi u¶¿½IùUøÕL0{(rsñô)òò—‡§Oa`¹††ÐÕEóæÉТ¤R´j‰FFHЪ¤R´h™ Í›—d¹\ƒ¿d¹B=½’U˜Ü Çð·ñödL®ÆcÓÓñí·Ø¸/½„ 0z´&wå>}ŠK—JÂ8.nn%aüç‰â‰¤$ÄÆ–Ä­x#9/½;;ØÙÁÞ¾äÆßþ6ÍÉAA²³QXˆ¬,¨TÈÌDq122 xüÅÅÈÌDQžSùÒÓŸMŠÅxðææ%qkk {{técc–Š¡ÀfkÚ@ œƒ9¯ãõЏpë×#83f`î\­9B75µ¤[|êttJƨ B›6MúíV©šŠ§OѲeÉ䚦£¨wï"6ö/ó¤ Kz´bïÖÞ;s²=CÌ®}±ˆˆ÷pOeÿÉ)(À?býzdgã½÷0u* ­}™±%a|ö,¬­KƨÝÜgüøÂ·š}‚OÊô·nÅæÍxùe,\ˆaÃJf 6Žþ_xxI·8:..%cÔ=zhÍY0 þ®IIHMEBRS‘”„ädèê¢}{˜š¢}{˜™¡m[´kSStèSS˜™•}732J’øñã’ÃWJß翈7òòž-œ‘Qr¸KFFÙ´nÕªäðñ†¾>Z¶|vC<ãD™5ìqã?žMC7'ç/Ó£ÄÛÏOˆ%†˜\òg Ë+¸ÒÅ–ë×ñå—8po¼ Ð¥Kc~ùÙÙ.駤`àÀ’aêNêyÃÒÓ‘œü¬ÏZ¦#›™Y’¦Ï‡k»vhÛ¶œ6j›x°Jff97rrðôiɼ<-¹Q\Œ- P@_-ZÀÐÍš•ÜÐ×GóæÏn4oŽfÍ —##ãÙ<©›7ajú,nÅ:ð+N `pCµ »~ÂOGqTÝ;45ÅìÙX¼­[7­R$$<; ¦¡aɵ‡G­ÔáéÓrµtGV¡@Û¶03+¿#Û(¯+@’¼¼¿ÜÈÊÂÓ§%7òò]r#3ffÏæIÙÙ5­ÙÄfk=W¸þ ÿÑâÝŸ~ÂæÍnÒ5\»VÆ/ÂÞ¾dŒºoß* “¦¦>~>ksržõYËíÈr˜”ˆÌZ7fWqu$FÞÁJfìÓË–aÌÖ¦DAÁ³³`*•pu-£~é%¤¤”äk¹Y#£gÂÏwd›Úè˜À៶hû>bÊÄÅñмå{ü¸d‡ñ©S¸}:ý¥ÏÚ¾=Ú¶}Ö‘åYï‰ÀÄ._6²­`uW; d¦ÊĉpsÃüù¬ 1þ»*TM{±w¨Ó÷þ}œ9ƒéÓY""0Õ¦­Øê oõÝ 0m/c@Dô¢x"pªŽ+¸’ OxŠw³³áç‡_eaˆˆØ¦Ú´[ÞÅ»:~~vîÄÀ°´daˆˆ^§U±^œ„d £:ÝÄÍ6h@àà€Í›áîÎ1ئZ³{†a˜˜¾Nž„¾>Ó—ˆˆLµl+¶ÎÆlõݯ¾ÂÂ…¬ ˜jÓyœ/Fqôï*•ˆ‰Á¤I, ˜j¹ûû.Þ• ärtëÖaÎ^{œˆ¨Ê8¥¨ŠõjÚ“°á‘ lîàŽŒzô袢¢j´S„oñí»xW¼[P€Í›9ýŠˆ¨Úÿªj•   ‚ ,X°àí·ß~~''§Å‹‹·SRR¤Ré©S§ªÑ^.­«˜N½"¼¢¾»k—0t¨@DÔ”Õ$´lVNNŽB¡000ï:tH.—›˜˜LŸ>ýñãÇòóó£££ûõë'.`jjjooVÕvþ2{Þl)}ôѺuX´ˆU!"jCÐ|XSëÏÊÊZµjÕüùóuuuôïßÇŽ/^ܰaCppðرc¤¥¥™ššªeff–ššZÕv~2ÊHBÒœyo‹wÏžE~>† aaˆˆªI“cX²dÉÖ­[ÿï::‹/5jTÍWžŸŸ?~üx ‹?þXlñòòo8;;[[[÷îÝûêÕ«&ÏÍ’H$å®°ªí•/Ðè§FïÀŽ7ðFs4Ww,Àß•Šˆ¨ñhúŸ>ÞØØX*•–îÂ&''›ššVµ½’©h7@#VŒâmئ¾.à­·ø}$¢&Dãÿøk2€ÍÌÌ®]»VºåÚµk•‡Ù‹(((?~|ZZÚÑ£GÕ{ˈŒŒСC¹\Þ½{÷óçÏ‹í©©©±±±...UmçG­´Ÿñs[´íŽîâÝ 0}:/ýKDT ‘^=Ë–-³´´üùçŸssssss;fii¹lÙ²š¬³¸¸xäÈ‘íÚµ Vq”ŸŸ/‚··÷áǯ\¹²wï^+++77·?gçîR(AAAJ¥rÔ¨QŽŽŽ*•ªíœ­6R¹CØ!ÞÎÊLL„?þàäG"¢…‚&㤠 ÀÛÛ[&+Ù¯,“É||| k²Î¼¼¼ç4ܺuK„ &˜™™I¥RSSÓ™3g¦§§«õù矷oß^.—{zzÞ½{·Úí `Aþþh-´ÎrÅ»_-¼ñ¿tDD5 ÍŸXññãÇJ¥€ƒƒƒ‘‘QãÛ /4±SQ~ˆŸàÉz¬P\ ;;ìÙƒÞ½9xDDÔNE™––vðàÁWWW###¥RÉCz´š ªíØî oñîáÃ01aúi€&844ÔÆÆæ›o¾ùàƒÄÿEøÕWX¸%!"jØüÓO?eff²šZí2.ç"w CJ FbUˆˆvoܸ±mÛ¶kÖ¬¹qã˪¥Ýßwñ®ß|èp|„ˆ¨ÖhlJÑãÇ?~äÈ‘ãÇ·lÙrĈ#GŽtww—Ëåª^tÖc<¶†õ-Ü2IRñûï¼ø Q-†‚æã¤¨¨èòåËG=räÈÝ»w 4bĈ1cƘ™™1€¬uXøøðCdfâë¯ùÍ""Òª.íþýûb0`éÒ¥ à†I€à‡oñ­Üòòб#.^ÄK/ñ›ED¤µÌZk…³8;ó®á€o¿ÅÑ£8p€o5Q톂Œå£­Ø*žüY°n6mbIˆˆjç¹6u©H=“1ÀÉ“ËáîΪ1€©–íÄÎq× ­À“oÕ! ìÑ<{ölå ¸7¢.U#Û\ŒbØü€z¡—R OOܽ ==~/ˆˆj=4°xäÈ‘êÛùùù*•J*•J¥Ò‚‚‰Db``Í7©a:‰“F0ê…^֭Ü9L_"¢:¢!èì?ùûû÷îÝ;,,¬   ???..ÎËËkݺu¬rƒµ ÛÞÅ»=Âþý˜=›%!"ª«Þ³T­­­:äèè¨n)((èÙ³çµFtI÷Æ4€„nèöþ0„á'ŸàömìØÁoQ…‚&CJJJ*³‚ ¤¦¦òj˜þÿ7 “ a¨RaëVûKDT§49 zøðáÓ¦M»té’J¥áÆ'Nìß¿?«Ü© ÚŽíâÅyé_""íàíÛ·wêÔ©_¿~zzzºººŽŽŽzzzÛ·og• c8f‹nè}DD¤íldd’’rîܹ³gϦ¤¤üôÓO-[¶¬ájW¯^Ý£G¹\Þºuë·Þz«ô˜öš5kÌÍÍõõõ‡zïÞ=·7b[°E<ûUh(=⥉ˆêœ Q=Ú¹sçÿþ÷?ñîõë×SRRj¸Î¾}û~ýõ×—/_Þ·oŸµµµ›››Ø¾k×.…B¨T*GõòË/‹Cßšj/—Æ+V/î wM“\!W„7Þ¾þZ "¢j¨I(h2N._¾lddÔ«W/õ½ÿþûo½õ–Ÿ"((@FF† NNN‹/ÛSRR¤Ré©S§4ØÞˆø}áýEÂ"AþøC01²²ø%""ªëÖäô‚ –.]®nñòò ÖàSäää( ƒüüüèèè~ýú‰í¦¦¦öööaaašjoÄc(؉âô« 0m 9DDT×4yRTTÔ¾}ûJ·˜™™=|øPSëÏÊÊZµjÕüùóuuu‹ŠŠLMMK?WjjjZZšFÚñ[~º ‹ì²³áç‡_å·€ˆ¨h²lbb’””Tº%<<ÜÜÜ\#+ÏÏÏ?~¼……ÅÇ\VÛK/ð<-zË·b«ØýݹÂÒ’ß"¢¿§ñü5ÀÓ¦Móõõ½yó&€ìì쀀Ÿ3fh$}½¼¼ž>}zèÐ!===ÆÆÆR©´tW599ÙÔÔTSí•lLE»´Â-ÜRB9㊋ñõ×X´ˆß)"¢¢ñü5À«V­rrrOEÙ¼yó7ß|sÒ¤IË—/¯áj ÆŸ––vôèQ±Q.—wïÞýüùóâÝÔÔÔØØXMµ7Öü&c²ô†‰ z÷æwŠˆ¨!EzMddd\ºtéÂ… ééé5_[qqñÈ‘#Ûµkõ§üü|õáCAAAâáCŽŽŽ¥+ªy{ã›]$™ æ×„k‚ $øûs#Q£8 )((èéÓ§š}myyy匣޺%þõóÏ?oß¾½\.÷ôô¼{÷®úQšjod|\8î$8 ‚pýºÐ¾½ŸÏïQ½°&¯íÓºuëâââ±cÇNœ8ÑÓÓS&“5¾­¾ÒÛx»/úÎÅÜwß…¥%V¬àQ½…‚&㤰°ðäÉ“?þøãÁƒuuu½¼¼&Mš4`À©TÊZ×»LdvDÇßñ{ñ£Övvˆ‹ƒ‰ ¿;DD"€Õòóó?þã?>|X¡P$''³Öõn+¶žÁ™ñãÿ‹û÷±m¿8DDõ :µ±Ar¹ÜÊʪcÇŽ&&&ééé|‡?ø½ƒw °y3¯}DDTÿ4À111~ø¡­­­³³ó•+WV¬X‘’’Â*×»XÄþ?†bèñãèÜ, Q=Óä<©.]ºÜ¼yÓÍÍmáÂ…¯¿þz›6mXßbvMÁdAAxã Öƒˆ¨þilfAA……Å… llls½´ppЬ`u §^*ìÒ¶-®^E‡üäÕs(hlZOO/??¿q§¯–:‰“æ0ï‚.ÁÁ°³cú5šÜÜ·o_õ9©áðƒßTL°?¼¼X"¢A“û€{ôè1f̘‰'ÚÙÙ•> ǼyóXèúòOâäl)*ÂÁƒ¸|™%!"j4¹GÓÙÙ¹ÜöˆˆˆÆS/mÛ¼›ÏáÜ÷ø>$‹!2’Ÿy"¢ šì7¦ m4üà· «büxÖƒˆ¨¡ÐðqÀiii~~~Ÿ|ò‰xW©T–¾Ô.ձ븞€„Á, `"¢ÆÀ¡¡¡666ß|óÍ| ¶øûû/â5ßëxø¯Òðp´h{{–„ˆ¨1ð‚ –.]®nñòò f•ë… *øOÃ4û÷³ûKDÔ°hrpTTÔ¾}ûJ·˜™™=|øU®'p¢:ÙÁ@` X"¢FÚ611IJJ*ÝnnnÎ*× õá¿ÑÑн;KBDÔHxÚ´i¾¾¾7oÞàãã3cÆ V¹î¥!íNMÄD±ûËóo54š<ªU¥RùúúnÙ²¥°°€L&óññY»v­T*m<õÒ’ã€7aÓ%\úßèÚ;vÀÅ…Ÿv"¢ š“ÌÌL¥RY\\ìàà`ddÄZ× g8¯ÆjOxÞ¸!Cpÿ>$~SˆˆP(èh|kZ¶lÙ§OŸîÝ»GFFÞ¹s‡oOÝ‹AÌC<„Aøsü™éKDÔÐh2€'Mšäçç 77·GÆ ³µµ àìÛ:ç¿É˜¬ð DDM!€Ož<Ù·o_âÁHÛ¶m[¹r%«\—TPíÅ^ñðß»w‘˜ˆ~ýX"¢FÀOž<144ðË/¿xyy)Š¡C‡ÆÅűÊuégüü^²Øý3::¬ Q£`++«Ó§O§¥¥=zÔÓÓSì‹‘Luf'vŠÝ_˜0%!"jˆ4y&¬>úhúôé‰ÄÕÕÕÃÃÀÏ?ÿܳgOV¹Î<ÄÃ`ïÂ. ˆ‹ƒ»;«BDÔiø š¤¤¤´´4†††öè" ü0¤¯ñõ\Ùƒ=6nį¿bçN~ȉˆb(hÙååÀ•뉞k°f ððÀ¢E=šo˜\›~Ãoc1öwü®ÔTØÙ!9r9ß4"¢† œ ÛxìÄÎ)˜"þ{ð †eú5\2– q(@Á÷øþ.‰w÷ïÇÌ™¬ QÃU[=àœœœÓ§OóT”uægülûÎè #—/cØ0V…ˆ¨i0OEYvbçtLo:„AƒÀ°‰ˆšJóT”õ%©çpnJNºÁ 5­æ©(ë‹?üGa”! dg#8£F±*DDM&€y*Êú² »ÔãÏÇŽÁÕ-[²*DDM&€ÅSQ¶mÛ¶[·n<åáÇ===ŒŒ$I||¼º}áÂ…’RfÏž­þÓš5kÌÍÍõõõ‡zïÞ½j·k…(De!kˆw÷ïÇøñü`5¥ž:uꃢ¢¢Îœ9#žŠÒÝÝ}Ó¦M5\mNNNÿþý?úè£çÿôÚk¯EýiÅŠbãîÝ»W®\¹aÆÈÈH¹\>zô袢¢j´k ñê H<}Š'0f ?ØDD ž 9fffeZÒÒÒžo¬ž+W®xðàºeÁ‚o¿ýöóK:99-^¼X¼’’"•JO:Uöri¶b5—/ä›&w…»âÝ„""ª5 Mö€SRRÊ´äçç?zô¨ö~=:tH.—›˜˜LŸ>ýñãÇâ3FGG÷ûóô¦¦¦öööaaaUm×–ßO‡pÈŽÑQ=þÌùÏDDZA3gÂZ·n]™â‚K—.988ÔÒ¦÷ïßßÍÍ­cÇŽ·nÝzÿý÷ÇŽ’––VTTdjjª^ÌÌÌ,55µªíÚòþíÆnõô«ÂB=ŠO?å§šˆ¨É°úl¥O»!•J-,,üýýkiÓ½þìë9;;[[[÷îÝûêÕ«&&&e“H$å>¼ªí•/P/WhHAÊ\øß‹wOŸ†½=Ú·ç§šˆHóþ6ê'€/\¸`òäɵ·•çZÇÇÇÛÙÙI¥ÒÒ]Øäädccã*µWò\ çjH{°Ç ^ (Ä»˜0ß"¢ZQî?þ5IeMî.¾u|.èÈÈH:tËåÝ»w?þ¼ØžššëââRÕv­ø4øÁï¼#Þ.*Â7Žß""í‰tM™8qâÎ;AÈÉɱ±±‘ÉdR©tß¾}5\íãÇ£¢¢¾ûî;'NœˆŠŠÊÊÊÁÛÛûðáÃW®\Ù»w¯•••›››¸ü®]» EPPR©5j”£££J¥ªF{Ÿ.„w: ÅâÝà`ÁÙ™‰ˆ´f´&ãÄÈÈ(..N???›ìììíÛ·wíÚµ†«ýþûïËüha„ fffR©ÔÔÔtæÌ™éééê‡|þùçíÛ·—ËåžžžwïÞ­v{Cà¹ÂÜÿÿQß7Oøßÿø] "Òš–hp¦L&»ÿ~ûöí§L™Ò¡C‡O?ý4!!¡cÇŽ………i'|CØœ|s˜ÿŠ_-a @`a3g`kË1""íž Z+ÄÁîè.¦/€ÐP´jÅô%"Ò&2 ®K<´D"quuÕ๠éy~𛊩ê»û÷sþ3‘¶õž5; š”””––æàà ž :""ÂÐÐÐÞÞž£ š,2’áø ` ¶X[#(¯¼ÂÏ3‘Ö„‚Žf7EOO/""âÓ?ÏÆd``кuk¾Cšµ{Æc¼:}##!“1}‰ˆ´Œ&844ÔÆÆæ›o¾ùàƒÄÿE‹±Êšå¿i˜¦¾ÈɈšv/X°`éÒ¥áááê//¯àà`VY“¿rª‚ª/úª[¸˜ˆHirVTTÔ¾}ûJ·˜™™=|øUÖ ]ØUºû«T"7ÎÎ, Q`“¤¤$KKKuKxx¸¹¹9«¬)OñtöE#ºt÷×Ë š>C8Õ:MAO›6Í××÷æÍ›²³³|||f̘Á*kÊp†³9žý¦ 䀉ˆ´’Ì$ÖûIDAT&ªQ©T¾¾¾[¶lO}%“É|||Ö®]+•JO½êõ0¤a6 Ó&a’x÷÷ßáæ†„èèð“LD¤e¡ ù8ÉÌÌT*•ÅÅÅFFF¬µ¦Ä#¾º% AúbË_àÎlÞ̯‘ö…‚&÷‹WV»~ýºxÃÍÍoRÍùÃÿ ¼¡N_û÷ã¿ÿeaˆˆ´3¼5ØŸ+}ÚgArssuttôõõ³³³ùc§æìaï¿Þè]Ò!ŽGHL„®.?ÆDDM»\&hSRRþùÏŽ1‚ïPÍ]Â%è¨ÓWìþŽÅô%"b¸==µ®Ñïäu@‡Ät@‡?G`oädÈåüüie(hr:  ôÝÌÌÌÝ»w÷éÓ‡ïP !¨7z«ÓÀÁƒxí5¦/‘Ód/^¼¸ô‚-Zxxx¬\¹’U®!?øÍÄÌ¿þÖ·7 CD¤Í½çz¿º­–ի· ïã~OôL@‚%ÞÇÑ©a`À7„ˆH[CA“=à³gÏV¾€»»;ß­ªÚÝoà uú8xƒ1}‰ˆØþ“¡¡a~~¾J¥’ÉdÄòR;*ÁÁuÜ ØÁÎþ¯âUuã˜1˜8o½ÅO/‘‡‚&O"ìïïß·o߈ˆˆüüüüüüˆˆˆ>}úìÙ³'ûO|«ªê".êA¯túfeáìYðàj""ö€Ÿ±¶¶>t裣£ºåÚµkcÆŒùý÷ßùc§zfb¦=ìãÙì¶~€¿?ŽáG—ˆH»CA“û€“’’ÊlGqqqbb"ß¡êÉAN ¯ãzéFñÀDD¤í49=|øðéÓ§‡‡‡‡‡‡Ï˜1ƒ§¢¬¶@öEßvh§nÉËéS3†µ!"b—²}ûöŽ;öéÓGWWWWW·OŸ>ÖÖÖÛ·og•«Ç~Ó0­tËñãpv†±1kCD¤õ4¿GóÑ£G±±±ìííMLL[½êjð=Ü{¯Æ#^zêÆ)Sз/æÌáç–ˆHëCAG³›’––väÈ‘sçι¹¹™˜˜(•ÊÔÔT¾CÕ°»'bbéô-(ÀÑ£7޵!"j 4À¡¡¡666ß|óÍ| ¶øûû/Z´ˆU®*ÂóãϧO£kW´mËò1€ÿjÁ‚K—. W·xyy³ÊUuç aè§Òû÷cüxÖ†ˆ¨‘ÐäM==½Û·o[ZZªÇÄ›*lff–ššª©ö†óqü™ˆˆ\©ˆˆˆz|%‰¤VÛ+_ ö¦Fà»ïøA%"ªg›U¥£¥…066–J¥¥»ªÉÉɦ¦¦šj¯ä©+Ú P®_GAœœøÉ'"ªgÿÇ_[X.—wïÞýüùóâÝÔÔÔØØXMµ7—€qã é_]DDÔP#½AyüøqTTÔwß}àĉQQQYYY‚ ìÚµK¡P)•ÊQ£F9::ªT* ¶×Ë,è2ºu.\à4C"¢F8 Z øûï¿/ó£!88XüÓçŸÞ¾}{¹\îééy÷î]õC4Õ^¿|ó¦Ð®PTÄO8Q# ຸ¶O#Û _gûì3Ü¿M›Xu"¢F :,_ƒµ?/À@DÔxÛ=à†Ù¾ÎÎHL„Lƪ±Lu%0£F1}‰ˆ-pà à X"¢ÆÛ{ætÕêU'CÐÉÉpp@Rär–œˆ¨q†{À Ñ1‚éKDÔ˜1€¢ýû1nË@DÔ¨{Ï‚®Z½j:- /½„ÄDèë³ÞDD6Ønp AL_"¢FŽÜàìßÏùÏDDM ÷Ì!èªÕ«–‡ Ÿ<…<@‹,6Qcö€–#G0`Ó—ˆ¨ñc7,7oâõ×Y"¢&Ð{ætÕê%aňˆH¡À0Q=`1€‰ˆˆÀDDDÄ&""b˜ˆˆˆLDDD `"""01€‰ˆˆÀDDD `"""b5*2–€¨Ö=~Œôô¿üÿÉ“­P¥BV–æ·33ÅÅ5ZC³fÐ×±ÿ:hÙòEWkh]ÝZRO EÕ6 U+H$hÞ2 èéUáUÕ¯n[ÅzñzÀ$ÊÍ-'V+ú«V02BëÖhÝºäÆ‹gOù¿œehÞ\ó/êÿÛ»û ¦®¼࿼à- VCÁ ‚e ¢ÔáE °hQT@Ƕ®£¬-X«®•긫u[-Ö±Û—ˈ Sm¥Z‹ºMa!#ˆXDÒ–²$% U!Ï×'eC‚›6¾Ÿ?2ÉåÜ䜓¾÷œ{ļU±®.zð`H%ûú¨½}¨O{ïõö©dw7ut˜W»w‰ˆ~ù…´Zêè î°±!‘È0§Ç#àrš-&иqDDãÇ‘‘bì‘A±‘Íà½èì$f8ï)Kßu¿¹Ç{/xNNÃÄ þŸVkF¦òù£Ôè­ÁC>ÎõpPOÝ¿OZíÃåŠ9ýàuu=ŒƒbìZÂýûÔÓc¤˜NGmm¿æ4;¿·µ¥'ž0žÓìÑÀbØÒc_Ýèò†¾FT4êìüõ!ÛX=¶ú¯îôAý—v *ÉÖ\]r0kx>æºÑ T wï"€À`zòd*D Þ¿oF¦b‰ßÀœfÃMD}Lö/ÆÎ# 2’e°rÎο.oðxäèhrA…aÈÎîׇvvÄ0¿>dŒN-7I¡¡€8AsPw÷P§ªwïÃ<:VÙûý% €ÀÆ.ⱋoì-{äÎÞ²gÚØöVÿ#æá.ìQ?{Ëž4úå“Ë¿F7öŸ €߆ öï߯˜œœüᇲ÷333³²²ÔjuXXØG}äáá1¼í`ó¨Ttì}ü1)•×ÐØ¥-ö*ö„{Ë®q±·ìº{~ˆ½e¤/úç?É×—&L ëב¾˜ƒå•—SJ ‰DôÕWäãƒþÀ ,ìÎZ»––,¡ è¤/,L§£ìlòõ%†¡šzé%âñÐ+œ†%h«'—Sj*ÑÙ³äïþÀ ,¬½^{æÏ§¤$º|é € ÓéèØ1òõ%†®_§¿þkÎ# – ­Om-¥¦Ò½{TTD³f¡?0ËÛ¿ŸÂÃiÙ2úö[¤/ÀÆÓétè3ú‹gá»vþô'š0] 0²Cle £#° ð@ €À€@ `0üáxÜÿÇJhê&  `@Wff¦T*µµµ‰‰Q(è@[\nnîŽ;8PYYÉ0L\\œV«E·€EáûP```DDDFF©Tª‰'ž;w.**Êxqÿ¿!¡ hê&  ÖЄÑ>Öh4r¹<44”}(‘H¼½½e2ÍÀ¢F{«Õj­V+‘Hô[\\\T*>`QBtG^KÿÑ4oš€& €—X,ý§¼---¦Êã”9ü&Fû4Ã0þþþeeeìC•JUWW„OXvö)]nnnJJJ^^ž——WZZZcc£\.øp€åà0­\¹R©T¦¦¦ªÕê°°°ââb¤/` 0á/a €À€@<’effJ¥R[[Û˜˜…BÁ¹ú¿óÎ; Ã899½øâ‹œþ·Ë—/çñxÇçbåoܸ+‰D"Qddd__·ê¯V«W¬Xáää4fÌ??¿¢¢"NT»¸¸8::züøñ<¯©©‰‹CÛT84´y81´©¿¹ãl†ÜÜÜ;v8p ²²’a˜¸¸8­VË­&”””$%%]ºtéã?–Éd }/ ”J%Ã0\¬ü?þ*•J?ûì³ÒÒÒeË–q® )))2™¬¨¨¨¦¦fÞ¼yK—.½uë–õW»££#,,ìÍ7ßäîÐ6Õ mSMàÊÐ6UÿáŒk ÙÌ™37oÞÌÞW*•àüùóÜm;kikkã\Í›ššÜÜÜnß¾Í0LAAçê¿f͚ŋsz,x{{ïÚµ‹½ßÓÓÃçóOŸ>͕ʗ——³¿.¹;´6sCÛh84´Öã3à¡Òh4r¹<44”}(‘H¼½½e2w[ÔÑÑaoooggÇ­jëtº¤¤¤­[·Nž<™£=_\\ìïï)‹gÏž]ZZʹ&<ÿüó%%%J¥²¯¯ïðáÃŽŽŽsæÌÁÐÆÐÍC{ãèëë[»v-G{¾««K©Tfdd,[¶ì믿 ]°`ÁÍ›7¹ÕŠŒŒ wwwWWW†aÞxã’’’ &`hchÚ¡=¼q>îþiF“àææöÖ[oq«æ o¿ýö¡C‡¸Ûùìu‹-Z»v­¯¯ïÞ½{ÝÝÝsss¹ÕŠÍ›7×ÔÔ|ùå—UUUÉÉÉñññ?üð†6†ö¨ÚÃ×à¡‹Å ÿqqKKKÿ£f Ñøøø®®®3gÎŒ3†[•///W*•S¦L …B¡P£Ñ¼ôÒK111j‚ÝØ±cŸzê)ýOOÏææf5¡³³óý÷ßOOOŒŒœ1cÆîÝ»œœŽ9‚¡¡=j‡öðÆ5þáP1 ãïï_VVGD*•ª®®.((ˆ[­èîîNHHP«ÕçÏŸçÜ)""š?þµk×ôgΜ¹{÷îÄÄDnµbΜ9ý¯nhhð÷÷çPýµZ­V«åóùý§ŒCC{4íaŒk°Ö¯_Ÿ’’ìåå•––6}úôˆˆÕ_§Ó%$$TVVæçç744°}||8t°ìàààààÐÿ÷¾T*õððàÖiãÆ‹-ŠŠŠ ÉÎÎnll\¹r%‡ê?vìØ°°°mÛ¶9::º¸¸=z´¶¶ö“O>±þš·µµ)Šï¾ûŽˆjkk[[[§M›&‰84´6ÁÞÞžCCÛh84´M}І3®ñå"³ìÙ³gâĉ ÃDGG766r«ò<ø¨¯¯çîÛÁѯ!étºœœœ)S¦ØØØøùù}ñÅœ«ssóÒ¥K„B¡¯¯o^^'ª]PP`ðù¿xñ"·†¶Ñ&pkhò.pbhRsÇ5O§Óaj ð;ÃEX`0 €À€@ `0À`à¦ðððÌÌÌ÷‡RÀ’••…~0X‹îîîür`° ÀÀÀ­[·ÆÄĸ¹¹M:õôéÓìöììl???†aÄbqrròƒôå·oßëèè¸wï^SÅLéííݶmÛ¤I“† ’Éd¬^ÿ—3µ{{{{bb¢­­íÔ©SO:%‰¾úê+"òðð(,,Ô?›H$º|ùò ÕÈËËóôô …b±ø…^ ¢+V\¹reãÆ<ÏÕÕÕh+'DX§ƒ–––Ξ=ûìÙ³ñññr¹ÜËËK deeyzz*Šõë×ïØ±#==]_þÔ©SsçÎíèè(,,4ŲM›6UTTœ?55U£Ñ Þd£ÏÓÓÓ³zõêìììçž{®½½ý›o¾aãV¡P$&&nذˆZZZ–°v:°>3gÎLJJÒ?œ7oÞ–-[ Ê”””xzzêË'''}ªþÅæÎ›‘‘ap¿­­ÍÆÆææÍ›ú]fÍš•““cPÞ zú—3µûÏ?ÿÌçóe2»±¢¢‚ˆ.^¼¨ÓéÜÝÝ?ýôS}y{{û²²2SÏS]]- [[[ êüÞ{ï±÷M•°f˜X©3fèï?ýôÓµµµDtåÊ•´´´ªªªÎÎN"7nœ¾Œ···þþ Ū­­íééñòò꿱¹¹yðêé_ÎÔîuuuìb5»% @(£>>>ÁÁÁžžž±±±ÑÑщ‰‰vvvû¥ €µÁ9`+ÕÛÛ«¿ßÓÓCD ,ˆ‰‰ùþûïûúú.^¼¨Õjõeôñ6x±úúúˆèÞ½{ýÍ·mÛ6xõô/7ŒÝy<žÁ:Ü ÏÃçó/\¸pâĉI“&íÚµ+  ££ÃðÙÊ €`Hú_ %“É|||êëëÛÚÚ^ýugggW]]mtÇ!ë?} …ŸþùðêijwvŠÌ®<QUU•þbܸqíííì}¥RÉNÓ©ŸÏŠŠz÷Ýw«ªªn߾͞âlrR f+--=tèÐO?ý”žž^QQ±zõê'Ÿ|’a˜’’"ºuëÖ¾}ûŒî8ÄbzãÇOIIY·n]QQQSSSeeåöíÛÙï¡0µ»³³ó’%KRRRª««kjj6mÚ¤Ÿ4‡‡‡çååuuuuuumÙ²…Ïçò<ûöí»qãFssó‰'t:ÝäÉ“‰ÈÍÍíêÕ«---wîÜ1UÀªá48€u^„µsçÎ… >ñÄ'Ožd·çççK¥R77·àààƒÚÛÛëË8p@¿»©bF/ÂÒét½½½;wîtww …...Ë—/W*•ƒ_„ÕÿåLí~çÎ%K–°M(,,´··g/ÂR«ÕóæÍsttœ>}z~~>{–©ç¹qãFdd¤ƒƒƒ@ ˜>}úñãÇÙ•Ëå¾¾¾ÀÅÅÅTkÆë¿†V"00pÕªUëÖ­I‰D%%%áááx° €5° €0À#ÇÿÿÉPÿðIEND®B`‚ mapcache-rel-1-6-1/static/bench_merging.png000066400000000000000000000124771316353564100206440ustar00rootroot00000000000000‰PNG  IHDR€à,Ö PLTEÿÿÿ   ÿÀ€ÿÀÿîîÀ@ÈÈAiáÿÀ €@À€ÿ0`€‹@€ÿ€ÿÿÔ¥**ÿÿ@àÐ333MMMfff™™™³³³ÀÀÀÌÌÌåååÿÿÿð22î­ØæðUðàÿÿîÝ‚ÿ¶Á¯îîÿ×ÿdÿ"‹".‹Wÿ‹p€Í‡ÎëÿÿÿÿÎÑÿ“ÿPð€€ÿEú€ré–zðæŒ½·k¸† õõÜ € ÿ¥î‚î”ÓÝ ÝP@Uk/€€€@€@€€`À€`ÿ€€ÿ€@ÿ @ÿ `ÿ pÿÀÀÿÿ€ÿÿÀÍ·žðÿð ¶ÍÁÿÁÍÀ°|ÿ@ ÿ ¾¾¾ÌKÙIDATxœí‹¶«(@uuÏÜÿÿã™{N¢ ˆPTÁÞ½Vç&JAâ>…àkÛ°ï¿ÿß«ÊTòèóŠ€ ËE |Qöý·×ݽ ¸»]ñÿÿù]e÷ ìßr—ЉuÁ¿¢küèõùÐñ øå ˆ è¦ÀCÀÃÃmC@hD*úkøæý¾~{ës¿ë(àÜÃû¾ »àkß»9‹¯àçÐâèfƒAˆ“Þü èï’AŠèîû€ F4Ù‘`óžs Ä Oò#r–9€¿Úýž÷}9< Ò¿‹}Ž€-ƒÝ¦Ûmy]Ó?êF»àÕ~ Ømy}ÓPv[þJÀè4ÌŠ¿Åpì¶¼}Ó ÿ0”#:âë:u¼°æ’Õ^| ”〴¼ ãÞÄá˜ù^-¹¬4²¾½(‡¼€w×ÓoŸ‹œ#Ög[†€ùI!×YìeÚîÖtÖq–mÎ*ÑâÎË–ŽéÔþ}ñ¬ôxÎýF*za ¾ÅŸŒ §¦î–¥ŠûÛóºJd6Qƒ›Ð.a¿F \»à eAL§À?9üŸ¯ÍVèP;I/~:ljü5£Å¯}¢û殢Dñ¬€—ð^k}½úÈ€# 6}D¹È»£ôåð ‹GŒ¬|+`àÎCý0Õþ!àkrz¤;Èt¹PÉH”„÷n Yï øµ;¦*ªûùj ŠTOnô±»Iò|ç”Ëm·ƒHêKe‚Ú¨÷. tJDê«ÿõªKJÔN°a媡N|?½!W«x…]ªD@ ÂPPŽDÖ±¿\XmÉj BLßLûuf0½j£Ýe±Qp8Sž É4Œl;!FdЛ|I4Õñ“4òÓÁ”ßQü%\ó¬Á›ôæ…ï«ÝÒ1¿ÿ߯“Û›'”3ãí¬rý*Õ"à[Â$²{‡î–mž»w$$]çŸL‡>"D²œt»ˆt®rY1hYÓ)ðoÿç{ùó¬+àÕ‹ß…ûîµv±\2`þ|xX,Øôå"ïÎâβ-b@¤xDÀÈÊ·¦–• 6¿<8Äûã‘+–Ó#ÝAºåÃÍìoãH”„÷n ô%ókw*LUT~I™–Õ17úØÝ$y¾;‹Qœe·ƒHêKz‚ÚýŠ­¾|½Ý/q_àø¡°ãýølXTÙ¥NüåéŽß·Ø£Þº%âúy»]XõEhãÎ8í‚€é" :–€€[ÿÂÞ*ÜyÜb}ZÛ~î6XaM%«=iôå‡@À.ù/¹E¾ ’éñí¼ZY3¾Ëüòå%#ÒýôÏ=גϾQ{öè³úÿŒ­;ãΟÜMT†>3,׌×_¤wÀÎ<úÁ~ŽågþÎɳ딟ŸnŽÉœp‡ó€Þ¼ð}[¶ IG[¼¹æeûË•Õ1« øèï5š(œ|q·,RüX²ÇÒ]Ú·×¼k‹,lKN°  Þ¯GI‚˜NÿäðÓ' [>ë/uü­ý»pß½çšÑân¼Ðèx)6̯áL6nætW#V!{ÞA`ìåÃ"ý—¤aN˜¨V¡;ôÃTû·¶€Ïý;^Ê:ÁÂM0UÎÍ£÷M*°¼ÕN…©ŠªXYÀçÃßÜècw“äùÎ-¾;®:}vPn»„vÌKµl÷ê» ¸Ý•k£Ý‘Ê#|uI©€Ý¨ñïÕoÝ”íèQçºÖLÿù m(â éôÝ—ƒ³:XU@üS¢Îàßw¼œûÅS+ö¨%«1yˆiÿ¼1iÁÆO¬pø›D“ž†‰ ó_”Å´eFäWx2˜&,`8å´·¶%rX÷ÏŸ)Ìf²=–׎bÇ›´€þôcÿ·¥—¥üü#úœõœ´¸k8A4àKús£#¯%³Ü–Xv.p†ÎFÿ~染p]v©ýZóv)¾ Ü5?¡ƒ¯YÿëU—” ø ÿÞm€X‡œ\>–m™\@‰ù¿ i=,}L€ï¾f:¬ú€oP1ÿ wL- þégfñÏ ˆ˜W@ü3Á¬rú½&ý¬0§€øg†)Ä?;Ì( þbBñÏó ˆ¦˜N@ü³ÅlâŸ1&ÿ¬1—€øgŽ©Ä?{Ì$ þd"ñÏ"óˆ&™F@ü³É,âŸQ&ÿ¬2‡€øg–)Ä?»L —Xƾ€ègóâŸmê|IÜ(¸>`5øgœ*_no¸Ø®màŸuêïl©A@ü3Ï›.x?nªîÝÓºÏ}äbàŸm^¹âÛ7$âßî‚ñoìBðo ÌNÃàßXˆÆ¿I0* þÍ‚MñoL ˆó`Q@ü›ƒâßLØÿ¦Âœ€ø7ÖĿɰ% —LGÆ—ç§ËôýæãÖ—}~ÆVGñoBî|qžþÞ&à;ðoFn,XçQÀWàß”˜„àßœXÿ&%çËþT©>â߬d§aÜÓí¬ÿ¦%'`Á:VóbA@ü›˜ü‘áó€ø73ÙAÈð#!ø75ê§aðonòpì4 þMNÁÙ0#÷ñov²£à§3ÑMÄ¿éQ- þÍæiü[ÅÓ0ø·j§a¸üc ´ž ƒ~‹?fÈ> þ­Bþd„‡3ÑMÄ¿eP9 ƒë ñHþ-„ÂAþ­„¾i˜qþý{ϰvMÍý…é–0Ì¿¬a?Ñ·ŠÌžëôRÀqþõ޾Qî}©0ð€£üÓ¾‰ßé«Yç‚cÁmÞ2Ì¿Aõ¢­ÎïôÎú"y6Ì ÿt¥ó<ÓµÀ—ˆ€ßǵž¯ç¢ú–òoLµðC•/ÎS Ïwoþ0Æ?ÒßXª&¢Ï§Uåk à ÿ†Ô ÕgÃxkmðÄô!þ‘þ†RàJêl˜£`«'¦ñoD¥àQw6Œ›ðštÁ#ü#ýi êlôÑ@À!þ ¨*!ÞüËÛi˜—þ” àlÒßÊ”LD·èCú[šü(¸óÑ#ü“¯RØõšyÿHª¸õe¯xV×3ø'^#ÜQ"`»€WÄý#ýi£¤ nÐCÞ?é !ÇÈiiÿH xY¦¸ÂõA ãî #ìéO'Ãî #íŸluPʨ{ÃÈúGúSË {Ãû'ZÌ ØÝ¿ÎñAŒü-zÓKÎg_XÝÙ?Òß$”=°:Utsíó2`oÿú†Qêüõ-Ñ÷õô7UÓ0·¬îì_×è N¥€MX]éo:†Ü¢·ô›C’þfäΗ½`G_~Sr+àw¯UÀþ&åÖ—îÏ .ýf¥à„Ô¦« ýÍ‹…AúMŒ~IS£^@ô›å’þfG·€¢úý§+’ßÄšM½é«·]û 8“~ƒQ¬¯Z%Óßäú½¥«¾ZD¿YÈøYàË€Cq‚éýÆRrƒJñ“ÐoJ® P.ý¡ßxJΆ‘ý–BÛéXbéýtPy]pË.è·ª¦a¤Òúé¡ÛíÙ*@¿Ñ# Lúë}d R⋈€BúIÔP" HúC?…èè‚ÑoYJl0†DúC?¥(˜†A¿•)¸IyÛ€WÒú)fpŒ~«Sr:VË€>è·<#ìŸþÐO=EÓ0OzáòUÑ Ø=ý¡Ÿ FMàüP0 ÓáHHçôÇvr(®·~]ÃCSœÝ7ý¡Ÿ-äD?pÈܤ¼yÜ5ý¡Ÿ=„D?𩜆9Ñå<±+°gúC?›Ý%?Xéû‘Ï÷ö7ÑJNÇ :áÝÉ€ÅvLèg—ü(xÿùïúù7FŸ˜ Š~p¥ì‰éi?ÿž˜¡_úC?ÛTžŒà ˜í‚Ñä÷c ðÚß Ø-ý¡Ÿ}ª¦až=1½“~œq0ÝOFè”þ°oz ˆ~pKß[sôIè7]D?Èѱ î’þÐo2ú]˜Ž~P@¯‹’z¤?ô›’‹’*¢”Ñe°CúC¿I)¹&ä©€èÅ´°}úC¿‰r]ð8ä;7!­À¾Ùuo˜"Ðo~²°uÀrÐo²û€ƒ~k0àÞ0% ß*¨ýÖAá4 ú­„:Ño-”Màßj”LD‹e@ô[E]0ú­ˆšQ0ú­‰9ã`Y„ïûf¼€è·4£§aÐoq |éx> ú-OÁ ¤[Œ~Ð墤2жŒ/!è?”Ø.àôƒ#&¢Ñä§aÔê÷ß £Û7'ÒjÕ¯@°œ è[ƒ¬€Jõ“ðð¾ïšžAP@g ß¼Etu G×o&& VûF7au„Ô¨öi@D@…úaŸÔ§öé¡RÀßÃ#%êR§ö©¢NÀ½ôa…Êôë>¦ƒ§T x<1=# .ýO#oºàóaÕÑ'¦«ÒûòüT§èoùôÓ5é‡}zy™S]°"ý°O5]Ô£öi§nrûÄt-ú1äµ@û‰hú!ŸF_Üì³Ã|bŸ)&û¬1“€ØgYdÈk”)D>»ØûLc\@쳎e±oÌ ˆ}s`R@†¼ó`O@ä› cbßlXû&ÄŒ€Ø7'&dÐ1/úD¾©Q. öÍŽf±oÔ ˆ}k S@ì[}2ä] e"ßjhûD€Ø·&:ľeQ ö­Ì`ò®ÎH‘Æ ˆ}ð—1b| öÁ‰´€Ø’2ä…1‘bȈ}@@@ìƒ4½Ä>¸¥«€Ø9º ÈJè# òA!o¼<±ëû œw/Îà ±ð:6h¬ÃÛ xóÄt€{Z¸’|b:@ Mœ  þÆÐ¦ ¶+à÷wÝŽeyåKü‰é&@<%(¸,SÄSÆ*"žRfñ”3«€ˆg„ÙDEÀ‚ç¬ íÉkï«®³ ~ÅÐÞûÛC@Ú›Úžoæ5@{{¶Çpr@Àq8G|]'°‚Á[N)V±8Ž i £ÝÄá9в~ZoÄh½¾8Žñ†0OÝ©á<ŽßÄ9"s½œÎA[¨¤RFYv(EœÕ•—ÃSiýð3½v˜?EÜíUˆ€µè“QöÔTh™¯º¾?Í"ŽIXO ÷ÿ¬foù wl­™S©ñW ýëk²z\¯Ÿ…Êy"½¤³ºZTk!Ò§zTÀᅵâš+hôÔ§ 8k×;”s¼»kZ8ª;t ¨¹cþi$e@5L±XMLß‹RÝ^f)éˆâñÞÊd!íe>•#)3óë+­8,`„…ÁM‰>N5I>ï”Úv½#8q¤>ïPÆj]‰j7«'Bm•ŽöÊ¿½âš£†Ñ¤ûqÒy ¬;† Mvis+=E:k©OoŒbx›6óå–{äÖrR/.±ú¢åXÞ-à(3ÚXééÂ:öàÁȉͦ“:™›™²•tï¦ÓœôÍ&æmÛÃf{º&Rè4Ìj]c$Mfì»CŒÀ<à‰€I,âßçü½gÐåäéÚÁv*ÒZÐæµyáð,äáyý_ð÷_‡Ù¸:ý蜶,7kÑ÷¡3¥èzÓä© ñ·ð»×CÍÞV«‡ä|Rh¤ v.Ó2§Þúñä<Ǧpÿîã'ïË}ˆ¥îJµúEY„8RŸÕl’¥?V½{UNµq½Gwmfù·W\sT@Ëhf–ÍÖ“¦iOÞ*à2þ™ m\«ÃìÒäK\È?¨a*ïpyÿ¼½•1¶p,oùƒ%¶”RLÜ d í)Á§@# Caž¯õ¢Õ4b¸C ›†YÞ¿T½ 1ó€êD3ú™çßïi«øÌß3yfNù©s}Ê 2™£NªõÔ’Ú¼px]k•î˜Ïÿ¯”•°æï¦Ý)³Ø@ÌÀ™/”yÀÐ2Gõ{ÉiSÐö§]Ï×Ù¬#Ë©AM?у£ú³~Fʼ#ÿCÿNkwŠIg&@Ÿ…ç© xJ:««0.`¤u+¦R3, þ×sÚ%=jíÉÊ€­½ìPÎñî®mk|˜* ùr˜¾èaÜj˾ïÃ6f4·¢Œ÷ 8Õ¿ûÅi‚ïE©íÌîO}õTK«”. ]Äj]iÐ×PÙwZZqX@ƒ©#àØèãT“äóN­~*Ì•ä„8RŸk•N­=SÀÿ)‡Zò4>to{ùWZ\sT@ƒ™Zûp"3Ö£G›opЦ2|E:m;ÂT^& þíÆ»Ä?…k¼ûÆ}{Ô”bb!x¨_ím´¼óãиÞYÝmô4Œk˜_0 üûC’ñþy@}°¿¢€öT”²¾¥k’ϼܩ|ýÁLvºòÚ]í~ãPŸ~tçÊbËÍ=U« ÿ~quÁ¶:‘¼¦xû„{J¦œŠÓb*‘ÿ¡oMáw ýQèëÛk® ÿ>¸üžH¹)ïÔÜe h߸¯IP :|ÐV*sK*\Qÿдõ- ?ø2 þâÐÆÑƒ%ŸÁV×bð1 Ò¤½¾¥càß—K&zQÃTµT¸1 Ú2ìŽ:aÌDœjWª)f§TpG¹[Órî#„¦ŠW% þͧÇÁ}óÄ¿Ùt\" Lå%âß® à8ú̆¢[L\”bÃ!#þa ÿ hL&/³ÖÆ=ˆ¶Ë…BN˜ðØÅ¿N–¶ôHú¾‹†—ë‚€ÕXI+³v8Ø2Öm¦?ìâ×÷ªX\@üÛ„©¬- þmÂT–ÿögeñOSYX@ü“ÂTÖÿD°¬€ø'„©¬* þ a*‹ ˆRXS@üÂT–ÿ䀀0•Ä?A,( þIa*ë ˆ¢@@˜ÊrâŸ,Vÿ„€0•2_<7 .xÒ(ò%xÃŪÕA@i”ßÙ²‡€ø'Žš.ø¼oª®ÝÓºü>rø'‹W ûÚd@”ÇJ]0þ d¥A d¡iü“È:Ñø'„©,# þÉa*«ˆBA@˜Ê"âŸTÖÿÄ‚€0•%Ä?¹D|É¿\!‡ /ç™ÅV€ø'˜/ÊÓßÛtƒ’ ˜P&+ ”ÌüAþ‰a*1_Î\¥rÄ?ÙD§aÔËí4Á?áÄL(“Ð…3Y@ü“NüLH×y@”NtÒõLþ‰gê4 þA<vœ†A@H¸¦Û1 þA|œ;€ÃDñfNÃà3§aމÓ0ø˜v5 ÂâWÃô9Ä?ø%~1BæLtZaüƒ“¦a>Ì9‚ðeÎ áË”iüƒ‹ðÓü‚p¹3B¾‚9„})00^ÿà!á\pÛ€*Q_š_ ƒ  —CÀëq­Ïkr@ü•¢iå)…ϻĀ*EÑÏÓª/ù’Ä?Ð(¾F{\kúÓn.·÷] sWÌ|b:þNÙÕ0jÂËé‚ñ Š®†ÑGåB´ù—äiü“¡Wà ˜¤LD· ˆ`7»"ÿÀ&AÀV¿ A@° Êu<«Ë[ÿÀAŠ€m" 8Hé‚›Ä?p1jÿÀɨŸe" 8toü7ƒî ƒ€àf̽að< ¹7 þ!ƒ#¦að¼Ä˜^Ÿ¼ 8Ä?ðÓÜÙ¿¿mú6My»€.ÛNbéªÄ»àÊ3!ãýK¬‰¦Kpw¬ºAHW» ‚¥½é= ónÿÒÀÒ :wÁüKƒ.ßÍ‹Üqoɳ4E®rñ¯[YúZ_ó Oâ-]~×.ÿV'MÓž¤˜µIJiüƒ(=§aú ˆÛÔç$Á§(þAœ7 ˆ‘rs¢²€ø tÿ …n£à^âß^$\ Sÿ ‰^Ó0Ä¿Ýèô£$üƒ4úü( ÿ ‘>¿ é# þmHñRér5LñoKÊ~”¤?"É|RþA2EÓ0úCâÌgÅᤓpw,LJÃÄ¿]‰ß¢×¿äyV°úÀêŸì“'qðoKÒXí«z¨ö©6\Ã/ø·/e~|Ë^pø·1EÓ0Ŭ.ÿv¦PÀ²V[3â½UàßÞ¬. þmNÈ—3¡LVÀ|ðow‚^Gx­fƒÛô¥éó‚ À¿ýI¸ µiÀðO BðOë ˆ"XV@ü“ÁªâŸÿ¤°¦€ø'†%Ä?9¬( þ bAñO ¾ >‡¢H¹AåЋðO)¿ ) þ #åj˜âŸ4Öº ÿÄQø»à–5ðO+MÃàŸ@ºÜž­ ü“È:âŸHR|" þÉdñO(‹tÁø'•[tƒbYbÿä’p“ò¶àŸ`è‚ñO2)—cµ hƒ¢™. þÉ&i&§Îÿ„3YÀzÿþ Pº3w¦Ú¿°d!9w ¦aú ©÷¯6€',âc橸Uý+qó™xEt­ûì¸Rqwzž€ÕþUÖßœR÷ r“ò~]p¥ïù‡ ³¬õ¯®:,Cá4Ìýˆ.å‰]9ñ>$Ý%ß*t=AäûæÈ}Xat¿‘r9–Õ ŸJ,°Ò¿ªÚ°ñQðùûŸùù•í'¦Ç«ü#ýíCÚÓý~ÿa<1=Úl5•a= /FÐÌê‚ñâÇ€®hvÁÖøG÷»EÓ0OL¯ò¯¢.,Êà‹*ü#ýmÉXkü+¯ 3ôÖø&#,÷îw[vÁþׄÕ÷ÃôbÿH;3ìGIåþ•V„7ò£¤ñœ :,õîwwR~R/`±…õà5 °Ð?ÒŸFtÁ¥þ•UƒW1`‚à§ÿ4L™t¿BˆfÀÚ€…þÕ‚÷=¬ XäéOoÍQæ_I%x'}Ä?ˆÐu¦Ä?º_Yô°È¿‚:ðb:NÃøGúGÊDtY,ñ/¿ ¼œn]0þA ½FÁùþÑýФ“€þe×€ès‡ÔlÿHRé"`¾¹`zLÃà$“ `îõ€¹þÑýJ&a’Ùgû—Y¶bÌ’üþ„ô¥çƒj> ŸtRlÐäUþýë`ö:½ŸÎ¤yA÷“Í%å›ä ­¥k0ìÞ06‹ê×L¢¹röÕ¦´=›i.•þƺqTÊ9X­¾Ìpº~ëî­mÜJb’€süÛv/¾˜)Žì~‘nmfØ[¿}û« /`Ÿô‡s/e¸€õCº—S(àçôHÁ£ºÚú‡x¯§LÀ³ða…M»_òÞ x?1=SÀ¶ú5 Ө邟‡U'=1½aú#ùmAþ¥.JÕOýŒ'¦·Ô¯Y(˜MeLï‚[ùGòÛ‹A¶ê~±o7Ê!¹OLo£ÉoCFLD·IØ·%l¡ÉoWú ØÀ?ìÛ—ÞÖw¿$¿­é,`ýj#ÀÒt°6ý‘üö§§€ÕúÕÕ‡7ÐQÀ*ÿH~Bè&`U÷‹}bè%`…~$?Iô°"ýaŸ,ºX¬ÉO=,õûÒ^ÀÂî—ä'“‰wÇRÁ>©,! úÉe¾€ô½¢™- ö gª€$?˜( öÁ<I~ð˱¾LäÃÄ>P+ É F ˆ}`1L@’¸$ ö›’üÀK±täaº ˆ}£Ÿ€$?H —€ØItä©tû ö¢d0û7! „© La*S©ñÅxbW}@G€÷KâÓ ª3 B µ0ã‰é:-\Ib:€ƒ&ÒC)mº`„Bª|I~b:€&¢a*SA@˜ ÂT¦‚€0„©¼\À¿`J÷àk¬ÛlhM©¸/õvâU¢Þ~¼D@ÔÛ•åD½½YX@Ô“À’¢žõ¤±Œ€¨'“D=ÁÌ´'žY¢ü2^@Ô…‘¢XŒõÀCoQ‚ôõ ¢$Ó^@Ôƒ V8‚A@˜ ÂT¦‚€0„© La*SA@˜ ÂT¦‚€0„©¼^@Ú£½©ê¢=ñíÍ}X!í‰oioj{Ž'¦¤ÒB@õ‰éƒÑ»`€Á Ì¥MOð6‡GÀ' øG6ØêÜDVƒ­6mnôšñ'6²±qm]í5msô9¹sà;§Üñ ð !Wjq|—¿u†ï üø|´÷1ÙÞ¾Ãö ?BÚÜè&‡ \¸52Òòíþ‹}ÿ´AJ“CÛyŒЖÒ3žœ)…& Ôñ½lãórï®[Ô¹–i>±N=æy<‘¼ \nÉÊ^ôL–]Û?‰ç»ûmKôÕ’F^sS‹¨yô<¬h#6Ö¥@@u™G@Ìkñýe“Øk­j©rº¡Z.\Ã{q<¢è%}¢Å‹ñk?û‰§Ä`+Áÿ‡z?×þ°ÿå]êÞuÿ>¿ÿ˜leßÏø?ò?jh¯Å+¿ø<+H>Ñÿñ‘¹ÆÕø¬?ùUŠ„Áâ TøwC9âÏOoùÐøw9NÞËñùfÙ{ûƒÿ#öΊüKðxmÁ<ÿÁ9Ô‹Üÿ颟ÿ†°oø'€ëÛâßÿzi«¹Ïüúücþaý¯—ÿ?àÿÈý±¢¿ÇüÇþqáÿ™kÿ½4áÿ„@ÿ‡ywÿ¢³ÿÞš?ÕÜåÿ˯Æ?æÚùóþüÚê+ñdÁÞó´~`ÿ‚xñŒŸø»?ò•U.¿àðôµ!_þ ì»Eÿ…·ÉúĦ›á¼î;ÒücþbYÆ\þßàÿÈý±¢¿üžGšÿðO¸•â¾I?ø)Å6?ø<"fÿYÿìUÿº·ŸýÄÑþ®ç?óëñùû_/þÁÿ‘ûcE~(Äa‘òÁ;óÿukÿ½4ÿƒÝ)Áÿ‚vìßñÿ¸š?ÕÌëþ}~1ÿ0þ×Ë¿Ÿðä~ØQ_Љÿ63?üîÇrßÇÿ*iíÿÙ ýÉÃñ_Ïû*õo;ÿŸ_ù4Ì_Ûsûƒÿ#ö¢ŠüP›þ h[ÿðùOG?ÀÛþA4«ÿ…Z †ÿ‚~¨ÇÞÇÅŒàগú»œÿϯüš?æ?í|¿ùÿþGâU†±%È›Qz+¡9üš­Á®\¸1Ú\Û› ²RÕš.®Vû(w®@;OÓ½>{ÛöÇ™°ÛxWê|ò±ñNœ[ØÒI/fp»C“È.µ$–÷D|“meå—ÊÝôÅa3܉$±HqœT_È’yW“’YU̯$ÃKÚ¨î5E½Ž–ÞæO3l€•þ#ååL»Öí,v¨±g=ðp?¦kŸ:Æ†Š¦ößPºnáüÉâ m_ÃH¥áðÝÈ}Ù ó 8÷ RúÔRßóÿ!¬+nöü¿ÌÝ—Y¾ŸkÛiÉ?0’~GÓëtÔî¢yÚîØmB]D‹Ôg'’+˜Õuv–ÜǧXˆ†0¾eé œú*ƒú÷ªN.”¥à‡qÁ*À¾:ûóžk‹\Özÿ^†« òþ½NÀ#¬-rÚÔ.IG¹Rÿ_隬ú§…á>eç‹,VbØòRmÇ>˜ý«—0[,V=…pcòÆ 1îm¬ˆH"Ëô¬å‹’Z%óoþk›Õ|ž)ÑV5ò®n&RØAœ‹ž;?‡4ºwŠ­ïä+i¢_Ï´ãÉ=N9í×Ú¹8upò Z±+ЕíVàñµ¾GžQÁÈ, Á÷§ ]ÝÜ’ù˜<2KDvVúÍœ8[½ ‘Î~Yf N”EÁ'D¹e+ýW!'ŒôÙ²^)‰ÆCy#Ï\çð¨l¼IuvdfÓeØ:7@©#§ã[,l9¹S¿ÈÇêrÝèu—¨¾Üm4+˜ˆîÒ&Ð?絛çkÏ91B«O˜åÈõôNzu¬95)¤Ž$µÔcVyV\çÜàà~5QüCxˆµ á[k?˜F?­DñQRÕþEÃí¢üΪh®/"ò®äš5TãZùDT3”8ÈnŸZä"ñK«ye| d>3øjKo]A‰c1Q9çk³9üÈæ¦ºo[XiÇs³–ïMˆåš1  XŠÇÔõ”†p‘09aÎðβ´øî#¯µK‰í£Áß,ı9õäõ§ZêžY°–W÷{Á*Ñ‹õ%½qÐSx™Ik £‡PzjnZjœ)“g=úÖñ5•¥°’;rdN'ò®:æûWº“nŸ¤ÛÛ«v–G‘¿ «°Aw •£ó3œ*Ž+Jx™ÚËïèCí}ƼÞ&Öoœ­­¹UaÀ”|Àý9ªB;¨&Yu Æòœgðàúé£rýVd_îà @G¹ÔK§A=×ϾCŸõ—3ÿ©“ri»¿V8ÆZhk.¡É:#«Ö¬EF@¸˜d»ïX€:ÈÁÝÓ?7#·#/™<.f’ÞGwÉü÷Vª¯tG³³6ßQ[S´:F£‚T®<ÕkûÄ–1å3ç¨8}¨Ëpþ@a¿;#ŒÇ=Zlwi;Û$u%ê"úth%©´’ÌFv$Ò«»Ý'˜Þ€â±óÊÅŒŒqÔÀ¤‡Qµu “·#‚Ž1Šxì7Ešw—w2ÿ£N5^q´çëœÕ[‰š4[A+ìc¹š0GÍÛ'5ZëZ·³qÚÉ·!Cgèj¯ö°•Ù˜±àÎù÷ⱕh7«Ô¸Òim¡Õ[–¸g–{[˜‘y„§ß¦jgÉxâ±²_s‰åÜGýûȉ«,.Úûí+æº! 4r=ˆQÝCºl=ì™+g$ç‚1íë]¶÷{ªV3îçšÖ3¾ke(pãa?ϽeJukɼŹàa|´ÛÇçÍiÝ[\¤ò¥Œp™JŒÈ‰´€xÈãùsY—]G3-¤Îæ3‰vI“žýIü…rUæ¾Ìé¥k]XŽâÖõöÅ=Äí†Ü›üæ þÏ&ó™¦Ï¢Èx©ÍýÀÎâ3žw§5•äcæNr{*ô®v ÝÍÓhˆÚªýÖ8ÉÉÏÖ›$£• Í?yåø‚øý9?­IŽCÝîME¡f;Ë©YÒLi a†zÕy‘¶ì‘þêâ¯íp1Œ~´¨ŠèA çÓš—OÌ¥6·2Ù§Œü¨àŽÎ*X°G–«ÎNZ×k;g!%Œm={“N:D2 Ì ©û¸"¡Ð“)U‚1ÄlÝüéâK˜”¤S2†]¬à0÷£w¦Z* ö³8~5Z[Uˆk6$ýÜJÆzçTJ”£¹j§1Ew¨*’°à ÝÆšp#´ƒj“´v_\UÁmð¤„çæ3ϱÇ4Ç·_0Í*°ÏpàVN9ì@±°|ìBÑ(Ù&ìc¨PyüzSfDˆí2!8Ê¡ÎO=¸¤ÜÈpÀ2?¥RJ,M¹"Ú4.»Œ)#‘ÕqVí®#™&6Çò¬¢Ì§†#Úý: ¥…·C&0p+XUäfN)›aœ!”@ÛQrîÀ¼ÓTˆ8—–\pÌß-a·ÚZ3 ÞÌ<áðOãœÔ–îð Œ*²©'3’}}§Šwò'Ù$µgAÿ '••mçu$m`¹æªÁ«ßIx#¹¼µ…[ï)ùØçò¬båÝ÷äç 0?!DQå‚çéGÖfØÕ$tך´ûÝÜ#Ò$U'¶2I¨¢¸´óXÜÜÇüõŸ?Lÿ…`‰gUÙÄ»¼ÓFÀK’y$óš·ˆmÞĪKs¢ŸQ±Ü~Ï-¢9';O¥gê7H¨X_ÂÌ{"œ§¥fmÏEOÊ”>ÓÛ¯)+X¨ÑQêIý¡r¤ù'!¸bÙ#iæåÕ<¸ÀLýæUÇåU÷«‡ÝÇåJ¥‰99ôÍcÏmÙ¯*$ŽP„²…œ“ŒæœnKù£¦8 •èM5+Š×=}帻Ÿì×jÈÃ#l3ãðú´Û´4óiòÈÛ9yïSž•Y‰d„`[ãùlFÓ â´m–Ü–»ºž6o(ÆBO¯Áükêùž§Ì{Kýî—s*´¶Ö8M¸QúýOÓ5Ymnaîtù@1:`àç9­D áx¢XÝ2Fæç° {÷ôÇ|Ö]Ü‘ºÇj–±˜”õ#‚}qúÿZƤ#s¢œäÒ3ï´«ë‚É4l 'Œç¦;~f³ï4xí¢!­B‘ϱÁPxã’y=‡OJÞk«¨æYb¸ €É Çn¼øôª¦ÒÍC¼p÷|±°'Ï_ÃË*Q¹Ñ ²KS˜þΑ¤˜˜ö²‡RÀí$dt<}OéBØù’+ ‘',àº6ÓWÍí’ŒA|‘œÿ‰9éÖºm ÎÊ·ÖŘ^YC)"kÞ)Ô‘à{RÑ3kä›$áU ÿÀ›ŠÓÔ5 [LðÇö]†«æêwî§–A¶Ôñ–$°ÙÏá^jÃá¦Û§v—^ï˹èýc¹ÒMôíêyÆ¡ ë¶¬¡Û¯LIò:ΚÄ^dwžk€"bN}+°¿ðí¤WÙê:¡¼™¶¬Ç˜Î¸çæmÿˆÈÅZÿ…iáM5VY®ï®Ø°‘Ë‚ ÷$íàð3ÛÔW;ÁÔ•ÚVõfëN6»û‘ç€ fc '?6X~´¬òoÚ]Hš¥õ•¼ qn#bø÷`ÅAàc'=k€º¸‚[²ºy“Ê Næ\î9ásœ;ן‰£<ùy“;(ÔuáÍkÑH½0GjZÀ¡¨¡<úRÒ¦¯Ð¤È^)yÏJCry÷ªŒd 9ãÒ€¼ž¾Ôµ©i¾¢ˆã#?Ö”ªú@ÀpÇŠUuÀÑ¡€AJÈøZrŒ÷ý)ÞAnIÏ¥4®·Z^Z,&ñmp¦Vû»» ž3øÕ}Dý²",ç‰[R®ð5NKo³ ×pGónhní\:’xÁ HÇëÈ%¥ç†ï!™îøxË1²œ`dƒò) zz=kÚ£™KÜ,“óv>zxhÓ´·üJ/g©Ý«4’Dp¿1:zõÇZEðæ²2^ÔÇ1È•aVÆæI'XÄ1ãrm’¹Ær¹9Ï5nÏFÑOk¹õ•ŽE$—“ŒtÛ’GUF­åiGñ-Þ+GøÑøSTqæu°çõ§?†/ÎQB9û®:þãéZ7á½&n,5G]¾U7\g¸ `úþž´Í9ô ¤{C]‘3TQ`Éúþ‚‡‰ÂF¢„¥ßy/øÀ•íœ\¬íèÊÑx;Pp2¶`£®{ý*ðð]­‚,Úž¢¨1’„go¿¬CàÆ­£šv;2dË€W8ÎO¿R]øwÂr+ß#Îá£Ê«ÏòÝ>ýÉ>ÕÕÍÓQö÷üj—´›_!Ö—ÞÓ¤U½¿¸–Eéæ /±¸ÿmïˆ4ûÈ v¶÷ ¹Ë2Kµ˜tÈœdûΣ±ð­Ü";7Óæ#æyädቯAøU›oX¬’4ΩRo?gkº‘ÆX±ô¥í1’VQVþ»Ö>fÙsN•£¶i^Ùá”§/#r?\†»â×LÖ¾ßqo ]F¨§‘¼.wåï]Mׇ,ì,L£\²I®X*ƒÏQÓ¨õƒ«AvóBc‰¦‰“lâÞ[9 Oo˜ú¹æqX™S¦“M÷µŸùa¡NUÿ37L½¹³Œ}ŸQŒ‘Â*(¾Zò{`‘ŸïU]>#©ÞˬÝÜÉ$ó¸ ’ÀaŽ 8 «ëîr}ëoKÒWP…楹۸ C¹\w#Ó<ô>†¬ÜÚÏ„þÊÑúAÁ’k–P²±¶@ë÷½=j)µV1–¶éý#¡Ë’Muëý1žÒlä–Fº¸d Û¶Âs¿ž§h56¨ú—ÜIwq@åaˆÆ6yŒNI©ùŽqù~9z”þ4µ´ZønÂÚg!TKpÒúÿ éüë–×u¿ÜÃ%­Î§hˆá•E­¹LÉÁäçÁÅ]Zñ£O•A¿—ùŠ ÕŸ3š_?øsÅ:§…¼1q»®FÓÍ”†¦h•TppXÿ‹ p ž29]âÿ‰ïï ;{ Y"=¼›Ýó“¸ÒArG\ö<Âxf[Qÿdm_õ’êi¾I^”ñÈSÓÚ¼*ø¼eI"}ïÕžÍ&œUý溿ò!’3=Ûj÷°ÃI<…˜~u*˰à¡üé +œ°¥ Äa?Šà²[o•î!¹~ØüE!’bsæôZx•s°Ü“J¡3ƒ>”ùY)®ˆk™€_늶ܱÀ÷õÛžïO)§¯+‰–bJvUH§€äŠUŒŸ˜GÇvªK]t¶Y×î.sÖ“—$–ïÁ©Ò݇Ý?‘¥„Žƒßr¶.tA´ãsR,y)>•b;rFNRÃfårŸPjÕ92eR%E†W8ëR$.ƒ;jävlO+úš‘4Á/-iOs?jXÖRâÝ×û.î\²fÊç?1B?2?¬Ý]ÞÝi°Ûµ¬0¸oP>ª[%zƒÔwööað>¨·é4¨có=Åæ§Ã+²³WÆ9Îâ8÷\ækß³—†´¿x‡ÆV¿|"è¯ÛiϨ°¾¿i0 Á+–)•Ë:ªòA#;a3|³ˆ~Ï™9iðÊß–‡<."•5{Ykºÿ3ÆÚêâÒÉâ´™—`dIu=@~b1ÔúÔÖðÝF¨÷LäÄñ"Ƭ#àd¹ÇQÔÆ´®¬x[v…äÚsæI´•SŽØëzz{ÒK§KwtѼHñªà±@?0aÅzO,ZÚ·(ô]Üaõ¶£îèûõ3o<‹!6¨†a½9ä›=OãÜÖDú¯k/Ú´ûe9;b#L‚0=ºþ•ÚC£›U Ón ›GlÀ`Uì˜p÷‰®Š¹VºÖ61†:¥>·<ý,®|ñö¨Í´¥™ä›ÌÜÃŒŒ~|f¯YØ^[¢]iò„e•Ô7q Ï¨çéÖ»DÒìSmP8ùiñØÙ@r"òHàV|‡‡/Ïwuó¹U3:“•ìr‘éiÒôArMÂðÉnv($‚pI#©ëÍ^ÓÖ€Í'ú1]›â*¤pÈÇ~¿\ÖäÒ¢±BÄñÊŽÕXDn&qÊêÌx=ÿô!„…=Ç;ÄNz½ ™4ˆd¸}²Î1Ée•Ž2IÈüøÇ­Y’VÕ¢2 ‰'y#×¥^– a²T—Mgjw!ŽÖ66,{”óÏR1ÐQõzt£hÅ«N£Wcv»D Hb B«+`zv#©íÔû⪔”Þ=ÐÕ•B§Èv†xÈÊþy$Õ­3Ã/j Pü à÷׊¿ö8¬pÝiŠÄ ¹$ c;ôõ©ör’ÕX§R1z;™ÏªØ]Ì]ïL±2lM’|¥¾˜až×™§éú8x¥”ÌÑ®çqpÍÈ$`ž: Aäöâ·â–XÂ{°g9a€Ý€;Ž1Ò™.’ó‚’}!“ïq‚2ð4J÷Õ­?®£ŒÔtWG ¾ ³ÖožAz~ÍeǘJåû‘ÈëÀÉäœÖf¯ðÂhôä‘mðY€r«¸ 9ù@qÇÿZ»ë‹T…„±å¾fðwêþÎ’îšf"Ñ™%Ä€…Æ}ÉïNkÞg‘ûgF¥Xózé÷ìwÇëÊ<ñ‹å<›Pø{«YÈ!–ÝÊ…%\Ž[ØžÜsëYrøKSŽ6¸Œ| ÂN1׿N{w5îqÊ.#–ɬ%Aýò‹ ã8óœvªRéú£ì—‰d-—ŒðOFînkOa–ÖiS«|Ѥs DW½xSÚÜÆ~x¸Ú}ÿZ›%¼ŠÃr•÷=ëØï~xqå{‹k’ªcÌ‘Œï–Éõ?Z­/ÁÝ:úu»’òR€ˆÀ$)ÿ{ãç攲ºßeÜÞ9¥¾‡“ä‘:{Ñ ù‡î1÷«Ó5ƒ—K)ka±–8hå9^I.3ÓŽ¾þÕBo„ZûMäÁdÊ8# óÈâ²yn&= a†’Üâ’Þ6‡sò‚iÂÔ ‚qé]„Ÿõا٠¤›Z<©ÛÉ<ö8ÇÓ¯J‰¾kpÙm¤Ü%ÚFßlä{uü¨X*ëx‡×(Ié#—ŽÙN‡8ásÖ§K7A´$g5´ÞÕ­YœÚ¶Š’ÈyüéöºYI1$?63•^*£‡’z¡ºÑµÓ2 Óß ®G;…^ƒN®ýkZŽ©\â®Úø~ÜüÌ9>ü×T0ÚœòÄ$aÿf Ãr}jH´²[hßÖºkOÇ!سõg£c๦uÛ'PHxÏÑ $ž¶9¥‹ŠÝ›—°‰¤ o<…¼àNÙ±°~¿ç¥%¼pÛܽÅÛÆ±•é‘~¸ãèI®¯Å¿ |Uá# zÆ›sºŠIay-ü’à0Ldžʞ~V89h&û"]]éS !‚¼€„‚séqô©ÂçN2ºª¯Ùèþçc޶B>ü]»•®GÏkpAÆäŒ^x­ UR™#œsþsó$ Ž~cSoB7.ä1^ÄV§ ïk¦HùsÀìiæ­ô朌ØÊôÇjn]xÁü«c12ã¡çùÐ3ÊO=™OLg¹¥ó”7Hâ¢Èh@ÀdœŽi @‚¥ØgÜÔ œøU#NTÕ Ó^ãÊó¦T.vÕ'–#©sÇÓ½EzÔpÔ]ZŽÑJì¨)JJ1Ý™²Ç(lÊì2p¤'N´ï:;xÙ¦UW;³Æ¥tºŸÃÍBÂò{ u[)^Œk$™qÕ[>ð*pp@<â–Ãáô÷±Öv¼™@&krùç*¡‰\uéž•òØž3ÈèA¸MÍöIþ¶=eØ©É)+|ÿÈå5_íö†!§MiLÇm ¸§Ì ¾¤c¯Ô‘hÚüÑ"ͪ[¤•ýܨÉ8?_Äì¦ÑV8#u°™ã’6`ЦY®÷<£¦8,)-¬¥?h’ßM˜¨WG‘~UB¥IðC§<ƒõüûÅyÞ&mªŽ)ôZÁüOz– ¤©Ýùëÿ㇂ã†`°4»™„÷'s8ȃ<àp?*hüvì#¯?3>Þ¼yé]fœ4;»è.oY¥·’B³y2Gg`@é× {c©­M·%Õí|3 ËΡz!I'Š8ƒó™F“1©ù@V^9ltðž/996Ûë}NØ¥³Kî8iü}qÚm¼ˆYF7ù¾YhûànS·ŒŸ@xdVS%üp\K1%£BÎXÉB[®ÞØ»¾î‰ÚŸD×|âoKƒÉo=ÛÒÚÛ‡gC• W9{<læ]ø/Åñ"Y<-vÿÚð™t÷‚=âæ0q¹Bä°È`qœllô¬ý´¯ª'UJÖ¹Â-Õííà·¶šïæw­Ã!ÚWî°'*G<`u'8­Xu=j%›S’âêÂ@¨,åËÆ ÜÆ3ƒÈÎÓ¼¾ Õa½‹MºSäË/ØeŽO:8‘Ws• 0§qÇ9"78ÂÕ›-‚;©Œó£6ýöŸ3IËEs©.>÷ð…gí“ÑÄÛ–¥î¢q^Ó›QX’kXß0Êê¨X€Aà‚p8Á–†– <èu TmòÒà’=°OZéí¼3}ªéÑ;AÔ.#p!F‘@UÞÊ0p¾c‡wN´¶»=«]Ã¥Þb¸\K³T® DnFÖ!X€Ü°t×m,Ë­É9hº7З mkDsà}CG¶‚W֎똌G.Ç ¹ |ËÁä`€F#å9Ã-<-¨ÝN­qlê l–4*NO$¨cÀG?Jõ_„¿5¿‹¶^1žâ-;E²)¯Ýþó‡¤ql W ü¸Î‹máësUÒ?g%ÖÍÖïa†Þ)^ðùVðlT¶ ²2sóç#hùFAw§Cˆ3Ú*¯þÞ×ó¹Í< «¼ —¦‡’Aðëůf÷³hw„$aÕ ´‘Ђ¹PF|O´ðU“øoê^*³µÕàÔšÙü1-´ír± þü¸ŒÄA7ïï·šõ­'â/…ü/àÛ;xŽÓÄSE³Ùh7ÚdWP¨U4M$…70!‚¨\3üÃ9mK_øEðÿÃwÚ$¿ RG”ßÙ>° ÖÖmq-ŽL7!@dËìyNßš\7oúÝŸBš—¤ÊÃt1|‘pBsÎzÍ"Yi‡ƒf &T½1êqÍv6‹áýBB5;ë8^ê#!ı:LÛˆ#IçÀ| `“‘ÇÃèD’ßY4nÐ޶W*ˬKmV!°SŒØgæ½:yAÍ*ÔySêÿ;sÉæ£xT»óÓüÎ*]WCÑnãAänç$AÐÿõêUñZK›ÙGáZ(ŽNHÈêyÍn[ü?µµÕ¶$xï °Å½ÂŠÙ眷sŽG\Ž)ž#¿ŸEæ½ÐTB‡'Èl¬}Á€22º:zæ¸1¼‹Ž)à Irt”¯ù-NŠ9.TyëT÷»/ózÏñÅ~(ñ÷„´m.ÖÞM~iQÛ_kâãUº•ÚWVX%7¬R „Æ`Hã-/;Žäj¾&Yh^ëÔíí%‰ÜÜZl…ʪ–*ÎxY„g5¹ûNü@í-E±Ó´Ë”À²´ŠXãBJ°—ËY™I–lî88Èô?~×G>Ùx âu‡†´ôí»×¢Ñ&MW åaüØäD|•˜Ÿ278™¶°;üÕl›1§Bœ£5uËw÷ž”s=J²ƒ•šï¡ãž$øk¬ÛZE>­á;»!q IÌ–…3l+e—XŽ Î3Ï8~ øis¡¼×ºí©é¶mÚob‰Bò©*_xnå)žìxÈÃg¿ñ/€¤ßîr¼Ò®cKšt%MùíòÙþ‰‰ÃC +)©z ˆ¹<ñÏ*<›Ä¨ÛJž<Óô&çX¿û$wÖ°+q’êqçpÜÇù‰ü t¶_ `ž ®/>!øn☡?Û1;(Ú0ÛKns´ xéèó ó•§íï(·øíø“C [Ò…¾lÁµÖ5+s˜¯çªÈw)CZgˆþÓh,5MWìȯ½ G#FÌÀŒ•Œ7 n8'8Ç-Òt¬#InuKI#-åM-ÁV( 7ϳilaq•SߦFoxWàß|ws%ׄü-©ßÙYYzÒÂy!¶L༒à…Áã'9$õ¯Çç<3›Õöu(8_í¤”¾äþg¯K˜áõ„Óò3ôýJÎÎÔê—ººÁ¶sle³‘–ÌA!‹#ž½ó~ïÄ~¾çOÑÞžVɲ“òHÝ–}£‘Ô¿Ï-Tâ[íóí ·ÌÛF?-Ž£—PšXz®iÿu¦¿CÒ ñÒ¤y~w!ðŽmWÆÑÍ6‹g¬­Äæ¢Õ®|¨·H±’F•ÏvfØ¹Ü crÁ¨ø–ÒK©¾Ù§lu™”y7 bxþñ ™ ~ñäNáT%ÿ„WUû]Ö’²À¢ré·'îÁÈUwÿY€~ð9ïY×:å­¬¢-:5ä.é@ÜÜœdƒ’0!\VƒJÈÕþî×gG¦xƒÁW·QÅu¥êçýq´¹@‰pEe+Ê– 2Tö—~hztU­î¯+ÝïUå0ïo,‰‘Xm\î  ¨*¼®ë]2FÑÝi6æ6…„±C¼îeN3¹_>Œ3ÎB2ÖÊöæ('0I µµ» ÆB’;ä¶áüÍ;4hëNÞ£ñ}¦vГZ’M ¼d¤ú{5ÆQOËæùÆDá#`Pï¯â/CJŒÛøŸTÄË ÍøTA5ÔnùwŒ ÆB·$w,­•çD¼M±˜Ugš`°;^,1m$e³ Æ9;€ù‰à ¤þRjgšþ5Ãì•ã`èäÜ9íì=)6Û3xš×µÎÏHøßñOHÒ£²³ñƦm¢]l6„†E @ŽEP<ÔPNÔrWo0f¯«¿gO„~=øÅðËÄž6ñŠeÑt­I…ÿ—¤ønkm"ÆD¶¸È“¡‹k¤b5tFw1Ĺ‘cŒ¬+ø[ŸI¹M_â›c¬Gqnt› ๛í*~v_.Ÿ~v„ æFIu àV?ŒüñfãHÿ…[­|E¸Ôt ùl3 Ÿ™!eXJ¯ÌIa—PØàðF\$×§©¥:ªÏSÔÿiO ÝÙx¿Ä>)Ð>0Ûx©ÖöG»Ôĺtrʉ± ‘-Åô—M!L+EµÙAŒ²+nAqy,Ökò Ñmš7Øèã· s‚ÎI÷¯Êɹ–H´çhi6IJ,2:n*;äðàúÖÜþÔííl®Gˆô (åŒ ­G;©PÍóF¤ÉÃ[˜_Ý ÚN«÷JÖ~(ºƒYƒVÔ¼9g¬ˆÚK]N7•ó€â7VeºŽpÀŽ)º‡ˆ®µ}FE¼¸Y ÈåáŠ%†%8äˆ× ¿1-µ@Ã7N€PH%³…¼› Ø1ºŽ`»ÀlãpH?Â8j¯tn¯‘Þéå,¤±Ü™R2pÏËëŽ9ã»·de)TH¿k®ZH§–W]¸*®@^Áž•nÖ&ñwV¶ZT«omh÷7˜1äŒðÀ`rHÆkc¿¹&B$*säGàäg¦ñëÔU­(ÉýžÆ­„à!ß·f7ü졸;—Äc9¡97fÉŒ§}KúÔ/­ßÁ«éö–á•7XÄP³ãæbç÷åöŸ˜•h–Mr}2úYtË©Zä&ÐËè¨$<ô-ߨ­Ÿ èÑ]][Å}5²J`3F¿lKsÑ)uÁ m!Ób£ç‚QÖ<6š–÷2ëPÝE~óGíÁx¼ÕwVRà ®ì¤«)Áܤ×*hÙÒ’W!°ñ¦³§êj6r¼M8yð¹*鵎:GlÇO]oŠöšmî—l“ê··p«4³ÂL„ì䆘Ë7gh'i5FãÁ!Ó·À÷P4©9„[@ærÎk2mGRÁŠãc+µ³ñïÄ 'á> ×þA}mo¨½î…â-CNgò.Û‹p% ñ1ÔH¸ï!¶Ñ(ÆI"œ›¦ã-=yVF2HIcÕ‹riP)È8¨ÚEŒà÷õ4å‘HÜŸ(ï‘_Ñ –*ÈøKI»±ZÇÌI­ø>(xþÞÁ4£â9ZÕ'óE´Šwq’22:ÁéÇJÀÝ/lSw¨öúW>'ƒÆ$«ÓR·t™têÖ¤ïMµè{?l«ÿ xWÑu-æÖMiÒæm*蘗O2–×Ê‘·È„t»”³ÛHAå>8ñ…âè“Áž¹ÓàI$ÛÖ¤÷ó6NÜŒ('œÄr70Æ0Î'ƒÛ%´²A2ÜA#Fèr®ŒAB:W“‡áÌ«ˆxŒ<-=m«²ùv:jãñUéòNWDmÅã½½½³ÜH‘y®©r>ƒ8¥û\•$óšÓ³ñ7‰, kK?ßG °gŠ;· Ät$ÉgŸJ—Wñ:‘¶š ÂÒxT5ÍÌ"GkɃ–H%wPÜà¬a€2¤ó^…óÉ^kÕ«}ëS쥶ïè¿ÌË@HÚÀ ·¦jÙ=ÄZu½Ã˜JDnU’Ir…`3Æ>lŽzgT%í'?¥RÖõxt›cpÐ;q… ОÃ5®2ž®qĤámoµ‰¤êF¢tþ.†µßŽæÓ¡Hü&Æcò>• e,„®:Œ}Nj;jz¶Ÿ&•‹åkI­Ó™ü„¦ì àzÅføbËJ¼ ªx–qsM>ÞXwEls»/¸2çdóÐVÿ…¼á­kQ¹¹ñri6št.Ÿh¿—l(R‘°PÅÆs´zzŠüz¶ySÅÍað*tÖÒri¿4µ>ºžéÅÔ®ÔŸ’iz»”çñuõÿ…bðTº…´R7àÃe® ”'Î(eÙ‚w¸¦yÆzV´›ì‘ýŒ4¿–ýçASÀ<3ÓòÔ^ø/LÐþÏ'†|1¡\éò(Š„Ô`‘äÙ·t޾a˜õ –©ë´ŠçµmKQ†aŸgoH„ZÈìq•cÆ~î1ÏoQQˆÍ²ÊøP¥„Täöw»ß­Õþæb°µéÕç•g+yõkGÓô9´ÅÓD"ðѬñI>ÂP€[*UIÉÈ >é⹘¬„ÌçRaæÈ«ojy-–«rUAç‘xæ´£Ò¤Ö¼Û‡”:  °†vƒ€8€ ÏëN–úÖÕ$ŽÒ$+$mD„írpO#'hÆzžTtäWÏ®es¥Ë›â3ežòED³‰Ût›|âʼ9ëÐcŽOxä“[óÚD’Vœ)Vt¹RÄtç Á\ôÏsÎÑ=õÔ‘A-Á˜B£î«!²³g6á÷ õ«š¼:<ú}Äw¦I!ÃasjcuW%¥PJ…2!C<äU8¹"³¶¦n¥¹:«ßêe–5!RG!ÑpÀÜÿ®¬YjW<†ßX½•J~ñe‘>zÿ $cýêÝÓ~xäøµ!ª_G¢€·r‹³'Ùmæ0ΣåmÎÝß1©®ëÀ ~ø\[ø‹ö…ø‹«j¶áDË x6%I¯†ÕU¹— Vá¤dtB¨–Í>Y^ì·Nk[O¤ÁªÝ^æÛisÜÜ\.Á±Ý+c P¿6õÉçÓ›^Ö&†Òôã,×Ûv[ô¬X‚U@'8Br;Œðkê~Ü¿±7Àÿiš/Àÿø'î©k1HÍ®ke:¬ÌÛ+DJ…fådHTe†Öá—Ê|AûN|VøËñµ­ßOð»_Å·v^´þË…"RJ òŠB0c –*¹Þz¶©òÚû[BŽ–•ý:w€~1=åÿÂÝ-b[‘»L£LÌì [8ß(%•Nœ·1î|[û~Ý>˜Öw?²ï‹ D¯(±ðÔ¤24A·«Æ›e8*2 ÝÆz߯Í?ö˜ø_w·­~Ú:sÜÜié©ÃmáÝ{P2ϾGå79“ »È@O>0 ñ»/Ûö¸Ð'ŸNÑhχŸtÃÄ—nÓ®Ò[ï@$¸žHPÇæéR—³|©ÙšJankœÄ³ÇÇZO¬j õ˜eÒï"‡T·C©ŠåòÑÚJYWw“Äœò e«šÑnt›;›¡¯ÙYj),oå²¹L„åy9J°8\“^«ðÿþ 5ûVü3Ð5Ï xGãöú7ˆdk[K¹²MJßPžDD‘çKÆq+º¢«9ç(:œšõOü%ý¹¿o?ƒ‘øÿÀ_ü9â˜4«‹-ýü;á»Akp™"’H¢@í"çqÜ ¦ÂQM5g©ÇÚ•ïè|Ïs¯Ç©Û>–×ÐÈÙÆöýž×,%YÚi `,ùpÙ$åràÕtËцÿ–¡c¨j:lRÙÜÜêþ”²í*è…ªÄíe§_FÎ"ŽëNšO+Îf‘~ϖëæ2@#?0=XÜbí{éÖ‚¼“1OˆîtÉ©ÚÛ le$ͼ¶ùÀËd‚£aèaÉÇÌMm\|Cu½·Ö-´ùDí;H³E;í1ghT2g ”m\(Qòä“\þ —–I5¨·šFƒ *"*®ÅPlIùI#9bÙ`z^›H–]3]—ì2A嬾{+ v€Ü¬Hlœ.àÀíl²í¥kªVNÉ¿Å=2oZê>)ÕõÉm’;ë[{¸ÞxÔ;*¼-(ÚÄb‚`±ù±ÉôOþÚú÷‡u}& o AâE³½6?‹ï‘¢½ÓÝðFe)hÄmnøÁ‘Ë ñ­oHŠ [k+?&«B×[m"¸Hí£_1vÈj $ ›ŠÈ¶ž RX²eœœG"ƒ’¼‚;ŽH8‚¹9RÑj7RV³EÔ6—nÌbr¹àûUÄÈÎq\„>(i/:ØÜÙÎÎ툌`a~¼ÿ.k¸·¼Žp {ŽT6&SÄ þ…¡ZXÝ3ãkÑ«IÙ¢cë´qUÚY£½3`dŒþeŽæ˜ëæv­ÙŒHb”I*B±7|)C“ƒÏÿ={Xä ̰23ÏÓ4"G\Œ$\”ÆéÓ¡5$íö¨×|X#€\Çþ¿°ô¬}þo#KC—Ì @mà×-Žh¦-‰ õáði@SÀØÍ.̬Cu­.ÌHeœ³ìKò“»üNj޳aqª˜­…ȉ"™\«¦õv®{ðyàŒ÷­) }êû†ù‡LLó]¬x#GÒ/c¸ð¼¼½Žæ5k¦ –ÁãU``Ùa™³'ÊÃåa‚1^^m/ögNTeR2ѨöûÓûŽÌ2‹ª¤¦¢×sŠ·Õonõ›í2ÏÃK4éÎZÜ»¾ÝÇ!B0UA À`ü¼×u¥|6Õ­¼9>¶t Öå!g¸k¤Ã2U[n䎣r®äŒŒóWZÎ}-ö‡«=¤“Æa¸ òçˆÿË7NŒ¼ýG÷³ZZÇÅÛSKOˆüj—¶æ7µ¼ÓáXÇÊ0J®Öù•‘ˆ,yÈÞ+Íxcƒ¯Í‡¤Ý9|+v´Ú_çªó>£™aêFÕd”—ã覛§Ø‹h´ô6_iF–Iš«Fp ¹ÊÉþr1¶ªÛx{T¹Ôž;÷3JÅ%Ôö› àÁs’9/Àé“ÇBkx/ÆL¿´¤’ݬáKÈäk©mÀTv#qP­q =Áé],¦=KZº»¹»Žy&¼g¹" Ìvü½ ð:`{WÎb)WÂË–´eæ¬vN¥ GÚFß#TÒ…ƒÉh··7±K -4,…\1S«áÁÛÉw=:ØñðûIŒAk¨\=ÜÖþT:{ Éÿ-$‚r„Qžp\;¾Éÿ‚_ÃðwÃZÆ¿ñÇzæŸ5柡jY&ªð,~PŒn®eŽÞÉœ ÂGJïù â_Ä}oâÅ/x¯S²ÓÚæïÄsÞEŒ‹$PÄ$p‘Ç#ĤˆÎ@Ú€ÍD#Û3öpöißsŽ´³stÖ÷‹ ²<›œ\î]Ã!X7 © ó‚½ ãš–x´°?ÑÈC$ÞQS¼>x#ÀúûüMñ§ÃKZÅ-Y×AÔ`[]?S“ÉòÖb…™¥BHÜ›vœ«> Õ_Úãö…»ý ™Ÿö)øgñ©tÿþÉwV¾%²MÿÚ^Æ6Së:€VfÇ(Ö‘`ªˆçHßå,Øù”Vø=ð'ö¥³ø…nÿ³‚|o¤_iW{î/´ô3ÇÌWlXbmðùW0̹”ƒ" Æ¯ü1ñBßá{M/„ün4¹fßo5ăDî®…^&(ÀÈ¥O(û”àdcŠì~ÿÁA¾)þÍÚ¸¼ø[ñºâ+dýÞ•7‰o¾ÃaCȨ“æS»([ríuŒÇæâ¸G3¡/qÅ«ÛI/¾ÎÇV2ö›Œ“êÒ>Úñ'Ç?ø+†|{¥ÚÄ~ Ôb¶³ûRY JïK•„’-´RO´E ÊÈî~ôc$“#dú÷Dý“¾þÕºƒè?aßøfïQ°ŸûÇÖO! ,§eÜÎBH%"8dz—Q±_j€æfÿÀý·5?éþ%‡ã¨[iwïu§h2XĶÈ`Æî˜žå6…éJI@ÌXç?VøWþYø»ªxëÃñø«à¶‰á¿Gf-uù´»™¯¤1*o"Rj"•?f*ûŒC÷€µáÌæ…6ý—2òiþG}<Ó.r圚ÿ=7ö³ÿƒu¬|k®OñáÄ}P5¾žþMŽ¥¨=ÔòÍå’Ó´´„ÈI0œƒæIµÓ;WâÚÛö<ø·û9ø¿KÒ~+iz^²uý;[ox[O’®.‚¡ƒÎ1q6Q•NÖŠbô#Yÿƒš¿e­?Æ^ðÏÂÏê–lj)Ô­ÖÆ& ZáaÍvÎÕ!YWþb€z·íÑñöyý«ÿbwÇžÔ´{û?ßZèzÍ¥ì7¶S#m"o6"B"íYÙI'”Fp‚¼ŠølVòV‡+}ÎÉ}GœèÎív?ŸË-Jÿú¥ÕÖŒÒΓÛ0Á.¤Ú®™§ø~âêæyµmFù‹[¢/ÙVC0c±ð¨ŒÍ%^S—CŠT§=›ŸšZœöó,ÐÎÈËʲ6¯CÓþ:ˆ--âºÓd€ +‰N;õÏcÆ+ÊÖbÝŸ¨©V\†<×ëX|mj ò3–¾{s«ž×ÆŸÜÉQØÜïu(Úy$ g8'ŸçZMñH7ñiñÆÎ]°ï¹@ˆ÷ÈÏ8ã?Zñ-'S†Æå.ž!ŒåU‰Æj÷‡õÉíµ oåui'rYØ‚pNq“Øv+Õ¥šÖi)5¿ày•rª:¸£ß£+2_ºÃ!ÈaDз@yí‘Ò²|-â-;S¶ŽÔ]FÓ˜L…cEQŒúÏáÅj³„l¹Îx5ïSœgdÏp9Y¡¡% p ä`šPÎaŽÞ¦¤„E,‰Î#V 4Œ =p9?AApYAô=Z¿væMiqAÏ~½(r®AéÅ"É“Ûó§`ú±4Çž§?….͇åËzÓã9ÏÈEgêÖÜ[„²†3 $©wÚãï ÈôýkFËY×Nk[ÉÑ$hDJð’F:ówcƒìW¡b§žiU·v¯#‘e¹…xÖÄCšQÛ·ÝÔé§‹ÄR¢éEÙ2ÔzÔðFöðm‘…¸kFug]Ù`yË+ ‚¹Áë‚ÀÏ’K+]:åŸMRaw6v¸@‡ç%_qcmÀÆã äÓ̪¤+J9ÆG ÉýüªÐð‰u]9îtû_•ychØ,®ðçªù·tÁ¡ù<ë%áL².µEË+YE7«ôZþ–;px¬tß$6Ý»[iºƒm·Ûi=Ò!eLË xÆyúqÈ5êß²çìµñƒÇ^"›ÆÞð7‡ÀŒ˜âµ×5*•ÝF|·»H¼ép͵ÛÊþ5$ù^«¦xKÂö³%ìzO‰µ‹Û½ÜÞ=2971‘¡L?w²pÀó‚Êô/õ-oYò_Q½–³Ù%¬ qpͲ$Bˆ…Ûs0 vòOcWÉe|/™f±çø#Õ´×ܺþ Ìõëãèá䛕ݶV=oâ¾ð ᇉüOá Ò¾.ÔÛIeÑ®|!âS–~àį¥àƒ¡åRF <ÒG‡ÂGju_ìt³šU6xâ.‰“€8998Àõî:O…Ç›oCÅ{ û<ŠÙ®6‡;˜Gt¾TªÛ Ì>ð$0[_ø£â/‡^0ñRêŸ ~Ûø/E‡ k©ËvdU]‰,’º&]”)`.ýç0êò9âðî8<9ò'ïÊk¶é&ì—¥ûžexRiÕªÕÞÑ[þG?k#Úè­¡ÛHéc+¤¯f’0ˆºýÖ)œ;dS¨\&?.•Íx£â¯‡|;¾Ù.Y”àãjóŽMy§þ>Jå¬lïNåcû»FäŸr9¾º¶?—Óµ×¢±… ¿‹’²v='Çž+ºÓ`û•uH[IžPÏéþãþ<ø®4Ç:v•{5ÕÔ¼Ö–è²Äzt¯==«Ô¼câÝu^(QâI[–ÞÙÅRÓt2Ží†Aõ¯–ÇgUñ–Ši>¯§¢>£•QÂ+Ôi¿ÏÔ¿aqyq/<î7ƒ¹|ÓŒÏRsZ°¤aV2Øz ª[D"#/|zÕI#ÕÇJ* Sªm¶kÙë“éë¾Æé¢}»wDØ8®Ã¼C¥L‘M#O ¦ K! O®y®Ä•T^IgzÕÒ5ÉnØ<×£G^”“Œ­c†®EiFç±xwãF‡¬\‹}NÑìþo–YY=G|þ8¯^øEûHüOøc⻈? >(êpÜ麠Ôcòu)Lmr°´Jî¡°Ä#2üÙùY”ðÄ‘ ”³cpÇlV†šÑA0¹–“¢´lU‡ãšôž&–2Ÿ³ÄÓS^hójeð§>jRqhý³ðçü§À^.øcªxƒÄþ)×üñE¼%1†ú ÛQÐïux”\,ï±(dž<«í HŒŠ»›ãëïø(Å߉¾µ‹ÆÙzoŠ­5ßøI´ÿÁáXZèË Ê|™î!S#A!y !ÒT}Ñ)Ø¢Mß xcÄÚ•´£íWƶÝixð—†/µÝrëP»0ÁomlŒÌM¥c,W`.U @<=–žƒM_jÞ!±·±ŽáRm1­æ®›\³ ØT@´ˆ3Ë¡§~Óz—€-¯ô­âΩ ØêlÉ“ª\C ÿÈnHö¦MŸ2…ž8»¶¾žXâ,VV‘®OÞ?wä“×5â×–:¼äçŠ5ÑE'ëvõû­©Ý=(Â*Iõoô>Ôügû-x'HÕôü8ñ‰u™la‹Nñwˆõ¦‹Y¾c$±ÙÚJp*Ë,ý¾\2Éå­¨jwZtštú„¢Ö[Ô»ûs·’’¦à¬ü»•Y6Úǹ5äzŸí3à[9„ºu‰‘‘ò’I:«ã,B†/»!Ž8•Ìj_µ¦¦ë,6ZaMãäx£ GýôX~8Íy¸Z<3–Vöò|Õ;ÝËúüüΧÍñQQP²ôH÷™Þ+dódxã@K9b$ãœÖNµñ Ã:bÉÚ”(9“€1Ñý=+æoã_Œõ¦`T:í&Fgs“““ŸsÓkÿSñ&½)mBîV‚ í^;`Võ¸¦¹hA¿]Žª5Q»Öš^‡¼xÇö¨ðÎÆ›¢—¼˜©ÏCàüØl‚ëÒ¼§Å?þ$ø¨ýžß]»Šß±Uˆà˜Õ}yõïœ ç,¡µµ]³[©bs—\æ¯Ã¨[Â0 úFxUón1Zsåhè{X|»„ø!Ìû½L¹í5«÷Ývd9åCgð©¬ty¡`äŒSÒº 3\²K¨žþš$ymÀ vãëWÐxNí kÁTcón,[#²ƒŽIãõ¬ià©Ió)ëæÍ§‰©n] [v‘TTŠš ÝdÜzôÉ$}*î§£Ù[[$ö·É&åËݓԎßJ¨ð¼#(Ý— –ïÓ¥t8N”¬b¥ê‹V÷ó[Ã$2$~Y&5bvp TûƒŸz_4ÌT¤k*aù%¿½è>‚¡PTà÷© S&©Áÿ>Õq”™-$hÛ^#éËorbYÇΕT `sÜs޼SW>k$d²nÄ{‡$zÿõ»U8äg}ÎI!vã*ͽÀ,º8ö®˜¾mÌdœuEûhLtÈ#Ú¯Yˆ÷Æ|U(/¥rZGÆöf$œ£¯ ~2Ü>% m“ŽOsÐuéø×]9E#šhÙ‹QdP±8 ÐfºÿxÐÛ#éZ›I>UÉÈ>Äßp ï´ARÁšEbB¦áŒuéÎx«Ö·x}ñH0§c¯ç^D¡;£Š¶!b߯˜ƒjA1gºÁv]ÃFGLâ-Î=>¢¸qeqŒ¬DúçŒWK¥|oøXNú‡‡.å.¬î¤#xdà€duÁÆ*êþÔÞÿ„þ3ᎇšM!Iîl#’àR¡¼â7¿x),¡C^V'—Õ¨ê{DïØí¡GF’§ìÞš„Z>¥>6nåºSÍké ¼]óE¢\…PK³Æ@NMhøÓö³Öu¹ìßEÐ|/¡¼ ¹4Ý8væI$iZ?õhÙ”ª”U¨víæ5oÚSÇVM§¶µhèNNÛ1ƒõ_ºyç‘\ÑÆe°MÊïî:e†Ì'e¿ÑtïÙ÷ÄVÑG.»fÖÆX"¹Drw4R t`=UƒPGJØ´ø;¦Æ—²¤Mp /å’v†+ò–ê¤g¨9èEx]ßÇŸˆ7›RO^yh¬0~í=—¡“ãW§¶û4š¾¤Ù?1:ƒ€­tRÏrºkønÿ™ÏS(Ìç/â+Bü>Òñ>£~<”>QI\-À-’OÊ:ÆsŠƒPñïÂÝY/XÇzÂ[H-TË“ãe;G9GÍ|Õ'Œ5©îšòD¤fË<Ùv'ŽI<æ«_ëÚÖ¢ ÝêM´œíNgS‰¡þꊎA'$êTlú7Sý¬ËGŸÃºg†Ö;+‰…ÁåŽ/*D °†Uf AÁ]À ƒŽÄ´×Š/Lq³i¿¸ °:ÂÒ4jX·œŽI;XÔõ#ØÒ ¨ÁÀÜ>´ìîä¶zK‘l…ï²Ì o³çÆ}Æ*hÄ>Ybê¸è ëYí&ßâ==)|õdÏÔVѫʈqe»™ ÞªàñÏ&¤)jñ‘sžµAæósóuÒ*§*3ê(ö©>âä×sZ=(Dxï`+";I%:ü­ÆOz{ZL±‰á$¨ÿYŸÏùâ±ÀvP¬9ÈÚqŠr\Í‚÷.G¹Ïó«h.‚•9.¦Ù‡R·E5»e.9ÁèiÆ;´ˆÊ`*¶Ö;zCéYÑ^ÏtàMs»`ŽFLU„—g;8ãå®…VwM¢í¼¬Ä©]¸æ¬=ä’¤f ´Óý}ª­äÛƒ€»”çî gßÖ´´™£ó%¹ºTÈÎ3’8 tP=qÇÖº)·²2šÔdQ–çñ«0mQŒÓn•¡‡½I¶»Ò]ëÇ¡éùqP™Áb°Oñc?¡âºQÔÍêh§‘ÛÒž³¹'ŽÕNK®ÕrÍœm“O+¶ØI<RþζRVÐÍĶ.¤ír¾øæ¬Ùê\+Ä»Œ›žP>vo @=zc23(áÐŒõÍHŽb`pNî˜jã6ž†rŠhóo$’ò¥0 h@¤t¤ÜÙù²3H]˜m@qÜf¾5¨ÛcèԘ∲nÏ)¹'£ŠC ‡«}2j@è(ôÆ7ònëÖ=q×&Åô¤eîâ\P ô­9õmÁüé¦eÎ0hkÌ7QIÏ­-àfŠoA ÀN„ãëNû@Œ‘E#ç/ëB“а÷bn-ÑóŠBÌ?O¦ðH8'o¥&ÝÀOºß{¿íáyYOîÐNÜœTk†\³ûU)4’o“yÁr*X¦Ý´Ôà“ƒßëP •ù=}E(·Ê{ž´ã&„õ,DBž@öÔ·qíe‰×– ŒŽ*§™"Uºt¤y¥ ©ÀÕª‘µ™<­Êè²²©TB†ÝŽ9àUxèxô榄;˜œgœ¯š’Üm7¡b;ˆŠñÈïš¹ë°1Ç8È=ë6K˜d·–qž®ÿZ¥·glȧß½9êdâjA"rßwè*Ò>OB;u¬È\ô>½X†TTÉrþ¹®ÈTæ9eêdÔn ±6Éó7¡h†U°ÁúŸÂ™us5ôÆG%Ÿd1íQŸaôâ©-Ë1ÚNÑŽ; _µ²œ3)ç®+u;½L¬‘ ¬ª¤±Œš‰.•߆ Áöªâ~A‰ëœw©bØw(6r@=ÍW´¾Âå,¤Ž¿#)û£'ü÷«Ð¿3Ň y¬¥”/Ë’=Ayo\B±ãÚ¤„äÖð’LÎp{z$VžÞ”±…çh¥€ \ÐWÊžÐQE„dbÄ„äæH(êÊ'Ò‘yäŠkËÀƒš’: Üc" nÏçO €x4P! ÀÍ ÁºRÑ€: F`¼šZF]ÝÈ¡Woz‚ŒšéAõÊ¨æØ €: (c×,>裠¢Š(Ëq$pù.2H8ÏÖ˜òÎy{--îÇqD²q‘úÔ¢W#$à÷¨dg=)b$¾1ÔUÆm±4¬\[‰‘²£§¨©c¾•°J)ÏmµYFâXžEH ®ˆÊZ¸¢ðÜ_pö&ìœò«™Gü Ns¸cñ®ˆÍ³’,Fà7'4ñ:¯YJ®„t…H&0bê+x·c)­t'W3ƒžç=jxn¤'ÊïpI=9íUÁÈÍ,N‹"»E»W5¡“ÜÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ýü¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿§ÿƒÃtø3~À±œœ>,¿ø)ªÒÁã–(ÛWþ îÌsÛâ±ÿåM{O‡s”íì¿òhÿ™æ¬Û×Åø?ò?m¨¯Äi?àñøÑÊ/ü±Î?ê¬þTÒÃÿŠ\JÄø':`tdø½ŸÇþA?êþo{{/Æ?æWö®ùÿþGíÅøžŸðxj•ß'üÙWÔ‹}?ò“LÿˆÅ vÛoÿói1÷™~, /þRª¿Õìçþ}~1ÿ2µ²÷öÿþGíø–àñ< ÿêØ êÿTqôþÊ ÿÁâÑc)ÿô'€>,Ÿé¤?Õìãþ}~1ÿ0þÖÀ?àÿÈý´¢¿[þ‘Oü£¤c¹ÿ…¶GóÑéWþ‘Îþ ÑŸû«ýè£ý^Î?ç×ãóö¶_üÿƒÿ#öÖŠüOOø<&á€/ÿîUúü\ÿïMLŸðx¿ÿöQÿukÿ½4×gOþ]~1ÿ2^q—/·ø?ò?j¨¯ÅVÿƒ¿âSøw¹ü>+ÿ÷ªÿ¡m£þ ìÇÓûÕGú¹ϯÆ?æÛ9wóþüÚª+ñ]?àï‹§?'ü¡Ï¹ø®ùS@ÿƒ½¯îÿÁ:Ž?ì¬÷¦ŸúµÿÏŸÆ?æ/휷þ~~üÚŠ+ñmàï+¦\ø'{Ÿañ[ÿ½T¿ñÈëÿðoü:ý?ò•OýZÏ?çÏãóí¬·þ~~üÚ:+ñtÁÞo» ÿ÷ zŸŠãÿ•U*ÁÝ%†áß¿—Ålÿî*šáœóþ|þ1ÿ1måŸóóðä~ÎÑ_ŒÿvGËÿÁ?qèOÅN¿ùJ¨¿â/+ƘEüÃpÎ ?ÈÿÜM/õg<ÿŸ?ù4Ì?¶²Ïùùø?ò?i(¯Å“ÿ{È”ÿ‚}FävO‹E¿–“ÅG?üñ0Eÿ‚z$vø°ùSKý[ÎÖôÿ™_Û9wóþüÚª+ñfø;ÖúUÞà‡¶üYÏþâEOüË:†Oø'D‡'?¦•MpÖx×ðÿ˜¿¶²ßçüù³ôWãÿÁÜ×±Ÿþ ÜÃ@ø® –•QÄ^“ä©ÿ‚y8#³|U#?ùI¡ðÎx·£øÇüÃûk-ÿŸŸƒÿ#ö’ŠüX?ðwÅÒɵÿàžü-ƒŸËû&•¿àï—QÇüÛ>¿ñuÿûÕKýZÎÿçÏãó휷ùÿþGí5ø­ÿÈNþ æOýÕþõRÉÿ¬!|Ïø'È ßu?álrò•Gú·ÿϯÆ?æ?휺ÿàÿÈü2mFÉmÑ.$¨3“ùãôªókP§É ‹äiGðÖmÕì*¬gŒ}à?J…˜Ìr]€ô ×ë_ J¼º5=Ë«ªºÃ½˜à!P?NjÀÕŽÒžk*ž¡{þf²U‚ޣ޸§ ‚ýæ©yD§I3OûCIehŠYqü'ãñ©Ä6*BA£QÔË&+ ¹$r߉©!wlГÛhÍ5^oDK¤–æ™ñ¨ ZiVñ“×#ó©m5=fíLª‘© €TmðªQ¬(7Úͦá•ûLè¤þæ«\êQùÞ\:¤÷ƒ$HB~ŸÃ5~Û•ûÒ×¶„*jJñFÂÜ^)!®#b:LŸä)ÿÚó[°óŒ|ôõë)\¬ÏrMH¦(ðLX'¾àjÕfö`é­™´úåÌñ”³‹/¼GÞŸÚå 5Îù g*÷Z~@sùÖ,W“ÃÌ1(8ç$ԩݸÆœñT«+êÈt®´GFºÝÔvþOö†¢ÆŽ= 9?ʬC¯¹[ø}°§ük“[éÉÌ‘¯à¢Ÿ¡ëýj±2¹V‰×'‰%ÏÍ|‡ÛZsx°2¬n„¨a‘ŸÎ¹4Õ˜ ª¿>=E‰Á8öÈ«úÔšÜÏê±:íøç~låöýçø š-f#š-8-œþ•É®© yIf^G[ü k€œÆç‘Ôb«ë2Þâú²g_‰aP<µT9Ç8?Ö¤ÿ„†i°‰9÷Ú?*ãg¼PŠcœzгmq"DÛ±íV±2l‡†ŠW; [ø'¹(Ó‚àe¸Çô£W–æ(¼ÿ´¹íÀ®Tk׬;s–” Ÿ\cj?Ìm ´ÖáÁ<Á{æ´Xˆ5g¹“ÃÎ÷FÆ©–8¸q'?*ćŸÖ´#ÔìÃb-ƒÕךåYÕÞ"-dt-÷q3|¿™¤…õÕpâþf9'&fþ˜¦«»h†§O{©Ëkú|V°£ti$ÁLÖ~£y¥¬~lwcÿL˜`~u“$WS±{¶–Fn7IüêõŒ7I–štr td~B‡9MÚÁìáˆ-µ]Jõš KhAÈÚ…ñÏp££n ô¨²ÇžÍ‰ýXÒØ ~ѱFOtµ4öþ#¼l‡V'ï¤kÇ·"œ`íÕŠR6–Dd^¼FâQkù™íñÏ|ã5Vk¨-ɯ²Ä³Ã§1óÒ¬·„µËӉ亜g&2øúá@«0h¥¢˜ÍQ÷HÜZ¯gQôüÄêAuFt" K§Áçæƒo詖Ѥî?9CÛð­4½f_ÝCd~SÎP~•b _˜cʳÔ*ªÔUÆ›} ÝUÑ£Åän¯úP²1yŒj>iáz“õ5ò‡Ò½瑘q‘I»þš`c×4»Ns°š<¡ÈühµÄ:2„î O*£åÛô"¢Žóy^|kǘŸÊ­[é÷wžÙ£A÷œÀ Ö‘Rz&ˆnî„H!(IÝmÖ9ìÅ‹f§TNëÛ¨4wàßýí¨xö9Å)Uˆì’M­º#'õ­\aË+²%&Õ hóµä$7]ÇŠ˜YÃÿ=ãçû­P­Ä2`ïÙˆ«6áJä8lÿwœÖñŒm©ìtzEÕÏ6Ís€<ÁÏÒ¥—@ÔW‚Ñ u- §$wB5ò|âCcljGæ*h¬nå#þ%òr½ƵŒ"ú9µÔÏšÜÛIäÜsŒ¢1ž1NS¿*0=ën S‰ ¦*Ì^º|¶ÁÓ€;Õ¬+}xˆ.§5öI3–V#éÅH–rgýYZêàðÄ„ ÎzÎjå·ƒ ¬v£dFÒkHàª>†oM#ŽÂäŒìëRǤHÊ Zîáð ˜ð>ñdUè< n»|Ù×#Пð®ˆà'k´a<}4pvúsÀ}ŽâR)×zv§|àÅ 0(<¢EÇëšô8ü-cß·w< 4Kaˆ›9ì?úÕаq³fg{siáë¾HËsÃ`šÑ³ðØ` 8cƒ¥w1éqIæÇn2;µM•¬2y¿c#£üêႌwfRÆÊ[#Ÿ²ð•£'™vб…˱^ùõ«çº]˜L¥ ±îãñ<õëU"]Ù2&1½€ðÆéOû+…Û¸ã$¨A]q£¬‘É*óoVÌØ´»%bÖ $l»JÈ#ßþ8³ÒâÚÖùEÝ’©nxïœþ˜«ÑÛ•rNæ>ùãð¥TÁÚå¿àGš¥ºê7Ôa6¨Wj ,xÂc>ÜRª¢pdNíþTàñ ‚°Ë“ƒŸÃÒ|5øYã?ô„ÿth/3éžý©¾/ÝêºÖüë‹›=gHÖõN×z´—§P[‹‹u.„)ž%Mêû@baOŠðøæã‚”T—IÝ7éÓñûŠyOÕæ–"ÿöïõsò,BO;Zx„€søÓ•øzýjAŒ–Ëd{íë¨Õ-ONÕ"Èì?z»ˆ]Ã8©0¤\TðÂÀÀú­kI™ÊH‰f¸)µiäe8Ç×ùÔðyÞGúUÇšÙ,ÆIà `U«kU•†ÂžœŠÕÓ¼=wtXCnŽC »Xœûôâºa‡”ßsžuc̨nD y²àc"· <Ô‰mi¿úfXžYã?ã]¶‡ðîæà .lÕŒ†Œþb¶­~éȸžG*x øšôiàjÉjpOJ ó'‹R€âÇO·-ÓçF_ä ^ÓN°±º‰ý!-Àü«Óíü Bw-¡| a›#ùUÅÑô!Ò-ÔâS[Ç/’wr9¥™Bß æv¨øß"»3 ÁôéZvzMõÏú½:bÎà‡§å]á´0c†(À_”ùcŠõ? þÅ?µ·ŽôÛ]WÁ³§‹õ(/¬–êÖ{MWÀßv@Bœ©ã抟TÁ¤ëÕŒ}Z_›2Xšµ¡ž iáÛ’¾tšk¨Ú@?AÍj[hKFž4?9Sš÷½?þ ±ûw꺶›ì»ãu–æBµÞˆÑ `9Üòª£ûÅ‚ŽäR|bý€ÿjïÙ÷[µÐ>1|&m[Ûc5œ²ëvRÁ2½¶hçhË.Fåݕܹpʆe”{UN5àäö\Ñ»ù&L©ce.Geäÿ3ÃãµhX­TƒÃn\ŒûTžL낱0ÛÓ¯Lðw„¿esÁsë/øãâý [ù´Ñí¾E¨ZÉ \€nÆ£íb:›|¦üaöþ¿û ü!ø ãý9|AñãÀ­éž&T–‰M« ùmFÖCkÜ×QðG–øÉÊÈÀ¬FgC IÂO—û¯üµù\ˆP©RI]+ùŸ)æc’®Iù¦0•~C‘õë_±ð·üËÃ>*ÄW¶ì•*Zî*–¿í!›qܹõYtaƒõ®¯ã¯íAÿ¼øKð~ÿÇ)ão„^1¿³HÕtü?Ðå¾¼ieUýÊ;B«bÌT<–À>ú×:µ•:8iJúu_œmøßÙ¼°rD¾ïó?0neÈôžÅK ăëÒ»Ÿ4/‹ÿuOx_áî‰á« ¥)i§èH²âVo.Y!WtY™ ïòÈBF@ÎIäR1'úÅÀcÁë_YJr5)+7Ó±åÍ(ÊÛ—43LÕµ {+ïZé‘Í&Ùµ õ“É·@2]ü¥‘ÈtUf=’qU4»{piÃKÓonŸV¼{m:Þ >S-Ë¡Pâ%*<Ý¥ãÈRHóã#¿ýþÚÆSøËãƒ|%v¶F{ ¯ë&ÂÊò_1ìâmŒ©!¸nÀ!O9¯¡µÙ·öæý„¼3¨\xïö ð/Š4­Ôád_ø^=jÓÙÃ+Çm6ØíÈFp¤$г1! yØìl¨ÏÙÒœyûKKù¦ís·BŒ çVqî¿'£8?Á%¿à ^<ø-gñ￳¦£w¢ÞÚÍp–fòÞE9^?øó–E–Bá<Äò•÷£¡\çɧüçöì1MsìŸãñ êì|3>>C†À+Ûž•ôWƒÿà¿ÿ¶G„4µÐì¼ðèiööÑÁ¥YÛé‘Cch‰F‹uª"ˆÆp$×kàÏø/ïí9¦Î×þ%×¼ ¨-å´o-˜ð…ôkm6uWûQn€ñÓ<Œq^\á¤ï‡„Õô³wü.oì2šÜ›^¶ýl|-à_뿳¿Ä©.üoðSAÖuM$ì—Þ?Ò®ŒV³2«-²ÍæØA .åô¤zï‹ÿoχ_~ëÿ |oÿúøK«¨ÙJt?x"ÉôK­.ôçeÃyÈŸ/îƒ m¤1!ˆ¯­þÁi¿a•ðÍåÇ¿ØWKÕ5«½]®ïn¼-á]8é×ÏÉK§ŠéÄžxó$¶îK~bÅß¶?Ä/ØÛâ/'ø±û*ø#Ç>ñ§®ÍWLñLPÒbF29ÐÚ¯îðÆ # ©Ul嘚êÃb1yŽ%,ntÚµ¤¤Úü-eßñ3”!‡¥ûª±kµ—õsÂmeŽ+‹mGTÓžvFÝ4 GA‚!Ôy@éÍ}kû<ÁLü-ðËÂ:?Ãþ̺ri–Éjº·ƒ¼U¨h:€áfi¦¸·2I&XneasÔã*{_„ßðYIßE²ð—íû5|*Ö-t=+UƒáUµìÖÑ¢…1}œÝÛ"oÀ}ñºª• DCŸHü)ý°¿à¶‰WIñ÷ìñáßYøpE¨Å?ŠìôÍ*ÎéŠ4$‡rÌ“l|ÈÀ1MëÇœã13ƒ£ÁJP¾ðíç§)®IÚT++ù«™_àïüÛöp¸Õ£–æÓu¤é¯ŽµíUƒ¡ùOz¸yðû…´11<°‘ÀÚ½Ž³ÿÖÓ¾|Cñ–¡ðãÄÚÞ•áöoµ¤^Â{qö{‹‰o˜¨U#,J«!€ð¿Û£öÿ‚zêtÛÙïã/Âÿ†š}Æ”×3Ùø—Ǻ€:‰¸;’ê(¤I™!S÷ :ÆÀ2쩯™> ü(ñìÏ¡èþ:Ñ?à£?|a6Ÿ,°iþð—‹5Ké_p€›xqr0VØÒB¤‚7eq^8{*ÆSŒðîJO¤Óüãuó=˜bðó|ÍYuVýOØ/‡_ðWÝ â§‰ôOi®ï5]— @wu¿–aœ5²ËVI$W "ùoV`7”àÿi¨?e/Úâbxãöœÿ‚qür±ÖumiqøK´žèÙÀ›ä bµ–HШpÊ6±c#O–¿5ÿg?ø,Çÿ€úøGá7€¦“Lµ’Î &±½¤µ`ÙGeºùùòþvËb 3‚ké Wþ Ëÿ,ý£%ÿ…M |ð\:犬V]?ÃgûNÚòÖ„‰ôw]G PÈŠì¤Í´ªô ù¾Ìp³^Ö1Œ[ß™~§§G9Ã×O™¶×NSðÍJ©~uzÆÞ HÜ›yë¼|z b § p 5b $Fr pM}ä)I=NN hËZv…Ü¡FÓÏPý«¤Ó¼ .Áe%q€ê…†?½òƒÇ5…mÑìPÒ ½ ±þ] vþ ×k(3³Ã3…#¾UH_Ò½\-(JI4y¸š•!¦K¥ü<²µZF Àóò’G¯ÊFEkXè:mа(ÌIùK(àzUì $ÚŠ9ázSÒc—¯9ëBŒ"ýÔxó­9|Lˆ$J ùc³J'„’6 ¸4û„µEoýÒ~cþ®i:\Z¥°»]"æh@ùd…3Î ÚÊHÁ^‡ŒœðEræún×­ð¯OÖÆ˜\4ñu!¹Ø| ÖfM'^šÿö”Ð|c©é˰[ØxFâÚlîÞï,û±*ù·]vívðŸÅ?ø#ß„|M¸> |_Õ¼¹1oiâ ˶B*ò¬Rüà‚¥]pÜÆý+çãð¿Gža¦Dò–W†GòÄ-ÎÞ@®û¤}îxæµ4¯„þÖäµÖäÔg‚Ú€·¶VèͨAÀr7?1 6|£ás,û'Ç·ÍR¼SV´%Ê—žŒ÷ie8ª1ZCÕêÿ#ëÿÿÁF?àžß ü+ÿ w>kZ'Š"[†µÓôïØF–ò:yaVñ;#+8-åÇ”ùv©$V׈¿à¥ŸX¨¯Gcß~ÿÁO¿k߉Z~Ÿà_€zÇ‚µ(4ߘ5øóF»Ò kÈ"ŒmY^þi.¥“Ì óŶrÈ:/MãÙnø(7Åý~Õ¿ôgSr&¦|<ðbGs;ádyZý%¹qÂÅÀvX›jïn|â?ì1ÿæ½ð¤·^ð¿Ç¿ É$è:ž£…ÜSHÃþå–6u sæà¤n‘óN¯û¯›£év3K,hɦ[,jŠ.õY2Ì$bå‰5ðǾ;þÙ~Ô¬u¨üA«x‰|>ñ\iÖ~0Ó£×m´÷‹˜ä† A&ŠT +ƪáK( DßðRoúŸ‰uxßá§ÃkºíïÚu-g^ð,Ï#íU ÚNÜà¬OìÐÉ8ž„L5V•õm­û6îסÉ1Ìdaa¬Ie“Œ„ŠÙ£D(á@çÍ{Øj|gRž'Ù$úóK›ÿ%I~' å—*œÐ¿§ü9û'ðcöQýhš·Ã«ßø'«|%Ô®4ô†ê/xEb˜1VH¤¶Ôn¬ÜÈ~\4…<ÄfÉS”føÇ[ÿƒqÿiWÔµ;ß|]ø°½•´ÝëwwSÃlI1¤“ý•ŒÚ_b‚A;W8¯‰Ÿö›ý§.¥Yfý¤)ýµ,üK%¢ZÝêñ‰u9å°’DcÉmr»ãl PIW•`<ïãWì{ûFÁ?|ÿ´ÚÇI{«¸´³„õ«Û+Û’ìË]ª‚E]¾cÜÏ'°™ö)`*ãáR´ôK•ÆßuŸâa8ÓŒ”©ÓqKÎÿð×ãÇ‚à™IñQ<+â/‚~ø’c¼Ð.æµ"vù–]RvdWnZs!Œmc…\ãÒÿf¯Ùkþ ;ðîËY¹ý¤>1ø3Ʋɬ2ø{Ķ §9‡Ëya²–61ë î}[À°ïíEðÓÂm¤øGö²ñ„RçTšw³Ó59ãµ TóØÃx¾ø¶–†UpíŒͳln[—b'œ8[ºÿòUoÀú:êÔ‚sçéËþgIÿ¡ÿ‚wþÎ_±ƒ<1ãß3ê^ñ&¡â8¡“DÔõAwk Òo…ä$–F@ +‹g©ó¯Ù‹öý¹î>Jß ÿfƒ¿4­ Kcg¨_ü-ðôÎLmv‚ n# …bÊìø`7{âg¾ðö©gñ£Ä:³âëÔ"ÇÅÞ6Ö¯µ Rkxćì–Ph˜»Úî>Rì¿Å¹¦­Gá[XÓpªGpsÅ~¥Z³Æž5t9›/ eÔ4d\WG¡xy4ö3ÈûWÅZ·³Óí¹I€F?‰éS 㺛l,T«»$ŸÿUuS¥N%Jõ*,‘†Úàw=ig¹Š;wci6F͵zœ ãëQ(Ω´…<ã j©u‡ ÖÙÉ\î\V’”šÐÅE6ZÐ mQãÔ–ÚK­åY¡^UW ì}„óÉÉÿCÓ´ Ø.&ž[V¶S&M¼2;¤„UUBçq£ zu9ó»i¦²+,ÝFr¬Ë޵«¤üI×m²’Ê÷1<¹’;±»py<§nFá_Ä9&kš(ªU,~˺»ï}W§D{™f? ‚½âîúö]ŽîÖÞ}VSdu wÛ*C²7ºfÁò°¤üß7AÏAŽ@=W†< â Ëi–ºkÏ ”–ÌTàóN„ãŽøàŽ+§øOñ—Àvß ¦ñGĉ6BÊo6ÛTÐmõ«ˆïËEÊÆÎ .âÊ‹Ë>v*±]?oO€ÞÔ—ƒþë2é‘i*Ít¶í-÷#eÊDÜ2‘‚Hà:†IŸWªá Ó½—Ýv®}lÃi©­N£Ãß³œÚ'…tˆ_îÛ[áŸÇ sâ_Çxþ|Ðmlt«W?Û^,Ô4+ýqÞ%>\µ£)1åÃ`³f‘€Ÿ?þÓߴ׉¿ioéšÎ³öÛ]7CÒ£°Ñ´«½Kí?eAó;Ƥ³z"áQ€×cû%~Û¿>C§|.ð§†t{­"ç]"-K¨Íæ/— WI#7ab‘ÊYC¼çêaÂ0ùgÖ*GžµŸºÚQ[ù½:é©áÏ7u+rSv}ïååò>§ø«û3øŽ[›«¯ˆŸüUâ¸ïbn,àÚÇsÄʱ&Ÿë{l– QUˆÉuÎ|òÛþ çâÿ]‹?†÷Og²d¾ÓO“+l'›oÌ72ªá˜Ë9öþÒ’x£Z´ÓOÁW“W›TˆéÖz„‹k RO2’më1eÀ}ÞaåYW?H|ð‡Ç]@›Zñ¿…¢ð{4ɳÃfÎêitÔ33%ÔgYFÓ‘"„ 0*Ä|-h׿唕»)/Ñ´w,Ej*ê.þŸæ|áà_ø$ÅY¯ßIñÇ K°IWíºæ™ ÕÌÅ€“ÈI"²’ FFîôO‡_ðHo€¬&Óâño…_\ê×öËâ—оÝ,’˜|Áßœ–,jÙ!‡Í‚pr¡H#§ŒÄåñj„Ú»»·[ ´ñÒ”éó7å¢_æ|Sñëþ ð¢ëÆÒi?ô++¸Ó%Kxí|hXAv!2ª²Ý&er~]‘ŽœúGì™ÿðñ/ÀOÛ|)ý§~|#ø•¢Ë}q0ž÷JkVÅdUv"é­ÚY؇!”Bñ Ïò¢§Ñ¶? ü ¬4úލ·s¦ûKY¯tÑ+.r#«Ü.õê¡HuoˆñÎz{O hR@téõgK‹gŽI—$t*€6X€2Áp®3°ŒU½LO昊>Ë™Û}wû÷<ßfœ¹¡½?ËSó»þ ÿ½ý“þ|ºø»û>x«Æšf·d÷7'D¾[{›kâPJ‘£(…­ÑT–qå…,WdþÁ¶Ÿ‡¿m/Øsž*ø‰ ÛI¬è¹Ñµ8ÛU3Ës5¬!>ØX•eóÕÈmÃ.ܰ|«_kvº²]C,A‘[J[QÞD»˜Ã4{d,MÎøB+Íþ~ÍŸ>øƒÄú×Ãí:âÆ-]à›[ºÑþÓveíædXàIµt`OÈ­# ‘IPÁ«›–k”:›Ôœ]ãwòqmÛN·0¥Š• “-¯¦Ú??Ð÷Û¿µ½BÛÄ7ZÔV:˜"ÚÚôªÍ4Q>×h_ »htÜцÀÛ– +ñƒþ ¿áŸŽ ý³|QàoŒ¾$“R·´n<#qÓ=¤šd¨OlO”~Cƒ´»r¥IýHÒuVñ´w‘Nc:© ²Ky'‘ãÊ‘‹ù¤«"©\Œw/æ?঺ÀïÚöb×¢ñ§Â-NïÇÚ-”ƒÀ¯ae,×Ö—®À,e y.—WÊqÿ=ó8?ý…žBuðÖS÷9®¯³Wv^~GCxlvJ6ŒÖ«}Qø©¦Igm{·¶¿hdS4VŒÈ¹åw®r8ÈäuŠû·á´ðK¯Ú¯QÕnõ­oþ™ŠÑeÿ„[_šËO€I,¬ò}PE*ë&4ãÜ4Dü«%|'%¤ªÅeŒ¡‚ƒžôyduçð¯Ü3Œ––qJ?½9ÇᔚùjŸÍVS ̹T“Ý5sõÃö(ýžþ ü<²×4ÿÙ/ã±×á¸Keñ›?ˆí®ÊÈ$ßÜ+ @GµAU w¶HùÙ¯¾i¿uÏxiôÏ­ÅÂ\¿îäËþ躃溮ýàU޳de—ð‹Â¾.ñ‡€µGÖü âCEÔBµþ•zðJT2¶ ¡Œ¢œÔJýýà¹ñø_Á2ÇûBø_YÖà.Ÿ§M 7Ú-­•¥ÙÓ-ÁC!GU‘Q°dm`EmøáŇ…§‡u[ÿ \Ŧ"[iÚ}ՃƾDr¼Ÿfž9Ä…vöm˜03ù‚B¼¿ÄŸ°¯ü/KOÄã=#¾%œ½ü)¨êöZ¤Í(!U˜:Ã#<—ò™»&Ü2 ¯$Ësj•ªFJ”®’²jÍè¤÷Ó¾¯Ìçž.ì"£E©KO'uÙw6þ7ÿÁv¿nߊ 5/„ÖZ¶‡á¥Ö-|›­{C†t¿ÚvŠ'’WX2hÐH„† ¯Š­4›èìV§Ìp[! u€½ÆO¹ÆHÑ‹L¶%…ÄCÚ ¾y>gsŸÓÓÓŒV†—?‘¨[ÜÇÉäÝÂÿ¸˜¤£k†;†ÂœppköŒ&Y…˨KêÑå¿Ï^‡…SR´’¨ïc¿úã OfØ©i$—e§ù³JY}­¾fv‘¥ë %½õÝÄvÅâÝ7˜˜À«g$õ##¡®»CðÞ*ºþÉð¨iïM´· n¥ÛÌXÑÂ(‰ ­Øýß˜ŽµBg½Ð}1bdˆyqKç9 G\àû}+GE½ñ=ô2øD™…ºIqun<¤±oØÒIŒ qãqP}N¬Ö<æ8ˆÕŒ­m×Gê¿Se¤ààâ­ø¯CÎÝç˜ L„*y€àŸÄWI⯄ áÏé^*]rÊíõ¤{›ua%–Ò +åFâC©ã¦ìu©?ˆÖÄ6tûGrŒÛžÔ0FÆw䟦{ý1¿¥Cîµo£Ãu§Ø¤,oââÑÖ-ËUœ˜Æsº2ªW9’>€±¯v¿×öÔårÁ|KGGÐ祓RöR»»èû&›¡]êwkg¥Z ¥+˜â@w0äž³[‘üø©¥I«Xü?Õ¤´EÜ÷VÖnQWY€à{×o†áÒžÙ¬ ¢áäŠÞQ&ÿ¶J›wŒ§*ŒôÝ“^“ð»âÞ«ðòxu½Æ0E1HªA`‡PŸ»Žü÷Ž9ëqö/Êòô½ïùØÚ9 .EÍ7•—nl®ìnÂâÕ–X\¤‘¸Ã+)ÁSœAŽÔ+Å€v©-·¯Ö¾ÊñïÄŸxÚG|(ðåö¿ym-ÒÍÚ´@Œ* >ñ!Eû®7d¢òB–ñÏŠ^ ð Ý̺‹èÖ–·3ÌŠ¶v C$D(g!c_'n8ÊŽI',O©…ãüXÇÚÒ’¾ö³_¡Í>ÄÇi/ÈØýŒü ñOöŠñàømáÚ›Iðf³¾ÑtHÛ\¬3ÜAawã5‚XÄ-³{E(ùØcœ©5šß³ÏÆoڽƕðGöãø°×QGæ]iú¬:wˆ¢º^«Ú^ˆKå¬,duAÆrJ×Ì~8~Ù¿Ðë^ýº-¼KlwâK}2ßM”ÄÑ12Énð²ÊªÅæ>Æ•v‚ÃÐþÿÁY|'7Âý;Oñlj¼DÞ,Š!­¯B-¡Žä¹ÉÊäˆ× >è#hb£;kšµ<ÂX?i‡œkFöj1M¯TãÀâö¶—#+ï{~§Üþ ñW‹-|5i>#_kÓÛZ›{‹›û+kk©® kç0H¤]€åÁPß*¹%wMKâî‡á¯BÞ"×ìt+a2ºx¤a&Å Â2„ÈÅSh$ì,0>`«Ÿ‡üMÿ3økµåLJþ,j×}s=­þ“¨é7W. ‹$qÌ’K“bYÎÉ1žTæßþ sà½GGŸHñÝæ­¯Â—<6Æ)ÞV–6.»üȰ‹–Q¸–ÎÒW׎òìμ´¡/üþ‰ äƒ÷¥==O®¼YûzøoIÓŽ·iðã[¿–Y.f±Ô /ndœ°Îæ™u¹BIIAµ2vñÌxwþ =ðWâ‹.±oommªÞDö©k}h—AÉ>^ÉV3…,ÃhP˜¶UÁ#?#|Dý¹t߈:Tð§Ãì-ÖYµ MžT»þdWK†òÕ|ÅÞ1Î ôÏŒx—Åž>²iæò,ô]ÒI‘ªêž|Š$À9 ‡i  q¸ Êy66Jµ Þºµ[oø”¥C’ñMÛ²þ‘ú§ð³âßi²¾µ­­£êÙŽÖÒÚöÞMìæ]±Ý  Ñ.<Èö6>o—m]ø½ñSá>«§G{q­>›#ið­íÑ´ÚXK»jÂ×>p òc<ì`>Pâ¿4þü|øŸð»ÂÉoá/Š7¥þµvòIyªi20³’h£ À¹åó •';A=KÁ@¾"ØiZŸÅϾ±ÌmÞØkëd!˜Y'1´.. m?º;wÊ3V#'©ƒ¡Nji´´|¯×Þ±”%NNy«^GÖ^ñïüWàŸ4Ñ<_¦Úëš•…Í­ÖIJ‚Ô-Ò¯¤y‚ª:’8^Jäàœµ{9&QÅ9]XнHAý«©%®—ZÝ|´+ŠÀV¥´eo[ýæŒt+=Y—I°Ô"»Í$ x˜e‘7Ÿ˜&YW .rʪrb³`·–âU·†&wc…X×$×Qàmkà¨ð¦µÄ/ xŽã[0JÚ5Ö™¨[Áj’”@‚Ut,Bä¶ä8;B;·¯¦þÅ_¿fo…¿<'©|Gýž¼CãoXx€>o¤ëÉj†s$FÛÊÊß$…Æ Èò>P…OÑa‹– ïNS”~'¢R•µ–¯o—Èñ¥IWª—2K¢ÕÙv#“þ ·ûuÃðÊË㳉n×$“»¾"%ãPÁ†[?]ü,ÿ‚“h< 7Ä|ñ¿†£´i#Ô¡Õ,íî$#)PL× ~sóQzàå•OþÚ·ì?eéîü¬øÛÁž#µÔ¯5 Ïàï ߨ]iWÒ.5˜íígBgc$W2 æVáeÃ/Âcsü^wAàëR½ÚÖUnêÎþ3ØÁÑÂá± ¤emé;þV1~7~Î ñ[¹ñ§‚õ­'ÄtšÔ¶“â%w–8$»Kª¸œCæ¿’ŠZ%BÛqŒyVá¯øÅzsê·-£Þiz¼3,Z¬ pDѱš6ùác±Š¬…†â;°øwÂ<©~ÕgÅ_xóâGŒn.®ÖþÿRÓ´è`Öîõ`?u“q0xÌ‚0\2±BUQHþ‰~Ëÿÿi[Ë-GâÃ3ÄÔDsiñÝüSw:´Í:ââú#nXÁ0,ÑÇ#—ÜBxöOW,”ªäš¾Šß-îþäo–×ÁSrmrë¥Ýì¾KCÎÿà¥~'ý…þ*ëñxgGø­é>)¸±¿›B½ð­¾›`/&x‹¬÷$(.\K‚°E9bɶüêÖ<7â V‹YЮ¬ÕTnk¸2~g_âP1”aœõSé_­–?³Çô-Jÿô]P±¶¸ší"{–‘§"Uid”àýêü°©;”嘖<í½¤|yø]û9Û„×yájQè¾&ð­–”· m(`ÌìPù‘…"drã÷J6¥}싊§§ ?#iÙ{Ò{ùi¢òïÔæÅáiâ*9s¯’üÏÊ¿è#H´Y-l`–âIùëü.1A‚ÀÈì~jÖ¶Hö³¶¯6Jã·v[‚C àó^%âýFð¥™ñŒ> ë’X¤ëåÛ>ªðÃ4Ã9Söt ¡º|ƒ*9ŠòMDÛ|CÒÛOðž…âk»¨fº¹Õ~ÓÇk³\7q…êNhÒZ4vS‚”n¥¡õeïí5á»Û±m©üPÒÄÐÚùPÉ}¨ùâ!»=w9$ãóÀ®›HÕ|5­x2óź—Š'ÔåFD¬…-ÄÎñ•…Ê»º³[´…X„c}¿r@¿%ü_Œ>ñ‰ðއ¥h+s ©º’=KM†èÛ£Û/™´ˆÊB²üãaŽ}Cľ!ý³5 Ïà[Ÿ–ÐéššÜÝiöòÈ‹-Ç’Ñù¢21æy`‚@ wg<“BŠOÝF®‹Z¯™îž/µðÆ›ª™<%c{s¥´q {Ëû¸ÕäeyU#3r".vA‘ñ–¢u{È­å´µÖö« ¾Z¾wç—Œ‚'ñÆ;ç^Ó5K Ûišž»4ñÚÄЇ¸fc€Q³,b[§ÊN㞢®}¢þÝÂiðΊ&O3nd8û„¶Xí~c‘ÁÎJ´9œ“lë ðމ®L'·ÔOšÓyk¶fà†b@,ØR[œucÇ®è¿ 4RÕåqv®ªà[3g€Á¼¶Àå†Ìàà‘É/Œ¼Eà—QK©ç@­,nÆO'b®Óƒ–ÂìŒxN1]'…> Im8ÕPŽÆkÐÑIfò¤ˆ†F+Ãv3» Ûoʻֻašæ4£ZVõoó8çƒÂÏWs¥¾ø-à-7º»yžT\JÓôS†Œ¹MÀ‘Œ÷ÚE.Ÿ¤hÞ²‚àY[[:ËîTLŒ¤ž¼9Px!qŽ Flåñ“Ò“N¾Ô|B¢ 5“Ì”U¹ å<,ûƒ;ÁùHÛóðF>féÚ/Úb±¸]™V+y.-Af;X1<GAÃŽ¹ë¿¼jÀïÄoøòúËIÄv †iŠD–GV;€>nÕ:ÆÀ”ÈqÊ©ó/ws­Æ*­¿ý–åÖþÇ{¦ü;–imô÷žÿQšH¢IÉ•PFˆynÓ‘# ÷•™ðÿìuàÍnú 3SÔn¬.ç¼ ɨ´(­´ü¬ÅÊ‚IÇ®s^ÔŸ¶.Ÿ­x*×áþ©ð¦öO˜Uµ[yšin# H÷2˜ÛrFY±¹ÈûÙmŸ†ÿ´? Œ sÂzW–&o²Ew¨¶è¡ó í Å€b¬Í´`9<œ³§Ìh.ZU¥ßFÿFyõpÑz¸'÷u·ì ðÓÃzDZoŠô‰n®/'Úïgw3Í gk2ª³rã   ¼õ5‚?f†_>!é?<%¤ÛÄ4©"’ +­BIÍÃcæ2ž\ä@•PqZ¾‹:/Ú.à =5!¸•eKaíVXÕŸ8u×år¯£#hœk>мâ;Ù4híî"¼¹¶[{˜îí&n˜©Ú€?˜LjqÀE. 0ç˜fu ÕJÒiôrB–ÖP³ô+Cð#ã_öí÷Œcø³©éVv÷‘À4{k%d”}è0JŠw/š2ž»?Á7¿k_Úö`¸Òï>'C>µõ¶âQu¦¢àŠáJ|ŠJ?ÊY%%² z€ßþè_­oø“©^xßÇz¦µvc·ÀÓ¢™#´‹lm#$u“¿sί ³ÿ‚£C¨°>³§E­å,¦ÉÈ%ˆÀs²„¾_ãSœW ÚöÃÆ62ÞxWâEªƒ*Æb•¼Œ¦ÏçË?1ȇl÷¬¥*³•™¼pµpÖ”OÊÿ~ÑŸâ=^)öÁ¶’ÔÂÑâLí…ŽÐwt÷"­8Ëc¹W©ÓD}UàŒÐø»Ä—¿u Å«^ÜŘt¨ílÚ Ü  öæ1nñ€©*˜e„³îË«ž;áߎ§·¹øa¯Ám¬ê×2.£¤¶•ee§i2«Æöâ Ù%\G1,²+»†+_&è^?Öü3pÖ¾ÕbH˜³ÉòL›Ð¡]êwÎ Î ‚Aõ¿†¿´ž­w>½M=á¹-'Ÿtê¸Ø opÌþYòö ³ò‚ܤ·Q#hâæôg£øóáèÚ^¼ß –XôÑ%üøc¥x[WV†Æx­í'±²¼†ÖÑœÈ º€ÛÈVâf´ÜˆÌ¼å$ DaýÃ7:ž¡á»[BÚ-J}FÄGg§éP©¿³Id3+Af(">o›û¿5ÁrNßÅO‰¿>$|2»øs=âx7ľ Žm>÷ÂòÏm=žªÖù)my1?–âá¼£'ÎñãÄBérÊŸ3zJÓŽ§ç÷ˆ¼;k¥,úu¤‘ßIÁh/£›l燜àOlñØW´µkp·°|Ä¢­Êœ’„à3 œ?£$“ö¿‹¾ üøà? øÁº×…ôÛ{ÛK)e×g£¸{ï$%Áœ¼Œín­"³Hª±¬à1 GÊß´ÃÝ7àÿŽnü3a®6­akp¶ÇUKy †åÄhÌñù‘‚b;¶£2çŒãi­Iw9*SöO™3ˆÕ¼3à½jòM>ûÂÚl†y¼ëBãNŠG¸ÚœS|Œ ±l7 ü7^ ð^›¨ÛØYxn(Ã:Ü)Ó|ÅŠ6Õ:VÉf!<‘’3¥5Úe‘£Ýkt<Ȉ™—Ì^²ºa¿ñì|½Æê~Ÿ¨Ç-¿Úø¶uVܨFp:瑃ý*¢îÈiIÚå;(-4)Oج"³ûNL¿dµUF<\€2I>¤õúÔ­a»,V×úLî,äC;É Èœc9ü¹¿O~&Ô-m «{Ø¡8ö>¿§­Z²·½}&x¥Ò­ÚVI£º€6xÚÊĆRHÎG8àñÆœ©+ÜÑ;ÝÞç3ªO.‘-Í´—O#!Èû;…E$ åNÊpÀœÜñgN’î&X v*"Ûùm¹Jˆä8êyÆÑ’:reµÒ4 +æ{cA0kÉäMq±K³*í\`(qÀÆuà·ðݦ™s,«™ak7Œ’œ(tÃ0 îRC.þ†s7¿"bÜecÏÏÔn¼‰ô¹!2Ü’9¹T#æ‚7|Ýcž2ÀŒ }=¦‚ðÛ*\ÝÈ%",ÄBB÷@X¾à7ccæí\ÿ‹?h*?#Ât䱞ÒE s?† ŽyLe¶³ÜÅš`ÛÛ™7p±âšüCøv-ôèañM£ LÑÉ ß,Šr w0$0hã%ˆà.“Ù›Â÷;ý#âg‰´+KÅ’òhíî“¶W ªÈÅG\úq…-‰,üe¨éÚ\ÆþÆÕ´é4øå˜}•Ç–N\nÝó3‘S9=zWˆ¯s©ÛXxM/on¢åôÕFŽWÎ[{  ³²Wpc‘^|\Ôo .4ãÝ‚fûIrJŒ>K ñ’ 1ù¬íb¥=OVUã,G¼>ñe¾g}¤hº¬öÐéÌZHåŒ7“{ ’’N(•Rï1îj/±²‚¶ådñdÖqù·,Û™ŠGEÈb Üz#œƒ9S³¥kÚ…¼óK¶H¢óRBž\e7™ 6N3¹Žxç ànr©q§Éo úŽ¡pÒÞ4p[Ã¥™üÀŠò7f';‚†]¬Tçn}çöMýª¦ý›tíqµÿÙïá§‹þÔžl–Þ6ðìÓ]Ü¢H¬îR #à‚ YHÎ×|±”´&N&WïÚgƾ‚öÐ’úQ°Çn–*ÒI¹PŒ Ë(%±œtG£üý¢®þ"xÎ×NñoƒÒ+½F"í¨\êÿÙÖÖFYÄq}¥žÞ|¬2 z3á†ÝËòçŽþ ØkºÒxB ;OÔužM:Ö  #•RÀfE ª ã#’}LZÄo\XÁ¥kwW²ÙOa†XÜÐòüÙ FXŽ Ë·LäçpW2ŠŒÚ>»ð‰<=¢ø†ÃÅþ7ø{òêXYhñø´$¶ ÌŽ/Ķ&(¹ # $o|¾sûDj±ŽÛÇ=ÑüO,zCu¢èéÇ4!@ÒªBÒɵ`V|mÜQÁ9óç¿j¿üAà”ñ7Ã]+Xðþ­¢Æ²êƒ^ñ½È¸p§bÛÆm­òUBHbß½(˜üÃsâQuyo¯ê‡PŸDÿ`·ÕOÌ]P¹ïv|íÀ)8,M(Y« Ó‹Ñ­xñ¿í¸Ú7„’ÏD¸Ì\'‡¿²Ò)V`ó¦Ô,#-#Hî>T?9$%yEÏí ãj÷Qê7éß@ÖÆ4ÒK¤I÷#H…£r#Àu*ÊÇ9kø…jÚ®µoy%…ͤw–0êS.ŌÑ~c1òã"îfb±eÈû•Ìj÷¶V0‘qªÚn":Ì»œ€Àó0À®Npr À<ÕÆå¢ÕŽ4éA]+XôøüSö[‹»ým4àe€4È„o^IÜH?(u¹¿‰ON×áø“¨Üë>D^ LÒÄQ$œ&ØN3#³Š3ÆãµÆvã'Æ<1ã/ÚO'Û,-Z, Ý9 ìTŒ‚=FrF>ðÚH­]kÅ~"× Zj:¼ÓZ™V"C•3;›$¸¨9ä*’Aô¹ fÙFUS„^¿qåâsŒ-´Ÿ4»tûÌæ [ö·¿2=²¥›´‘½€(® %@ÈÉÀÃ)S‚Mtš§Å}jÒgð爴ô¸KIDví 3¥Í¢‡*àùJêÇ  .O¦|lø3ñGà7‰†…ã߇7ú©9žÖù¼¹^ß >Óà‰<ÅÚYÙvå±÷¤ÁÕ~ê£I“_²ÕtÙ%y¯Ú—ÍÉŒ]’0(Û€Tí8WÄ¿u\oš>ïbX5 k“«É¦43­» Z%ßJNÊî°P¿.I¾5³ð#[¤ZlópÇzÜ@ß)c’JŽAÀUnW$ä9¨ü }s}czðKNÌ‘·Ÿu ›1&(Ü¡8 ¤tÝ»³Å~Õt둯Ee1¶š ÐÝClû9Vv<2–*Xðy õ¦¤¤·ÐZ¨Ýÿ‡~:iWµ°Õµi-õk}q.!¹¹iÛLµPÆXÙ^fÞ¡Ôùß!ø¬Ïã $’æâ ®n®¯þÎ’ÎåHå_hU Ì® ›AÉr àÚ|QÖµÖð~…áŸÜ_=­Õø¹·Ö Ý]Ú9­ît³æ`á‚«¼#toË‘æ1j—úUÿü$SÜK4˜ºŠæV0Èb h÷ÜÎ9Á mÉ ”î¼qâü?uàbGÙ$¼’çÍÜÏ,Î|Êåˆê§îrÅùbâÜ—Aº±äó-jZݵ¤‡MðÒG=´ 4q\Ýé‘4“ ›,²y”&H$õ\•¬ö’eæe‰ð,xÜ’:w§XCiö25Ô~i$ðvñÜ䌃šeÉ‚x”HTåݵÈ#¡#8<öÁ#µ];-ÎTÓ{š6ZŒ–ó¬k4 Hád1Èrã¾xÇLu<žâ¯ ¥™—ͺB‘¯1FºAÉîxÐõüóŽ$ä13çÚ99ä‚sƒÏNÕß^ÙêojÑI2>L QíÆXôþè<ñNSF‘›KRóíÖd}öÓE(aòö¦ÍÇåùX#æÃu¼ã↳ñvëN—¾ðõ¶çD[ø¦Z<õWR,Ã$0ÊóŒdעͮêÖ¶±i3j·Ó@$[……DžOΧqU#À¶sÈx:^[[Ddw`X2„È$§ž={õö¨kš:hmF¥8Îÿ™â^øãMnXï> _Ëîcmö™ÝÎï—#3sÀè=s^Œ¿ ¼=£ÝC¯é‰5„T,Öʘ(PøiC –¹R@'ŒŽ‚{ÿ1÷Ëû‰#FìFÜdð?õoHÕ­íAÔ"´Œ»†]­2`ï$É#(X)ìpG gP„eÏ«‘»ÄM«'b­–¡éàÙißfß6ÈЫÈHgbH$ö'i;/óÍ¿7VòËo¥ÅÞù2Áœ @ÅÉù±»#àu'êknïQ¾ÖWi¶Öã`ŠqÎFHwçæb ÈàdŽyÏŠÓP—}²Y»¬P—‘ ™±ÕI8<ÈÆ:WZWW`ê9j;HÓ­,­$Óõ V_1±.Ñ´Ëódg¨ÀÉÇ\y#ƒ=ô6÷>\öc-ƒNÌÅNìœ1<Ž1Áê:ç™Ñ¼káOr-u‹8ã¶l4±\ÆÈ¸PA;IêNߨìp*ü7š~¡l­crf…ðm¦µ‘^7#¶FFz€ylpOû#5GC²¹°Ô¯®û0Üá¼–ŒÏ·oÏ*úzÕ*qní˜í±´»‡†öÞÌ42Ù¼©åLHˆuMËä·ñ&ÐTÍ[µð‹\x.y/­ìdk ‘î"´ù&‘$Û·—$ˆ¾Y` a˜é‚xÙuÍ^Á¼ñ¹Œ[>È“²„ùGÈ6ã‘òô#'¸ÇMÿ ø’Y­æÖ5؈k¹T™M¸ŒDp#tÄ+…~U#øJ¡åCÔI²éÉIÙ/„üb<àý].|¡ê°ÞB-l Öld’M8²´‰5¤l¾Z²2œ³«cÌØF$®dÁâ+-2OèWð[]]^Âèì&ŽPƒæAâS½0ÙWrr©n/u[ã%±º“ÍØ^Öò ¨¡¤Û³;¶ñ¹³´gp',¾ûvÛ»?²*À¡6‘ìÚŒã<“‚8­#.di Áî\ñ§ÆxŸÂ÷^Ót×½Ôœ%¿ü$s±†ækQÛ æBŠï. UÂÆišt°EçÞª´Ò ƒ§\wööã8©&KQ®ù9PÐÆÍ±xÃÞ¿yùå‘©x"K¸5g‚)ÁòdÑuH$I8RÁ½@ùŽ21»Zš'‹Ûñ§ìGûø»âÅfÿ†‰Ñí£ÓÒöokm¯YK¥‹ìEɺHá§Y¶Û`Ã\.ôªßcÏ€Ÿ´_xcÆúv“i{£ëoËfŽ4’ynmZågag‹‹È‘Þ"ŽÌÂ9¡ ÍyqSrP¶å}^Rµž‡üñì¿ð“±éÞ6ðΑãŸk #\Úêq2ËbÌWʆYägQ–V2~ìHVeT’'Œ3CûDxëÃ?| ¥xÃ|¢ÚÚÜ-Ë]øcÃXÉ<<ˆª'óf–t‘wüáãß½µ¿hïØ÷áß x2×SÖ­´he_E¢—P¾HÌh—ñ¡YZ uYmÿu3 °q ±l<ñ»Á—ºl³Ü¿ˆü!¯Z<9¨%”«e©Ù–òîáˆbÚd–Fˆ°· ûXêù–›XÒ4¹d‘¹à_Ù¯ö{øÙ£ÅoðŸÇZUýî˜"²ÒÞ¥¶Ìª†ñ'Š,<¨ØÛ]i¾GŽßN·†E7V’pŠ’ÎD…ð &>D}»ë*öëK¶tûE­ÒH9¸$9l7É»#+´)Ç^ßÂзñ}œº=ÝœVÒ±³ÂfŒÀ° ; ò ç{B:XèUSÝnìË}&yDVíö¨™¤–S  1J°íCöżV5fD]¿¼ÆN%†yϾqÏ'ƒTå ’3sŒ4¶¥;Ÿ[ZëdŠ7–åÁm‘F\ '’Hàg uïߚа¹cx£Êvf*›O9Ï^}†:d’iʺt3:™·Ï”v䎄ŽHÿõV7‚¬u›³6©®_]—YʤÙ£q»p$`Î@Ç=ý+>xÍi¥Œ£6Öçw†Ôcw3«F# µÆþ{®8uõ  NÚÐÁqv#‚@†-êe!–L1w˜ãlõ– ÎÝl‰ l (˜íi1CŽBã¡9Æ{æ´cÑ®ÇÌM…<¼—r?¾F>^¼’0K™ù¢õ¹N²Š½Ê÷ºójJ°_ë$\8S*ÄäË1ᣥ7VÒ´«9c>×"*é™áš)7FÍ#ã` ˆÂ2yÎ è,xÂZ§ŽXbñ-••Ôv†X­n㘛©¼ÄU·„ÄŽZB˜; ®æ*ôl'døŠQrŸ,žé§¡òsÊñQ“I]#œ×í³eöÔÕî. ¯ºY/73¨"ä7È‹j ðî7¾Xü2ñ΋mðÿÄI¶¾÷W¨|G%úÛÙÅnPy1´,„4¡–Lºä>ä@C0–?9ø{ãT²¹EÃ6ÇP±«àNO×§ÖºmZ×Ãqë sw©ÏÓ¯¾éü{ƒ‡Œd>@=zc#Šò³Ü£ŠÃµB&¥¢}-~›‘ÙFS¥UÓªœº¦µg«üý¶¾:þÌö§€.ô/j°ÛÜL—0øŸCŽê^D¤ò@cxžtPþSÎ’l/'ÊܨúKÁ~øïÃ^ðF¥¤êZzk>ÕïMÞ“ovf¾ñÍÖÈ'ŽXnd¸¹O4«pͳªDH1¥¿Ä°lÚ5k)ÿ´®ìåi¢{ÇiRân¹“wË.ORsž‡#"½§þ ›ñ | ûF¿‹¼[/ˆõÒmÍà—LÖ„bmÙ_˘¹UDó\‚û›bÈÅFO?œd2˜B¬d¥ ímmþ~¿ðÇ©‚Ìc6àî¬p~)øÉñ»Ãž5Ô4ß‹;¿×u?ìÝ.öyZkH¦Iˆù—(eÙ•7+ÅCåÇkm®øÅ¿4Ë‹ù|Sa⯰-Þ¥xºÆŸö(¬¡˜[Ë>¢¶‘A|í!XåRï,ÞWϺT1­}?ñ¿áÇ„¯¿kí/öeðÖƒáx4OIi¯_è·Vѽ͆«æµ¢Cuö[b¶^z̲H²—ÙçY 1ñÿÛ_ö~ñÀ¯‡O ßézý¤GÞ¿¦MÜøzÚG‰ÐE5Ë:?3|qEoÀO>Da5Nœîå'sÑŠ¨£uª<7ÇŸüm®xûàÖ¥âùu ?Nf¶[í&òG†ê™Jî;œ›‚ÈÚXü¾osi2Íg,w* ƒ˜J¤ºîÃä‚@‘QˆÁ?1Æ6óBê7X^m6î ˆXùQ•h*IÃ|Ü`ÆzóÉK-Kˆ„Ÿd´Ž(ÉÚî2^@xã*1µºà‚r9¥%)JçæäîjÉãoAâ 6ÿl·8žílüÆ.P3†G.§÷€Œ“µ\í,EKÝ®l÷×[å]Ê%V,$%Šýî¼ß œ‚ QÓ´‹Ä†åí`2­¦ 檬xÛƒ“â#Ô¼bºoøCÕEç„üNÞ[jžCEB—€Å'Í3+ì󨤒ª¦ôs¹±Ó=c£z+T–¬ÑŸ_ðÆ½¤ D³¾½Ô™€[T ¢ìt! dãæR98Ú˜ÜØÆÍ¶™á\ß^\øm>ËUÔæ¹Ò´ø<ÈM”h]Ò4|c ´ıÙÎâÀ×%âoéÞ¸]OÂ%¶Ô,]#`ˆdr­"»Ÿ1/ΤØÀn¤ÞHhøû@ù~€n Ï`jܸ’,ÊÀÚ°r9 ß·çÛ#5¿¢xæÙV íJ(ÚdšUdÚü‘È?0$¶ñÜÖͯÃÙôÉå±K;V¹ww2y§'æÜ##ûÇN¤çJdrIG˜ä¦M?ì†t·’Úá@rÁÉ!¾RHméïߣ’yî$2ÙHÌ t €ßw ñ=>àÏJÞ¸øg{¬ÝH&¿þÏÝ;<’ÜÊ<¥ÆXF'ŒqY(ðYÓo`‡OÔçH§EYžîÑÔ²°ËC¤>aƒ’sÈ«U!'Øv~ÎíYZáñ@M¬ñÀ! HŒHsÉpC:dmÝÔ‚:SíîŽÞÝ_sÒ`ÿñ÷O^H?ãÅn[øu.­"–ïÅm¥±f‰¾×pÈr HØå²»NqÕˆçi¬}OLh–-;C¿ß±Â¨‰Ã‡ Ñ\2ò=x?/ÕÆ£aÍ8¤Êz¶³:ÛlÔ#™¢‰Ë,6q…ÃŒ ç§AƒìC´ûØ®á‚(š°$D¸mnžµ&ŸªG4efí,xDS †Á `cÇ#Ž2{Ee¡h²¶©¥éÐÃtebdIZWlrI$J“œdg¦ FSÞãSm]’¼VÞ(–8š9d*8b9;þA“ƒ—Ó°ëWt?Kšåq}©0ª´7W;-ü@#ø±”dTJšòc!ŒV‘‰+ŒžñŸSŠ…t rk”··¶ž`Ò)‰™•°0Ø9WÊŽ ;æ„ÔC›©Òi¾½É«%°º¶ƒk­ÄŒ¡X•ùA.xb2õ 3UI¦K%âÈRÓQ‚ÑÜ"įn>l3³6ÏÛ¨¾ÔõÝQÀ×>4:F”òn¹¶º¼1Ãæ8XÙ•ÈdØHœœu‡ÄZ$:ýåŒ:¨].ÞùÓíÍ8e|¹. QÀÜ9 Æ’”m~Ä9kæeÚk–PÏ›ÛXe.¡]1t.ä òœŒp{U»½zÇO-ö˜9A,Šîp8P[scó¿«Å'ƒõ°°¿yÚûE©)äò[xÛúg< `sZ}ÕåüAo#’ÆiEˆÈ€áëÃ3× p8ÈäV|ójé• JJçCˆ¯MŠØˆ¡HGßf î9c—Æåàð:|ݶÕ[­Bâ̘á’BáW6èXLü§{à óY‘èºÆª÷v1k‘ɧéóÞHú…ï–Ì‘°Èßp ¤Œí8€­…ížž«åK UÊq.ï©“ì1Çlq«$¬ZæJ÷7aÔA;üÑó9/“É<`úñéÎ~ºñ.£áÝB=[H»[fˆoüÅs‘¸pxÎzð1×5‰<—pÀêâ-Ý–gfÜ3†ì3דÔýi–Úœla"/˜AÌ#æ<ï¹ÝyèTö4Œä’<’)Q‚KTrAç=«}‘.˜ú»+œ$ñ°o&\ž7 ôôϽUð¹}à{ÍaŸE·¿ŠâÅ¡‚åí¢1©?y‰Á ¡rUÁåN@¯Íx£‡ÿ²êóaåÍkm.¾K§žÇ«Çʽ>Y+4]×þxÎËRÔ5/Nö‰q¨Æ.̺uÄr¿ýŸ¯k:´zcÍ%µÖfÛ¹¹1$迼}ž[\²å*¼Î·û.µ Øø£à¿ˆÒG–æêÃWðëÏçÞÛÞÚGº§ˆ½š/™±£ƒíM!wÎLD×ÎSä”g¥** ¹óhë÷®Á-¥ó|·ËÀ’Àcþp}AùŽe£ßé,·(JÛ¬ƒtéJc|ß™[ Á`ƒêתüGøo⿞1:O‹dÑuË‹KÀ³®•v/-æØ$Ê‹ˆÉBnàãŒñÒhPø¢Þ]WBW»a+¼€ÛlÁT³0£•뜂r æ©*m&a*‹½Hø]mà/éšm…>& X—Oóõæ×£’KhÕd*‘Bà™g`YO“o‡÷ŠwŒ³íøZÓ> Çq£øóº}¡¶Õâ=;ɘç–K”0oò¶‰&yPGÄß”*˜¨è!]&=gT´¹P¨ÆÝ§I5]§$²ð1qëÎtñ¯Žo´Ø¼)o8{}'QkûEšI]u ¶+$fQ§iÊÉ€x2øleR1zÒœ^’V=[RýŽuKÿ‡Ók$"óÄÖÎ°Ýøzö)í.¤+œ°A¥P±B2\³±D¯˜Ê¾¨.­¡jSxSK‹Y­'!í%œ¯ÙˆûÞ ’ùñs^©©üfø¥âæ/ ül´¹ÒŽ—m¡Ýx;WݱÂÈ“Ãö¨D~R4nc‹Ì&áUTG«øƒA×-bð¶‰á™,^ÖU[E’Ú îZ2gr£,Jɵ1%Ô“»Ì«o­EJÍS Fqn/S[–ú–¹eý¡âA¶Yã-µI•A’ÄåàsÚºí$ÞkX¤ E5ŒŠÖ‘És"–UC0tq“…vã‚ÍpŸonßÄ‹á[ëÙ,î’\5$BQÏ vä¨åsÜg’G5é>ð]åÔ²ZX$ˆ¯€·e£ †ÆGLIÊŽ§XTÄÒŒìÎxÒšVûÊvsL’«\ÚJ°Fës!óJGÝfÁcŒŒŽ@Á#¹Kí6÷VŠì®Ž×"4>^LaG̸ÇÍÓ,­žTñŠÛÃÚ„·éóEnóÆBÜ ÛÀmÊA'p2 ÆâÆ´´ï ÅÈbfoŸÌŽ?šC‚[ý¢Cƒ‘·#9É{jqW:iáµ·CƒÁº–»¶‹E¢±ÿG¸Sû¶ØFï/(9ÈàÜŒäŒ[磊—¢ÚÚÇ´ø´%¤a·q]ç `— ½ñÅ{[ø;CÔ.e’yǘðüÍ4ACçs‚‘‚8<õ<ƒ\oˆìW˚Ĵ*nhã ”P8(%‰ÆI rxõ—ºC«ƒ„lÑÈ ™î™o"±ûžjLbäË ëÂb@WðI ó‚ËJ‹P{™ ´nLš\`Ðf2)îH8'·¨èW)³ÚL.# %[§ß·Ð+‚AAäq‘·ªâ™e¡\ÛCö„•#}çÓÐàõÁÏzÏ ÖoQÝ#7B*6±ÃøÚÞDIžÚÂØDZ!$råŽIO”ƒ’FIÉä\Í·ˆuP4ý^v•‰/$:HìO Æ[ à`wÍz¼öK=Àâ]êʼn*©Öü«È°"¸š6M“&x>žùçñ­e³Ü‰s›Ìh¾qP…‰?.r}3_³RwV8ê"}.Úrøx™· ²È7m\ƒééüý«jÖxí¹· ÁŽS§ØOlž bZÞÜÁ Hf)ǯ’¼ŸèEOgu ‘`±Æ5POÊ89Àèz×})($ŽIÅÏs§Óõ×±fš9i ¼m‘½wFAÈ ~9í]i6ºÔÚzC$›¢|q€7ó Ï<q\»1+<{Hð®9­ Ä7šLÊaww!åGr3ÅgŽËð9­?g‰£[¯Oø''-Još›Ôלּ.òÙ?ˆtæɧ\†‰ÚwŠáHFl MÅYq°@$õçÁ¿~%|3¸¶Ô<'~Ú­®'´ªJ£‰|á´ýå!ða†Ë¹ã. +¦ø¶Õh™n’ÆU€éž<`sž¾ÜU>ñœEͽúO“~Ù!á@àö8,½x 1ŒWÁcøg“ÅÊiU¥&¬Óå’>¾ZX|j¯$£îÍtèzŽþ5[üeK½câ%ܨöÚ%ºéëm¦ÙÛ¤WëûD­" y·¾dt"FfœùœÄ¬8ýGR¾²³].Í<É7KòŸ4 1,@<ñÂü ¤°­ßêž"Ó.,ì$Ô-”§qmCvΉ–eÇÌCƒ9@$ú…oüYãoì4³ŠFš8nÐÊR-Ä9UB«œ.HÉ'i¯™Í2ï©Ô\®êJë¿ÏÌô)Ö]:œf¡ws©Ziú5®›µ¢Ý[Û¼l’DÑ Fxg`Wn#æú í¼9à«éuØ.,nfxlP†KV/)}ë‡O-pÛP¨Îr˜-Û'âV5¦½4Z†$†ÎîãÈ‚âîÉc®ò\¯|Tœ¨Ø_Ž0kÇ啪Ór§ÍØààñ5ݯ5ñœEÜNÅ]_x}þR¿Í´Þ»0Î ©ö­iõ‹ëšž‹ Ú'Ÿ-¤åVY7„ÜwmÆí ýÐÓÐàƒ]ð£yö±É*"æÖA¸/;ºŒ‘’FGÌsnÏÃvú­Ï›áëO*("o7ÊÑ®Xªãîü¼º6“Ó$S„š¹‹Ä%Tkü?ÑõkÏCªiZ ÓÌXTófˆí!C``ŒÌNp§'$óšúÇÌÒtÝßC°¸´½¼’,;’¨T°RAMÝ0z ©Èåkä+kMçµ¼ŽeO!GTl1l´ŒŸ ¯wý’þ øNïV›Jñe¥Ùi£[G; ?)b§r¬°1¼òNÑÏZ-êk†«yÙ½ÏR±ðÄZ¹»°ÒLÉs*Kpèï áP´…BãnÒ¤( ñÇqAµX4kˆìn4{›‹‚ûRk(E@NõÏ¿~•Û[Ícªè­q¢¾¥§žÖÒBø{k®d9#$ÎÒ:Ž¥¶ä`ÓŸPKk£ˆŒª2#1ü ¼ò£<¯cD¶¦‚jÖ9K&\D.¥FÒ;óF{õ¢¨dêÛ¤²› A–$‡×·ò®ÎÿžÑ¥Uº–íïc|ù‡¿ ‘ϰç‘HuO^:M¦®áÎW%AwàcŒ~­9U¯sŸêüÒZœKøJ{»…µKI\”'¡Èàuÿ| ΟH¹½ÔšÉô©!†0¹eÈ™a×\犓ÇÞ1{ÍE,ìVî‡{[H’…}Çä{ñØã'6Çâ3Ùk¤ÞÞÀ—S@ŒR0‘Èq󂫇¨9ëÎÎM¶µ;ÅYìü§Å4rAgvTN>fŒ1ŽŸ63ŽÀã­s~#‹F±¼m U1àHëòþDr9ÍmÙÞÞµœé§ê²aA]ï U)ò•9Ïëîy9ɸðäS] /¢’I3´Fç䑌ƒÛœâ¦”`ãhÙ˜Ò®Æ,H ŠÇ®@È8õ>ÿ…[²S}Å•¶‘–=÷˜ÆG#ðÅjAáÙx‰/õ;¹'¹V,¶Âø²ì |»H!ÉÃÉÉ9©õ[M2ÊV¹¶ì ˜,3G÷#;ˆ ‚s¸>ž½+*Ðfuއq¦Ä—sË$|c÷Ï+óœ˜ô䯡ç×5fdºH举ŽÌOÇå8 € `dОžÜXÖõ[xìCé²MLjöÆÁw;X’¤t'°'<óÖŒW×6²ÇߪæHC€£Ž›ÈÝ;€íè)²Ô×CånG–Ýp+OOš9T´‘®õa±¤‘ô¬X'"E”.9Î1Å_³¸òÀ.G, ãùf¿g¥Qó5"ÙÐZ;†ß'xV9IíÉPÛ@ÜpêWá¶—oâ.íílÙæòa"]ˆ^1`‹7.FOÞœqøD'UaìÞ‰ÜûYB5k(ÛsÚ¾Omà¯Mý££ÂVi1$–ÒnywvoVRŠF7KmÆ2:½Â>4ðd·úÀµXôùäF‡ìÈÍ#î@a÷˜|§çãå9ªÞðµÒióÞØXÚÞjæ61ùz´vöÄl;LžnN ÚÌ1ÿÜ »Õô†–3ÜjWšeÝõøy!Ó- ²Çrw¬j`å±ÀÂíøÎ|ÜEUSÞƒ×MgEPJølÎÄ:¡¤h×Ñ%¼’Â%ŠZZÀæU°VR»†@PXSLjϡÏf]åµÌ¯6ÀÎÁ™_'qÇVçjçv>rFG'Òì3²B„ VàFîI^I<â$‹4ÈÖq¬³¨in&še +n#fÕ ’w G VÔêÔåå›>k4ÃB½E::[¡­à_èÍàý[Â~ ð}­ÅåÊÊmïHÞHäH üe±˜äÈl±Âª¿_˜®q´—»÷ê¤à¬ö:Ÿ ¾ƒ­ßË5†Œó.šâ0m¢£:œïÜèT‘·*¸ }k^ox›Äs½•åýí¬ilVÝí"0F%Hé…,[nHv‚0Nk³“Å>¿á4–÷P»¶¶v_²½Ìp¤‡c8\±)ûÌðwÛ|Gw‡4縋Y°ˆÉ óoyæI!' yAþ!· ‚01Œ‘]KÝ…›*4ž÷¿S™_…–ºS-Æ•i=»yÄOd2Èp än!XO`yGQðÕ¼ÍqÐÙÌê„¶þx!ˆÃ/@Hä t®šÃÄßÛq'„Mµæ_å 3lÁ-¼‚ƒòã*J;ЇPŠE7v©l ¹Eó`œ³1by ‰b~c€@“ÆìÖMó½îT£M+žw¯é×q¬PÝ$EPîd*‚ã9Æ Áë\«i>ÓæÓìå½Ûq'œä ±mPW…!28’@æ½VÓáEwû$q#³+  æ0'Œcîç¯nØè+•Ö4ÙL”Q 9V%ýðÃ<þ_CSRÐɸIV ÐÍpeE/);LRòàe‰PP9Æ:zUY”k0ù’è¦5Ú¯`y9Ãpÿw¿Ø–`×PÉ£sbÐi·6Ík܆1É;‰-ÆyÁç¯qÍ[¾¶‚ãO]2âÙ”ª‘¹s÷†;Žsôäg8¦ãmFêTJìãõ†ŸI•õ; :ÚÖúñ¹¹[U‘¶…PU˜[@ü8æ®%õ©[ieœJ®„ò÷°Ï8ù±Ç®kNâÔ,„¬ÆP¸&(È G?xœòI9æ›…£Ã$¯o­,aVÍJ²)fz÷è8¦ î` ä®r^7ñ5¶…c²ÖÂ{‚¤‹{k8Yn_$ìE^I<»G'€ |ëñ—â?Åå¸u¸Ò¤ðݱ—e£/•w*t]Àe‡wPxÉ8ÏÖ¶š¡hì@Lƒ¿x‚ÆIôì3ÈÅ6ëFšþê6Õ-£2[¶ëYdŒ,ò2¤ƒŒ‚{dûÕá«S§¼nüÎúu)RŠÒçÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ýü¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿_þüº\‘ÿè8ì[âÎ?÷H?àð‹l_ø'-ÝGůþô×·þ®g_óëñùžbÎ2çöÿþGí]ø¬ŸðwÕä§ÿÁ;Ïp>,÷¦Ÿ'üéwÌÿðNÍŸï|YÇþâi®Οü¹ücþaý³–ÿÏÏÁÿ‘ûME~+'üû$å¯üÕwzÂÚÿïMXþî¸b»¿àžÃp üWÏþâi®ÎÞÔÿ˜žs–¯ùyø?ò?hh¯Ætÿƒ¸-YI?°Jäv_йçÿtÿpºôÿ‚äuÉø«ÿÞª¯õ_=ÿŸ?ù4ÌŸí̯þ~~üÙš+ñ˜ÁÜ2“ƒÿþ^ŸôU¿ûÕOOø;ngûßðOåþÊ¿ÿz¨ÿUóïùóÿ“GüÁç™Zÿ—Ÿƒÿ#öZŠük?ðv¶Ñ“û¯áñSÿ½T/ü®Þý€ÀçþŠŸÿzèÿUóïùóÿ“GüÅý½•ÏÏÁÿ‘û)E~7§ü“ö Uÿº§ÿÞºqÿƒ³â^[öOÃâŸÿzê¿Õ\ÿþ|ÿäÑÿ1oå?óóðä~ÇQ_Oÿoéé/”a4-ÔøZ}¯ü‚ééÿk#‚ñþÁ €9ÿ‹§ÿÞº•Âùóvö?ù4Ìo>ÊÒ¿´üù²TWãSÿÁÛÖñ ·ì¸öø§ÿÞº®ÿðwn–ƒæýƒ—ðø©ŸýÅÒ|1ž/ùuÿ“GüÁg¹[û„¿Èý¢¿ÿâ/M8Oì ôÿ‹¥×óÒéŸñö˜[bþÁŸîмÿ鮓á¬í˯üš?æWöÞ[üÿƒÿ#öŽŠü[¹ÿƒ¿4{K´\~ÁÈ€ãø¬?ùWT®?àñm*5Fƒþ öóo)â™#óþÊÅCáÜæ.ΗþMó*9Æ_-§ø?ò?lh¯ÄäÿƒÄí¶ø'œ™¿õçJ¦ÝÁâVöÑîðNɤ=–/Š™?újŇ³‹_Ù~1ÿ1ÿke÷øÿþGíø„àòg¿ðM›ã‘’[⪨ž—L›þÕvŸ²Á4YŽxó¾1ªÌi&£û7ÿŸOï_æRÍ0/íþgîøü/â ÍÿÕ¶@G8øÐ[ÿpµ:ÿÁâ—8ùÿàœªë‹çÿ•ÖAœ?ùtþõþ`óL û™ûsE~#ø<^P8ÿ‚sýqñ{ÿ½ïøŒZvá?àJO¡ø»ýÄSÿWóùõøÇüÅý«€þÁÿ‘ûoE~$/ü+rFáÜßù—ûÑRø<6n«ÿêCÿu{ÿ½×ç?óëñù‡ö¶_üÿƒÿ#ñ¬¤M%pHòÜHöâ–;K’™‰p£8ùÿë~µÐÅàýZS‹«¡û>véRÅà¨Áß=ìY•å³C_³*}Íþ±Mu9ȼøÁCxàgøÿdG3í‘¥pyËü³]ŠøOEƒ’ò?º? ?áÐ_Þ»m ÀJV—R~µ‡+â8`S‘ÀDäÔ‰o¨ÄÅM¼À§iÇôÅv¦™§.øm‘WûäSDž$c‘Á㕤h.æo.‘8øío«ÇlØü¬óRIçÅ: ÙkóHp§€CZv? ~/\xÚëáÜ_ø›ö!øŒv\Oô¨422ÊÜ `5iKul¯µæƒÈô¥(Çä!³éT©Ò¶Âöµû˜òü?ÑYw$‹§5 ß ¬df)t1Ÿ”ÛúVó\ìRMN÷gl9“Ÿùf3Yû=Qj¾#¤Žoþ­ùd¹ç¾;J’/†–æ`÷®¢;[–å­ÈàÔwwvšqEÔo¡µ20Uóä ¼ž€dóKØÐ޲Vˆ¯'dÙχúqn.Ô¯JUð€$¤Íײ×K¥YG¬Ú]j¶1½¥„é¡zÓ*Ãhì Q4„í‹;_ÈÎÆÇCŽûIý–þ…¯ÁðþK[XË{£^ë®›öñ—b×’Ä2cùY°Y$ƒžj¸œ®‹µJ‘_4oJžcQ^œ$×£7~~À_¶/íG«\è_gêsÚ <éõ+Q¦[f9Z)n/šdd‘$VErÁ¢qŒ©¹ñ¿þ Aÿ,ýœ´ÝSÅß¿c¿Ëáí&æhî'·_üQðìæûN·¾¸ð½Œ0ÚÛ'ÊI·k²åíƒðîÞvà¸@P–Ç+ÄÕgÏ*¼¾Jêß+† ‘Æ 1§Íæíùܧâ_ø6öºké|Kð÷öŒø{­x_ì0ÜÙK®xwVÑu6VĶ+³ «]›ÙÎÑ•VÊ}øMÿÔ?dÍÏLøŸÿëðÏí ¥^h±¶±ý—®hp]Û_JˆeO³ëPÀÒEB¢U¿PÞv~Ƈ%iü5ÿƒ€<+mðÿH“Ä^=·Ó|JÖðÇ©i–ž—[’F‘w$¿imFØ’%7Pûv¨åz†?ðpGÃ=/CŸÃWÑXø›X†k™Ú{o ÚxvÎÖ1+»ŽçQÍ)ÌêäØÀÉÏÅb¸ES«&âõÚ×ù¤¿3¦Œ2\=^xE)-ÓözýŽÿbë·zæ³ÿåÕüàZÆH5?øúÃB¾Ð´+ùIf–½»i’g"hôÿ:×åLe†WëMà×ìñ+ážàM7á…#Ò>ˤøb]}2ÜXH¸02u-”tœgšù2ãþ ¯á ‡V¾1²ø]ª=ö¦a&¶‰ Lʦ¹‘­Ïšv?”å€~,9-Wþ QûS¶·q¤xköt·ŠÓûZ¾ŸÇݵ‚ÁãóC[´ÉfÓ>Ò«å˜Ü® —eÁo29^>¦²¼Û²üNÉfxHlïè~—ü>øwðóáw„´¯|8ð6— èÚ€°ÑtÝ&Áa†ÂÙqˆ¢T"|«Âã$ ôÍy·Ä¿Ù3ö`ñF»¬|D°ð¾“áëöosãß Ák¦ënIÜ®|²dpÈ2«à¦qÅ|KqûM~Ú_9ø—<iž$‹ìÌZ#”´,EÉv•l6X`ÀsÉ8QŽÓ¹ÒªÖkàüOJ‹Çß muðü7ÓùÀ˜XǨFfT?(!nÚH \jà¾5~Ý_²'ÀÛø;ãíá/ jw‹ZXkúÂZÏp®æ51£òÿ>+üD/Rs~-ý–ôÃZ…§‡¼Ow§­¬¢ßJÚ•tÍòy~\F8— ‚ì‚rÇŠå¯>x#á¶“e¤x¯âÒx^úHåg»Ôµ´´·Ô!Ü»"A䯖IÊG½”°p͘ä¯r'ˆ©ðž§eñ;á/ÇZþÓÁß´Ì–º>Oˆü= j[º‹•t®$ò…ݱY¢xe€åXîm¸_1øEû*~Ç×Ä|L~!x§Ä>-…LZ„ñÃÅ:Ÿš‹´î´¾ÔäG\£t=ëÉ?jŠß < á1ã¯üaÐRÆ4ºÓcÓ-µO>Ù®C'–.®k"Hü³Æéÿ-t27È¿!|rÿ‚¨ü¼ð þ‘¦Y_ÚëÆ_2(ôk«m]¯ã‘µÛ “d“ ï7ï†ÃO>\?4ß÷bßãk~'#4Tª$½Yúí{ûþË~ µ[Oüðf¹åCä+ëÞ·¾ 32Ä^å]ÙAv8,FâO+‘ñgì×ÿÎð¦•oeãÿììí’Í5 hñÇiUCÆ !ä¬kñÃ?´ÏíuûBÛ^êŸ>|BñV¤šš©‚ã^Ô.ôý;ptކ)Dp+*áJ4jÙ$î~­¿eÿø)Ľ;þÎÞ ÑáÔûCK·Öt«kÛ‰®î”²‹{™®fèXÊ™U˜pMwË,¯JXšŠºJQOîRoåkœ±Îœßîh·~Éÿ•¿ìÏø(ÿü‡þ ûAßøoÅÿ¾*ü?øQ®i÷ëk®øÅZD×–Q´ŒmþΤ۲³+<Àλ6‡Å|©ûF~ÏðogÀmÓFðGíñâ?ˆolÙ4í/áÞ¥e«1bŒ©$Ó½´vàïUýÙ—Ì%Æ#+œuŸàÝ=xJ_ˆ>>?ö£^4š– xvQ m´‰XB#\Û]1»HÖçŠ?àƒß²§ˆî§Ðþ~×¾.ðž­e>mŸÇ~‡Q³¿{Ý›Y­ÙF ³ƒ†VÚC­zyv/#Áµ¯Îïù.—ã¯àe‰y–. › m¹šùÄŸ±Oí‘âëúÿÂïÙÇÇ·ž]M“C¹Ö¼'êú_‡?gOÙ»Æ^5³øÙÁ{uñŒ²®‰ãY–Öîì)2ÄÍo2¼¬ ¼(Ú?xn|Äã<Ê…éRŠp[IÝÉöÜÊŸѬÔëhÞéY/ÀüEø?ÿý©>3|Cñ7Ë -îüuöO.ŸâÉo$ÒnІXg‰mƒÆÌ¹#=†zOoÿÆþÕ°höwþ ý þÚÝÞ2Æ,÷Plí]énÀç{n1ŸNe¯?d‚Ú—Œ¿ábßé7k³Z´Ž©æ*K¨ƒ 7 ¶í ‡—¸)(v&Ùîÿe¯†·ºÒjÚ‹\ÜEnñµ–Ÿ:Æ`¶ÚŠ (O9ýØÚYO4¸Ã7žÕ-ÿn£²;—ÇxäÌü<ý ?àÛÛgàïÁŸüYÓ>)|)½ÿ„[A»Õî4ñ©j/-ÔÑ4Ω›4Ê+`ØÈù àìÇ/ÇßÙ^ÿö—ð—ÆÍSM2Ü®§¡iñH{-CÈ®—%áÒΞ.XÚ~Ôï_š¿§/~ȾñžŸ­hÞ"ñ.±-Ž·¨Ew-¬RF‹FceE!3${âWÙ1•rH.?Áß±ïÁ߇ÞÁ^ ²½Óô»{-¦ŸmtE¼1s¶˜Ææ;Ø…ÜïûÆ,åœÂâ¬ÚéºÍÿÛ©~†"ËT9U?ßùŸËåì+ÿÕ¾ ë?tÿØwÄWÚ6—7”‘Yjp˪yŒÑ„Ý¥–®ƒÎBÒ¤E@ÉàƧìÛû1~Õ2øëNñwÇïØCâ‰ü§ë?Ù^.Óüg)Ôì§d_Ü«FdXn¤Œ˜¦U8à…È#ú€½ýš>jþ·øs®Y­Î‹kl-íl#²··Hc bˆ#L)*¹OºÁ@#Ïñ/þ ýሞ>°ø‘Æ/hÚ®•`lô›½$ZE=„&I˜Ço:Â&¶]’ùEbu‘E¼9]ÅUâ¬Ê¥×3·Üþô*y_Ÿ*¿Íþw?>ÁüûjÚËãÿØWÇ~3ð»G-ž£ào~¿HmäŒ2ÊS]ÒÚKbÑJè‚Ù“ÍfŠRJ¯Âø‡þ Ðÿ‚˜øÅÖ~°ø½ð÷]šyN©[øÚ[+¹ÿvDŠ ì$rrÜ1äàŒ~ôAû|—³é:½µåÖ·}h‘êþ3ŠU´Õµ …‰¢’Íl±«\mcóíôŒÓ?à™¿ôßG©?ÄOˆ—:Y¶j¹ñ„‡JÔNyn 7Êòƒ3H6ö;J®p¬ó2M¿jþzþgZËr浦¾Jß‘üêüTø+ñóöFñö•ðKö¹ÿ‚nXërØ[ÛÃkãO†ZÊÚ¶¯`nfŽ42[ ½6W™”¨ŽM?íä¨e$º·Oñã·Á?þÒZO„¿e¿Ø¿ÂÚ¼ðÕ·ü%Z‡†l®eÔmJ%º¸h´ûk[}È»bqu£ùˆÆA$Qìòëúø…ÿ¸ý>'x2ÏáÇ‹>ÞŸ[ÁÿÆ–úžŸ©4Ê‘&Óí¾Î1–ylùrNÍ>;ÿ‚p|"¸ñdóê?𞕦$šÞ±¦øaïm¬eFû?Ùå’ÌÝ$²"´…VLÈ»–6Àyñãþ 'ûRx§K·øñ†ÛÃóO¡ÚËi{¨Á5þ 7Y5 G 4HØDr˜ µˆ V¿gO…ן´|'âÖý¨>§‰n.R9|âS«ÙI4æQ…šA[Éä£<éùa¿%˜J|?™àèûz³ä‚Õ4ï÷ríêìf8 Õ9)Fò{Ý[óÿ‚uÞ ÿ‚d|4ºøÇ¥ü=ðÿíWðGÇoªj°Á¦é6¾5™DÞk1û*GË/šŠ2’:;1rA“ûMüømðÇ?€> Üü>yàÖÖ¶þñ,z—Ù'Y¦ÚuXãeQ#,d³É,i°ÎÆJûSÅß°·íà;TñÍïì§ðsQ6Þ¦‡ð÷Y¸Ñµ[§ó±åÇwu¬ F¿¼@¨Òe‰—-\ÿ€õ_†öÿ/‡í ðâ? ^Ùè–Óè~ Ô<=gq{rÍ#»å{ÈæI¹ŒPH¥ `Ã^mJ¾Ú¬±'Ï}4Ÿ–‹_óên£qäŠå·uuøŸ*xö ð6©«è1ðßÄ­þÞçÄ6qð÷â ½ÓÙœ]®#@¸ØX³2(UÝæoùEßüÑþ üX—\ðÇÄoÍ)µŠ8¸Š_"üìhÄ—fèË.<·q,¯å)+ÙX§Ð¾%ñßìyãŸAs£h¶máû_5ªxy<%†£}&¨¢“íH‘‰„¼2îAÂŒ=Oá/|ð–‡á¯‰ZGÂÍ+G]3ÄÿÛVºv©¡=ôÖ(F#¶£k l*Ь²BÄ4Jû~zóêâjF*.£·gv¾çþFЄ&ï®úõüdý™¾ ü~òâÖì¾x/_ð¶™sÓ5m[IŠkNÚëµ-´åXã,MË$¾L0l4õhÑ5Ïø~_ü>øcm…¼ö“àËÅl‘mVÉcP$gh3ª€äà«ðkãOìñ…$o‡þ(Ó­¯®m´å²}ÛO0,žP(Éhª ¬ªÅضùÞ~P2|uûJXxgÃxâóâƒ4 Xn^BëÄA`´v&E–Í&–é6K”I<{YP…S¼ìpX–”o‘èS§ q¿5þâ¿ÄïÚFÖÒëJþÈÐt_kV·èºlþQ8´m„üÍvÒ"Hxâ||»“*¼þ_Ûããï…nîV_Ù'PÔ´ë[õ³—QÒõM2Ö9¶òMë—hâHòÊ’¢3†rTyíÿ‹ý’>X^xꉞñ|wn“§h? ¼aÔ˜03œÇ }•]áæY‹£m1î0+ünÿ‚ï|7Õõ'Å¿ü?ñMî´ËÈ®£ÒüI}iqgæ9&gi'hÊI òƒª©v‚ž¦!Íñ0çŒ.½-úœuó<5rº–gп࿖ÃjšNðÕô[MV·‚òâoˆ,ZŒ)æ»VÞŽJ©Q*¾]##uxwÅßø8çÄ‘j/oðÁm"·ÓŠG¤Éâß [^O-–å$hï!(DŠ :HpIùgö×ÿ‚À~׿¶&©s¡7‰-<à©-ä¶ÂúºFgŽEQ+]L¨­1“h%T ‡Ú]¾c¶Òô‰/®íYWˆÞRN猟Çó¯°Éø>N.XØ¥Ù'ªõ< v(ÊÔ%;n~…YÿÁ{þ!^ü?“ÚÏÀtMFîdÔô_]ÙÄ]œ™BÂn1³Æ¾UÄaCd€|õûEþßÿþ?øI~&k¤x^;ÉçŽÊâþçT»ÈýõÍÓ·šTÔ@BàbÙâÏüÓáô—Ú7íkû5x—Å2^Úɥχü[ ª$‡8+FŽ—óØeF#äײiŸ¿à‰>$’-3Býžÿh3w©ßCg‡¦ëdù ؉P²—å~è,Çç'=Š~]UÆ8JßÞM>Î׊ù´ªb±”×>!Fý,ïù~§Èigñ³ã®»š5Ÿø²ö–ç“^Éy̲±}ûWœ»’êÕ¬h^0ðÝäú.½Ù¥EÃLeŽL ½p)ëýãÓ­~³ø*Ãþ ›âÛÁÛþÒ>Ðõ=c=—ŒüUº¹³ø¯I~Ö’J³·ö}ÄJ|¹^*ÒF¢@$×r’ S‚kæqY…”å…§-Ý›&ÞŸ#ÚÂa/5%^RQèš·ÎÆ~‰û9ü=ðþ™.•j5YÑî®.ßë—3´rLÒ3áËmýãSƒh\P2´ïØûá^¯u&ÕnË"ÚêùJE¸ ”!Œñœúœú©U=¨5x?W£ÍÍʯè{Íy©~ÍÕæ&ûVÕM¿™•µ‚x¡Ä.a2Ç™—åêÎ_“ós]Oƒþx+ÀV†ËÂ^†Æ6ÁE’Ò1¹Ù‰gnÌÄž5·zBDzçèkdì­Ð9åqÌÍÊî¦3ŸâLæ”6zŒPX3@›bü¥xQíMÉoã?('¸Å-&®` =F( :œÒ Òî!i¹ÜÓ¨$Žƒ4P k: ”¥•N ë@оþÓŸ³ÆŸ‚ÿdØcỨx·Äw7Wsêïo¨IbÓ+ÈR'–ÇO‹OŽ=±¤e&_˜ ±4®ÎnøsöÁÿƒ‚|f‚âýŠô(u :èÄ5›­Ãm4‚_-•î..D3/mÂAC†Ús_x_öóÿ‚ þÓÞ!³øcðÿã‰u=nvia_èÖ:eÎ6Éil-á;0ùùÎÐÛ[†«õcáÃ/ø.fðãN}oÆ´‰-­­áµÓ/,¯ï®mÄiÚï´f@FÕ˜ä>иû ùn//¤£ŒOûÎWüî|v¿ÖäÝ8Í/î¤|¡¯ÿÁN?à¶Ÿ³ö¡ÿ?fK,žè[H×^¹š »ˆÔc”Hù м£Ø. g$¬?ðPø+ÇÄï¬ì_à{mcP´h´è.ôI%¸–5vt’1-й$H®Ë±€%T.â?IüVñ'ü×öv³o|Qý­?gÿ é¶S5ì¶Ú­µÔ^8òZK†ÞªÏ±†$@Z$]Û£‚¼Mÿ†ÿ‚”[Cðçãê]kS—Ö~·ŠÎíež~nCÆðÇò$m(Ü‘LrI*W‘`劗=ЊŽï÷–ûî’:ý£¢¹jʦ½=Ûÿ™ìú?Ã/ø.×Å?ˆúÖ™ð@ðíÅ”æk[‹Ï ]XZ Y óüάÅHW‚–Î5wsÁ>໺¾¹ˆdྗf¡Þ ‹Ëƒi3Ú2ʲKÜ ˆ››vó_2ü5ø,í«iÞ ðçljü1m¢5 Kðõ¦•g=ç—,‰Ý&Õc•”%ÉòÎÕ\’¯¡¾üMÿ‚ðx+YÔ<9ûKÝku´ÜC¨ü,žò=>åË1ÄÖšrºK^ŒDLÜù$í(SPJU0íÿÛßå`§3oÜ«o—ü9é |YÿÇø[ ë¾ ñüÛŸ&ó#6#²ñ.‘¥éÆoÄ{˜a¹˜ï #ó³HÀlÚ1óíIÿÇý³´T»øañcöZð'„õ[» ÷ø{ĺÔe¾€©€‰Vîè*¡%Æà¬ÃnÜ̇ƒ?hÏø+Æ¿øÛà'Ưø(ÇÃÿßx^Ñ¡ÄDÓÚèÜEå¶ûFžŽNÑ*3Å„üÇr3ò6ðnÇícâϥ׃þ>|5ñÊ—ë©®ÞJYebÆLùäÈ!ó“¸8 æ»°Xl²¿ÚåI-ý×/×ÝüZ®-ÑK ¦ýmÿ|£ûD~Ö?iFðLjþ|;ðåžêÞoƒ¼ c§ÜêP*´÷†f?xí ¨K啊®ß5žtþL1€8ùÒ¾þñOü}ûrèf1£|Køw¨«Jâgm^æ˜Êî·%úÈÆqŽkã/Ú/öcý¡ÿeOÉá_ 5}O´Í•õÝœ‚ÓP¹O6Þb¡eFÆå*rT© +î2ÜnMoc„œ}>k†Ì$ùñ~§ÿb3ÉÈŠk P÷. ä«g§øý:Ucrìy@p:úi“p.zgÖ½g$p(w ´ûØÍ•¢?$’ Î?àG&ºÿ‡_¾-ü#¹’çá‡Ä½oÃÌ÷1ÎÿØú¬ÖÂGLìg¸·'õ>§<,Ó–%L„sÓ?Ö¨ê31\Ï|·ØÉáoiJ©¼#J!µ³ÍÔj‹Næc˜Ô ÉkBëñðýÁù'¥R{û¸Ø´w 9, Ö¼^O“b]çI'å§äzT1Ú? þõsößðpÀ¯†#Äþ ÓgüAðîµa-å”ß5{{¹ãÔ÷»Eo$y‘ÐC½J0Ù‚ŽÅ¥«ß?àäüøW‡á_ØÇ–ºõõóÝjú'‚4X{¹ÍÐ8ý qC†r£¦þöuiæt£îÉ}Èý±ÿƒ¦>-k‡Wýš46ñ Þ”ðü–ú¤XÃoåæM¿Ì’I¹>Z„R¬õ+–æü?ÿNþÔVwvKã_ÙËÁrCÄ{.¨]Dn¡+ò*ˆØ7WùîŽÿ–Ö>$‚éíË ˜ù£v ö8ešÂñ~Ø.#“¢|ñÉíÍvÇ…2´§ÿ“?ó9^wš_YþìwÃÏø:šÖÿÆBв³ðñ‡i›Ãþ/W©(^—4$Š[Œn] ç-ŒW§ØÿÁÑ¿±ÅÌ[o>üG‚_9T ‚ÆAåž²|—$à1‚NE~C £Ç˜%xÈÜOÍþb ¢³\j2.H òIíÇøúÖSàÜ’ªÒ.>’­ÊæPz´ýWùÓì·ÿŽýˆloˆzŸÃÞ.Öïu]7J}HÃ{áÉà7VјRWŠ6a)$éFEf9(êúgI×týsKUÓgy ž ñ4¼d©VÁ­"ø…¬xSÄ0j¾Öu]>òÖE6ÚžvÖóÆÊAR²FUÈ ŽŸJ÷ß…?ðQßÚÏàÍüWžøÑâ¸{´›T¼êwM9UÚY¡žéíË* ÆcÁi €ÍæRŒeSS™.køÎ‰£;F´,ßU±ý>!iyÜGÖ¤#¸9¯ÏÏø&ü‹ágíáO|øïªêzgÄ»ý(äÔ5H¾Íâ•% ðt ˜¤ØË®v®qÇèÇŽ•ñ5iNŒÜfµ>ŽHU‡Gû7~ÉŸ³7Çß…úŒ^,ñ.“užu)4¿¼ñ¥…›F’=ÄS¼F+˜#fU>cD¬É ,Aýý°>!øcöÆø%áûmGà—ˆoîo®î.¼3¨ØjQZg³Aö¶›ÌZ¼.]yŠU‡<|CàŸÿ­Ž—ð§XðÜphžÔZÚóFÒ´As­G¸JðÇäI;yiµÈVl’à ô=´%”à ÚN-½ítý7~§$±©ã\¡­Òèíøþ‡Ð±¿Ãø|-ãK'ÂÞI<9¥Û[[jË¡ê‚ieháa ù–PG/˜èùÃG+³¬…¾Aî¿ÿf¯èÚ}—ˆ¦ñçÄ(4èµ!$zE¯ˆgµ†ÆøoU„ˆ¥€û‹TŽ× á?ˆÞý–þßøSUðŒü á=]cŽoø“ÃQɲ%Èû#^Û¢¼!‚mWbJrcz|4ÿ‚°üñ^³¨xsÇ:Ž¡¦iÚI’6î'¸‹S…dÚ&š7DhPFP— ±Ë|ì+Ä«RôÎê8œBƒ²÷Ÿ•‘âÿðQ¿ü/ñ7ì¼ÞÒüsã_Y¸Ö­O‚9øW'‡,!ó¯u ü6ÆæÅ ˆ dEFr¥%bw`Îüo¯¥þ+þÓ_±|9§Zø{Y±ÖµSo¦Úè³$oË+‚¢$VÞ¬`ÚÈ ¹MsÞøÏû>hÚ}мài4ô½Ô’=:]>ÖÞ[˜eŠàËö—‹Êó”# E’G)òÙGu Æ4©Fš‚’ÕûÊý¶í±É,Meˆ½ÚvWµíú£¬ýŒ¼ûsücÔ[ã/í+ÿñO‡¡Ô.ZáO x6Ŭ­® –ÑÛBîÎkk‚dYU­à˜Ê‚UæFQ¯ÿ!ý„ÿiÚ¿áö‹áâl´ô¹¶I|Oá¸em4tk³vn<¨`«…Ò es´®á/Ûö/Ôþ"é—Z/ˆüMá¹-õ?6ö;ßÛÚë’Io,~uÌ¿y&Õ]ò6IMÊŠ@O½øï㽟ŠE¼¶ñ½îèäе`û0¸[g!b3BMðw"&ñŒ:T_Û°ÛÈáÄrI<{†â7!GS‚¿ºÂ* ñüëã µ†µáŸ‡š’ØÅ¬Íy©Oªk·Wú¶©lMÑHñ Gm4†Hd1l sM‰6³Ê¸ÊqýÖ67þòßæ»yŸ;ŠÊ¨T¼ðÓù?Ó©ùEyfh¶É÷”`ŸËñ¬­LØ«8Ï\b¿_5Ïø _€áѬ|'a¬x‡JñUü—Ñi&âKF²½6Ñ’Çzî`Äì[Ë*чîþÓ?°×Ä_ƒ>#×Âþ¼ñ?†tY/|me¤4vÈ…L‘—åŽFUpùŽGVBX6ö}ˆ2¼t½œ'gæ­øìyÿVÄÓv”ùuÔùžçt'>•Jf;¶Žz¯à;1 ¹·¸…äBг(Úý²3Ôd~µƒ{àkˆcóF'OÓüúW¥:½ÐSÄÓÑ=lñ×õ¤V#'q÷V•þƒuf7MásßÞª¼ 0cƒ‹ŽçJœZº¥p6€G©=êþ™-šñ0?¼ƒŸÃÓ¥PîaÓü⥵‡,0 öäUBM39$Ñר^YI[YVßåÂŘ/Õ«R 6Éù›‘Ÿ›œûÿ:ÀÐì¤8“¢ƒŽGS](Eò•ßÓœ÷¯R–ªí]_vZ2Fb°ì¶‰SЪcüýj¼ðo”m²PÊ…C€Ã ®O_^ôõžLy‡ÏÖ˜×ðF¥ƒãaÆ õëõ«i5fg£Ò¾ÛØèú-λàK?iÞ.…c¼Óµ#Zû4pÁšÝÙQ,’7Ú eªÆ¥øXcúÅû ÿÁIÿjÏ‚ мûGZÿÂkáûé<;«øÒ쥼ºv£ ,k¸IfŽt2YU0Ò«Ï.Ìð° œ¥ïöKúGô]ðÿãïÃïi ¨.¿ccrשfÚ\Ú¤2ÜÅrÐ$âÝÖ&`&ò¤G1‚HV x®ä!Å×Ö¿ØsöÀŸÂº“\þÓ²i¾#¿û&‹áŸTûD …c…µ2c·óÅ.×HüÇg«ô3öÿ‚†xÏÄ?õO†´?í'àí+VÔu<;á˹¤3æG³d’ÒÙ„âIU«22K°ÜOÍâò¬N Ëh¼­5Ýî0¡‰²ŽçéÓ·oõ¤“¨«ÂÒ2 ‘"°‘C•ü9©Œ¾büƒ·9¯)E#»Qå•zœR‚OQŠiö3J]GVëNèä³á÷Ɖ EàŸÞÚ[y­!²·‘½‚«8@p®Qv\6ÒW8$Dðí¹ñ;Â¥”öÿb±‚9b‰k1´Iœ*âAœ’Ø|¹ÁmÄdý1ðSöbý‰´]о5ü%½Ö-/, }7QƒÄÙëv—Å­ >Èñ«3¶6VPN÷;@ù›öÔý›ü#ð3ÆÑkß5 [Pð6¯ý.óX–ÖYìåUS%´³[;E3ƒ¸ü»Y1¶ER?ë4ñ¼3Ä8Ïc:^ÿFÕ¯§tÿ~mS ÁQU9®–ë·Èô¸¿mï„ÚÖ»â/ˆZ¯Š¾Õp’}˜xoÍîl¸™ZêY‡š#÷JSsz_ÂcãO_Z|JðïÁ?‹ºÞ—£èòKá/ÛkvÒXÆR'òUŸxHÁFâW,‹œqÀøl5×X-ì%’I(£L³—, ã’U€õÚÞ†¿SgßþÜ?f~^ü_²¸ðþ£¥Â#Ò5'¸D·‹1Ä‘«„>C¡ÎPÍ܇ç/åq&]–åxhʒ攞Íô]U­³;rÌTñ5\j«%åþg“x£ã¿ü$W;oü5ñŽîxu¹’Í"–ñf¸ŒS½ç*›rsÁ®íÙ8?Äïˆ<.VëÅv‰e®MWaqFïËpIÝ]ÊáÃ-øg ¯dÿIà^ø§âWŠ­ßN·»k)´JÖK“?ÎûX¤2*9Q(Ÿáô?Žÿ ÿfõø|Ÿÿjï øCÁvvê/‡Þ ×uÛ¸Íü>\AgK{7K‡VÊb3/›€@å'â°Êj‘S¥+_h»·èš;+Õ«MµÉè?´/À¯êÚWu#_óJMg¬x>ú/·4Ž GDÛy—h(Á>UÆ gÎÆ»ñö_🇧·ø¿ã½CÁzûÇçéË?†ï‘­ç.H6;F1Ê$»3•ÜrÏ_ü\Ô|7mñ_Õ>êÑÝi¿ÛÏ¢êVvW6‘ˆL…•ãK–iã\c #ç5×~ÉžÔ>3|lÕ¿Ã8\&8šnVJö²¾½6‹îù%M\Md›±ìþý¡µøm4o|kð}†¤jú¤Öö^(i¼wRAœ²ElöÆEGR›u æq–R‡ßþ~ÓÛøpj¾Ö-înZ×íë÷MóòóÊ å…|ûL|Mñ·h½gÄ;Ô4 oSЮã´Ó¯´½=§ÓfŠ&-_´!3GÈæE!—¡eÅ[ðoЬü\×:ýþŸ­éŽï›4ðe¹¶Ž4Ë— Xþói‘F]‰Û‘Ö¼|Ã'© p­Ê”e½ìîì¬Ú~®éi±×KË>W­Ò‡µÖ›â_ˆZn‘ñºðÜøz+¨ ×o`½’'’‘C7“'dk¼å’]3Ëÿzx{Ä¿°g‹¼5cqðŸöŒÐôiµh¤‡O» E¸™ ÌØËpÂ]ÑFØJ²åZüÑ?iýOÃï§ …õ’èOö2ÿR¹‘îeb £…‰YZo›*¤àuÝÇ:÷ǯŽ?4{+ÿxöt&f•ô¸e¹¸žéö4¿l“a•TLªë¹YY°IP¬¼j˜LL:މî¬×áuÕÖ]_4ã$ûïþg쟅>xî-#Ä_gßü=ø…¤\=ÍÍç‰<Ä¼Ž ¸s²m—rý£q»È0§;ÎoÖ¾|4ý¢n“Á¿´v¯«êŠöÉ&«wiâ{ÝR}<[§”g¸IÆÞé~Ñrª" ™0ýÜb¾ýœ¾>xàÜ—þ)ÒõýJË_¾ŠÔôÙb¾Úæ6ó£†W  uLà‚›ó|Vñ/>/k6>'ø£aªhÛ˜ì‰ô±o§#™!ØÙ.B,.èCÝ# yÎãX{jŠJIÙž8Q£Híç©ìŸµ7üï´7ÖgßÝë°ézyk­ïÅvÚåÞ¨"óäX&†ÚÎÔÚGk,ÛHKÓfD0Êv£~}ßü ŽÆóW‚ëâ&Ÿ3ZêÓÇacj äd¨¼²þJðBÆw0üçªß¾ü¹ðo‡þøkã]Ž­®Ã-µÝìÖ³ØÉcÈ)˜"R·»Ÿ, *°*v0ܵò_ü÷örøÙûK|xÕ<}¦Ýë>"µyït¼EâË}2míç–X ¶YRÛj„mìªÒ+Ü2]…{¹no™B¢Œ'gÝ¿ó¿ärâhàkA©Föè—ù ë:-¤òýšXÓz}ðFJ†+’9ÆqŸQÁÅrž*Ómôµç,ÇdH¸b9àßßšô¯þÎþ%¾¡ã‡~&Ó—PŽ©mrâäEóI2´ÙÉQ÷°xÁàç5ƒ-ŒS2]ÜMö‰Ù>QœœŒŽ;g¿®+õl,ž/ I®n¶wü‹«l5v—ÃÑ_æyòÅ".L{Iê*de…ÃÝÍ]½Óõ»žVµXbiO”™;‚çŒû÷êj³Û89+Ðó‘R£gs§Ÿš&Æ“­EಀF¨üsZ¿ÚÚ\ ÌÅŽOÿª¹[e ü¹ëØ×Aá­";§73¿È‡,+®Œç-ÉV¼h˜!ŠAû¡´Œà.1S"Ä® D„ó1ǵ,â9 óBí9Å*ÈÄp}ÓÎÞ•t¥gs’ã® žXáŽ8ðϳîzŽ£§§½}3û?~ÈŸüY¢XÙø{G‚×XÕå/¥Þø²ÊÎâÆh”B²¸óOÞnBÇò£n8ù‘Á‘B¥£`õ ‡ŠÑð×Äü>ÕGˆ¼-½­Ýš´ñÞÏl’‹rüÈ$FÃŽªG*ÛX@¯?Êñ9•ìª(òëf®Ÿù[Ðô2ìU,5_~7¹õßÄß?g[Ò>:~È^ø‘£ëZ‹˜5 ÜÛÜ:wx±¥”‚dÊ&×eŽ0Š#3 ó}#\ÿ‚w}±ï~ü8øÃ¦kÒj)wwu£ÝX*Yà4QRId‘Õet]†IÄ»BsæøçŒÿhOŽ¿oãÇÿuï»C3Ãη+ÛØi6DÌ«%ÆÀ1М0¦xSáWŠ2¦GQÔÄ'8­¢Þ¯®Ùü´=׊ªñötìŸV—éúŸÒoü»ö¨ð'í7û%xfóÁ«Ü·‡ô{M3V›X¼Øî’Ï”òyQ$î”´‘)9‹ÇÒÅ˽èkäø#‡ìsâÏØãöZ±Ñ©¬xÎëÅVK妸y,"·Èd.Ã|Ž œ€óg#pòOí[ûü9Õ-.ügð·RÕmüB÷ñ¾±¹: 9"+åP‘îI㌠1 ¯«å–oløËû^üsð1m2çៈd°¹‘®³á›S}hd*êÁ 8à•Ú%FAÜ|3ãÇ=oÇ.Ú–§(Šå MqfÖT1–Ór¬Å„Ð(‡ßû§ÓÂb3¦¤q}ífšì÷ÿ3âã¯IƯü1«û;ü(¶øe}>µãؼ3¬kqËmý‹};n’/³Æc1n˜¸fÒUe,Ë´zÅ/ÚûÇW‘[i"ñJɧZ[—`ÑÆ`ò‘Õ2v*î 0<‚{ù)®oþ0|EÓ¾|&šöMvÿlPOk¨ùv‘—q2apå1Ëw$.á´*ú‰gOÚgöf¶›Áºï¬usT‚iô-0蚥ܗÁcÖÚ?+í;7WLä‘Ëmë­‚Åb¤ªb*(Ôžª rè÷jÚ%×[wó..7nrŒtºwùÌ‘7öåÌñĆTT·†y<Å ‡V…Àù9=Wà–½ûY~Û^øÃðCEø9ñšÃú¾™¢D[O¶{k¸8ÆÆKˆ&@ìŠØhž6MÑ+ç|Qñ[â嶸ÇÁwz]˰ê–Rékk ¼êeWHbY$`7œ39^p<þëT»½»Ûux ”‡\HûǦ '=[ÏZör®ÆÕ¨ªÊ¯"O¥ï.Ÿ=QÍ_2¥ò¨^ýöù“øÈé—>"¼µÐ¬§m1YšÙ£‘þe,J§ p2ØÏR³,¬maœÛÏÅŒ›´¥€#ø¹.•rÅ.;¯-S`ŠF'©É$×#ò¦ÜN6†™Ÿi“¸þ>õúd0ñP;ækKµ«>zS½ÒVôÊ—6òÆ œ€‘í?­}áOÚ¿á?ƒ~i^𗤱ִ›Ÿ´ÿhÞÄ'³¼fHHŠhP£:+FÊC­¸¶9¯l#žöE{Ë!žIwûqõ§¯‡¤[¦[5qœ#[ÁbKcÆsž=ù¯9Ë2ÌËÙ¬L¹m²æ·àμ'„”§I_£Ò殿­.¯¨>¥q«K<ó4‹s¸yQÎÉvÚ„ q€¬pF+•Ô´ƒ}¨Ú^Ýj—!4à3 2.BÂà©*ÛÆ2IÖÌÚ&»o ¢Î±4œð›Æx œ€ÜgµzGÂ_†_¼cvtƒ^ Ô5=N-³Ãk£Ø‰u;ÂÊÀGºE1Hè »M™Ü+籓áìƒ •~ÒZëÍ­üÞÿr:°ë¯.i8ß}_—æj~Í~ñ׈õËŸéZÍΕ«MÛ¬çÒt…Ôå3ÄC©q ë-¦Ü(Þˆî75oâ<×ìëñ×á7޼]¥\j÷.·¾rÌ<ÙM«Â±MŽÃìä‚+ëß‚_±?ƒtjÞ-ñÏ€¹mßAü)ÿ‚†üJø“r4ˆ?#±–Ksçj>!¼3}±„±„‚ŽÞGIä ê$¸ó•Fܘüµt÷§”g8\*ÄQ—4½âöõ^G<1ø óöU£im©À~Ð?<3á?ùHh¥âšÆó^¿ûL“Ú<,r¬ñË>$PªÀ ˜(l¯oû+üQñ,7Z—‡ü¨êÑË)Ýca;ƒ[½ÃNqò£¡vPÅCyrmýN»øû+|#ðŠþ?Gá½KÄšò,–Úž“sëö/>?¶È?²,°C;㹌#+9b®åùö“ÿ‚ŽxcÅZç‰5OÙ×Äž8ÓN½­Ü\C«Iª=‹FTyмï;°yŒ g*¿­”ç¹õkQ§iÓTݽYɉ˲è'7._F|]â‡Ú¯…õ3¥k:}ŕ¨aÜ í=g×½Q·Ž÷N8µ•©Ãm=k«ñN½®øÏÄ7~-ñNµy©j÷=åíýÓÍ,Ò±Ë3;’ÌIÉ$’I$õæ²|…–Vw\Óéë_¤Ñ…GN.jÒëm¾GËʤšŽ«Ìe•ýù%¯-A¾Ãœz¼UëkÅ–M RU‡ä*«Ì¨Ã q×ÖÆÙÄ…³Q[§n¦J[#D¿”÷éM³Ñl|Q©A¢ßëÖ .é$»¹VeEA¼‰óHNÜåŠôê*Ãt.بbð床·o$v÷Ð^-”}žh¥k{ˆVH®$Wòå ѶÜ0ÎpO<óŽ2œñ8:”àõqh¬<•De.5ŸÃ­ǯª¯Æ G¨ÃËkáÈîä¹–æ#3§îîmV[Aƒc— 2´¥pH ѵÓ<9Ó_ÜjªÚk0‹7šš¼•€9R¹`@;8lWÝ¿°v±ÿ×ø½â«Kß|-iqp—K&½¬Eekæ)t···µ±CrƒìáÔ;K†“ah$vYÕþ)|ÿ‚Z]꺆—â/€þ4³Õ¼?–îßáµìKo4+)U¼h®$íäQ³‰d_,K¾Íõøn&•\%G ‰§æ¿:8˜)A«“ÿä|Aø•ã…ú÷>"üz³ñ†ÚÁ‡¼©ø.¯4ësû¹<»Shà,’û͘`|oÔË-"ÓOFÈFã–%É$þ'šøcþ û ~ÞšÇöø ¬xÞçQ²YmæÒü]7“.v7G)¸Š8ÐH‘Nh(‡ªÖNvz­Oå¯_ý¢|C¤éfßCñ•ÌÐÄ@xâ¼`Klîñ¸îóåÊü€ŒBÜn³ñoÇ+ÕÑm¯~Ûyt¿Ú ¾d”n`æŠÌFp~R@ãršP«‚ò¯Ùð¼”ajûGyùJÖû’W?3«âêAÅ%öZŸH~ÊÞ´øñ>/|y¸Kº½Óí&ÑåþÓÜñÁq)Cq$‘3yK…*A>jWËÉB¼qû<ë?~AâÏ|p·½Òìt&¹Óo|W—åÉ"/Úo!º”/“i,l«´|»QWKøÄ…#BðOa^›©~Ø´¾«àuøo?ÅýY4Aioköe<˜aXcMÊ7€p!Fs;àì~e‹xÔ6‰Ý4¢–ܪïî6ÀfÔpÔ])§môêüÏ¡~-i¾3Iø¯â?j2ë׉î•kkÝÍŒ £eÌÂ#òŽå`FOBAÁòÝWá_ìÕñ`jvÞÑ5æÔdµÐã]I­ST,ÁV_ôÖ(Á,ÁÊùCàœ(>kðgÂß|A¯Ãgñ‡Æ×z-•ÍÊ[Çsio¿ìùmÌòc%n@m­ÉÎ ùMïw²Ì“5§ì÷ x­8A=Lj5g‡#p/lQ»£Œ»Ñn9b–&úµu‡ÃU¬ªEë%qýí&ºhØçˆubêTQqìß½ù1ÿ?cÿŽÿ³ö‡ˆ¾#øN+m>éPÁygÌ-¼1M²FÅ !IÀ< ó/-\|ÎHÆ0½ kI©x«ÅÒXh—Z•ö¢ðbÛK¶–áåòƒq©'h8^ ö®§âŸìßñá„4ïø¶ãJHµ·µŽÎÜÜE"¦ò6Pvà½r¹ã<Œý•*òÃÊ4qUbêKáIZéy]ždà«':0j+}oú#áÇŽ¼'ð÷İjþ(ðÚôL†"Í€•Q×å8nÄŽ½§j¿´ÿÀýkÂrYè ž[õ!®n!h¢`ªÇaUëÁ!ùèá¾ üñÆMEü7£øƒOÓãƒ'Ú™$Ÿ/ŠYŽžF3Ó+Ö|aÿëøéq}k ‡ÄM^i8¢–ãRš*5Ur×(*±Žv€ )+ƒ_-™axv¾c'Ž’Œ¯üÒíè’ó_‰êPÄãhácìokv_×Ìòí+âÃ].ÓË“àÜWòy‰2ÜK«4y-üÅ*†Ï1·.;.vã]ÿÁÏÛkQø%hºÇ€lu]WI×ϹÒõM©4*…U ¶7’GÏѰwc\Á?ÿj8´¶Ôàød÷1¥ÃD©k©Bìê¥GšþPîÏ'®Üs]g‡ÿà”Ÿ¶'ˆ<ŒÓÁö6·ò´;MEÔˆ£†1¸ðqêHâ1wòYÔŠ¿U;þ¯ï"Žhžºü¨´Ïø*wÄoŠº-Ÿƒ|Yã;ı݅Aþ’#•Ô¼{™^)›<*²·®îq×|I?lÿøsâÇõÕµ g@Ñ­¬¼<< â¡ki— ù’ˆáuhçv˜²H&Þ ºí+ò×å×Ä„~jñh>ê=ßúÛ{mNÓi8$P}óÏøƒ^½á/Ûûâîá+êPhvÖÚe„ÐYêg†­¡¹bÎUÂyi°|ÀíPXà¶OÌ<˜ø±ûÜø3S¿ño†_R—ÂLæêÂÒæ76Ñcˆ‘™ee|ÿ.âÇ ` óoé? .¼@4¨"ñ ¼º…¤6÷ ,0LLbT„CsºH¢$“‚Få#ïÀšŸ·ü‹á‡¾[|Rý“—S“È´u?_ßÄ×VåU]’iDrÌå’•™v«9U“žŽÏE½Ó.5oØsöËŠþx ™aø{ñFößûJ$d++Û^9[{òE²6Øøè§.Ê5ø(oÅOºƒþ"YiÌV«hÒ‚m.¦Â²G6$†Y“Ÿš½L¯Q©þËVê-^:§o8?Ç#ÕðÉ^¬nßÏîhðÝVˆk¯k3ëº^ì­æ—u4‘ CÄN{ †àcµcy(>i¥$ð »rÇÜ÷5ľ-Ô¼Oâ ­gÄíÖ§y$§Ì½¼œ»É¸–$äœ|ÄŸ©>µ%Äyàs;f¿VÁÂP¢¥8®w»J×ýO­%)Ú-òô¾¤“*Ü[§\UIõeÊD¿6z‘ÅV¿»¸µ‰ž06•Ç$g5….¿¡c3°=ºÖ³ª¢Â•$jÍ©ª» [<àPš¬àÄgÇB9®;Pñ5ÅÃ–Ž â<þ5@jw ÙYÊœÿ®7‹IÑÁ·O@¶Õ…½ÉF’àt+œzUèüG k‰£uãç|ä ó8uÛø%7 xû˜Ù}Àþ"¤>2ÔãOõ±ÝY þ¼Ñ l°2–Ç©éÚ¢Y:j‘ßVá^.ø˜0;•›€ëÉŽj÷oÙî×ÄÿåÔ.õ‹’Ù ?P¶°±ƒSÖ¥–âø¼[p-¿›Ô†7 ÊcR†åGÇ:_õm2}ñO••¹U$ä?/Ê»Ï|m½Ðõ/üoðÞ—­ü3ñþ*ê¶â[M>iJEh‚èr85ù~a€Å`jrV™ö9f/ ^•¡/¼ôr` ߀$ÉSŒ})ÞLeƒàgqÍ!fÆ ô¯9FÌôî![FsB©峚@YºqïC8SŒf¿¤Ó¹øÝ‡QLŽa!ÀB>´çpƒ$ÓLuR9Z„=Ž{Ò9ÝÐРžzãÚ‹Xh–Þ{›9RâÊáâ–6 ±¶‚b hø§Æ¾1ñ¼¶sxÃÄwz°´ÖFêRþL@çhϹÉ=O~‚²•¸f í\d€N9ö战²îÙŒž3Ž•„¡BuTœ}å³¶×ó-JqƒWÑ×ìù úüE³¿³ñ#i©/+¬»^@8#o$œ–ÇËŒäÙz'Æ/ Y­¶™¨ZÏ}gu$´ÎV~ ª3çíÆNÛùÿiý­ Üwºá=» ©"‚ÝÈ$…Àçæ·µï-4á¦Ýj¡g« $F“Ë ‚¬ØpG¾r_‘qÅ «6æu/x­O_ó>£'¥ ø[;«3ôwà¯ÇO„0[Øiž¡i§<—bf[’˜kØ'uËʼnÎ+Ü'ø«-ô¬ÚN³eob‘+å1¢Ní"†LƒÉ;‡9¿9 ·ò»Â_Tñkë^#šñ–HbûTžk‰|Ã)o4•¿*€~^ΫûC®…}öŸø«tFÙVì ÉÞYv6œAo›ó†Û›5ñ°ŠŠõ;%–Â3¼dϹþ+Ù|4øÅ¦bxÙ,/lÞU•ÍÅÚc”²‹›”`“œ| ƒ¸ÏðLÏ–ž'Õ.<#¬išÕ³jXÉmnöÿhCž‘ˆöDF0P£±à×kàŸÛWÆžõ7uœDì†ÙàwT›~Cá 1lô\ƒòž-É¿iÏ‹Þ%Öánb¶Žáå7ég,PÎTåfˆ·—Æåȼnݸ{9fs˜å-¼<­}ÓWB«–Ò«ô>5øð¯Æ_ /.,|[¥ý™¢¼h#eMÈ]Ù’ Gï#à|ˑ󧯾n„‡rzõÏÚÏÆw¾:ñ†­ÜÅ%´qYÉoöy¯äØ«î2~ô{nrs…9\~›ñ2ûIøeð²igÔµï.u'³Ý{ò%”¶R2UX¨$uÁ þ½’ã±xü²‰ÙÊO[h–º÷õÿ#æñ”iañ.šºIzœ|¿krwX‡S×+÷…B‘D/ Äz*î ÅCÀŒ‡KXéŽ1“ì3\5ã\·Í3n$òI¯Cñ„º”x”¬ª¤ î^N??ç^}­Z›Ñ»20è6÷ÆGEF/™=N¬¬·2î%x˜’sëUÚ|Ÿ#ÒŸ;‘ŠO<ôªríÉfcœõ¯&mÜõ —);\ž…óŸj†iÁÎëžj³HO )¨Ì¥Ž·jÆUyMyIÖào'wªæ›«Ýi·q^ÛMµãpÉõ²ë×'ó§ ¬BŸåQÎ.å:\ÊÍኒjWOñ8Œ¬® ¸(6“œüÀäuç==@ë_u~ÀŸ¶ßмãê¿4O Û<$iÚï‰õ‹ˆ´ø¥.%2Ípä‘ü'æ%†vŸÌØõ"8ûóŠØÑ<{âMäÒuI"H pʤ÷ ÙýNaC šÐäÄ/ym.«üÑË <¨US§¢ê¿­èöø9»þ çà˜SÃÞã[Ùìtøú–‰¥}¢Ââ$3¤3]I ΪÄ&ùbŒ“Î1’©$ q ˓Ԟ•àÔàÈ΋–­ßf­MNÙ瘨ÕQ©'ÛSDœvýiÂsš­«Øx‡KÔeÑçÓØ^[\.mBñȧ ¥{0l‚:‚;sU¬µ´‘Á_—oSþx¯Òhãð˜‰ZœÔ½gÇÏ Vš¼•ðãÞ‡º`çÖ›ÊΛÁ'×Ú—xä‚?:ëRMÙ¦#)`@Ÿzr|Ùô¦…'•ÁǽÛI0;f’a«€ „Ÿ›#m&d+€UOð’3ßÓÿÔie0Cš‚ÖWÚñÜÌ’:1ýâ)U+õ?ˆ'Ö¡¸§gÔ¥y+šyí–(ï]0 )xöíÀ*H£*Í9¤°òŠ]š0äÔe—P6Ž-炇 þè0vÁ<"dŽ:î\äcbjZö§é’Í Í¦ÜÊYáM̨ێIAË.bl9VgPH!FE½ªÅmæ5ØepV8uþ;Rlˆ#‡iz£]y‘Å) …X¦Òû㌂£‚8ÆÎ@à|<[>‘YšòjZuƒ®…w,Oµ‡"äE">ärzv€ Ó ©5×h¼F‘Áö¬-ÂLM²lTÏ X©#®6q‚3\FxóÃ%ÅÕòîhÛ k…\Ã9Ëvêã‘“šwÚ Ó­mâ¶‘Ùæ}’0°Œ@ç`V”VæRšR5u¿éÞ#û\>#…eLùM¶ÖG'†f_º@=ùzåuÝ&Î „þƳ¹ J70Î 'ÍàÚ ‚xÈ9«º¥¼Ð¤×¯¨3mpÃi$ãnâ…û×ê8Ç^nÆmhZ·ˆD¾ŽÑ]Œ×ÍlûÆp\|¡ˆ`H<Œ_K/ÎñÙuKP•—khþ_Ó<úøl>'J‘ÿ3ošV™t‹wâx^8çd6pN<åf Û ä©Ã{C~ýƒ4´¯‹/©ÛhFØÜÙK_o,Âe% VÞÊ…0÷\ q¾vÓo¿²íœ«Æ<´V…×nè@b¬@Æqµ±ÁÎ9‚OªþÏŸügáŸÚé:Õ¤_cŽÚ9-WQiX!}¹h‘¶ìà ¬ °àb³Í³¬Ç6KÛÏÝ_eh…‡Àá°ð÷çÞž-·ð/4éçø³§é7–K¥Oi°Zˆå”Éò.$‰–…ÌY,Yy?uXïüáøÿðëEøqñRÒœI,‚Hdïó•lASÌxïüWªµþ›©øìõyZÙ|;}£¤cN[†EI* bç'iÚ ig8œŸÍ`þ(÷óõ2Åࣈ¥in¶gÆn ààûdWã- ÔÝ¥˜"Ê›¢ œð~lþ'=?­z¯ÅOð×nl#ñf…ªµÙk›i|?Gk$E‰S1Ç”ÁÈÚ¡G#åG-«ivú­‡’Tp¤¦=E~ËFµ,Ç´ÓWGÌ®l&!ÆGj– > 0ö¥dÜ*¯Søf»}{à hY¥Œ.[mÆÏõÏ_é^YÁ=‚ו^„“ÕÝДU™‚ÇßR0qÍFï·‚åW®íQ26ãðªrļZóªE¦vEŽHÈ'Úš%\àœRÈÁO=ÍBåI܃²“ÔÜ‘œ øTLÀŒþµMfÛŽjhnÕ?€ÑYŠQmVàaPšÙ°"æ@ŽK*÷nŠ}r{×-¬bÿUÏ©§ _R”•i‚¹Á?–zí†!Ejr΄å±ô}ÝÕÆ¿}5Ýåij\Üy¤Ÿæ³’Y˜ç,KÇ$Œn8<ÕJ+ bKk›iQÇÌíUbßtŒw óqÈàÕ#{ ‘¢ºfIAçÅ û„0× Õ£{x\e¶<ÌGïÐy°a¹n¤ƒØô¯Ê)âkQ—5)4üŸÞv©Sª¹d®¾ò¥­ævaŠôO¤žYCƒ“÷2ÞsùS‰ýýœË–`²NqÇý}ºŠ,e…c:í+)Užx=¸ô€ã‘R­´³•w²EXÀÙ)m¤¾~÷ dñþÏ¿K„âìß Ô½ÍU²¬I]&½ ›QrÂÎÛR9¢ef' Žø4È5Sq$–ÓÄbuÎÎ 3Í[ѯµÍ‹ÍQ¹µòAÉŸÉä°$eNNHRqíÓ´> kú>½c¤Ë§[ ž[÷’êVPyq À…8$ýÒ û™wãñ™*„R“³Ý~/ò<ìVW‡ÃÑsRw2S‡ó$“#’ªÔñOi­®. û•bmÇžh ò‚ÇxÎî Á€í ©¾!Y\œp¤rES›Ä6vº„ZUÓF‹,ûTË Pß)8ê9Æ1œýFw<- '·ÄFN1ÝGõÕV•W4›î^¸µ–íÅÂÀÙRYÒÙŠ¢çÕW€¿zѱÐÚdKĸœÄ¡f¡›å*U” Ÿ¿“èBœ+.{›í>ÀÚ\]ªE0/$å d«Ô.ïÁ$m<1ªë¯Æó‹-2;™®cŒ†)[rÈàí˜0Ë`ìÎó¾(«™QxzQä§§›vþ¶=Ü[4½¬Ýåøë)¬\[Ék§ß][Ú„i&tT&¥—8—v ‘¹xÝŽsÆN­mâ=3M³»ÕôÉ.VK—÷“Ù„Št %Ôìs•|H2AÇâ­/ŠtýNk&Ö4õ•6Ás¦Ïåy F!•‰!ƒÊœü½t>+ñ‡‰õÍÏÂ^ ñ$÷šf ½µ»Fb‰›*¹+½£Ü¦E*­“€ÎsòS~ë_qì)?„‚Îõ¤´ ªêi"H7O!™Rª9ÇÝê— ×s£xWÃ~*³iþ0|Ãl¡K° 1Áùzdî8ÆÂ~nkË­´Ÿª$¤D#Œo íÜÊ‘ ãÌpÛSÏÛöžºñ»ø{Mk}1$Í·–mb¶Ú *³’ òFF›–Î;®­ò´ÞàÒg†êòê±j±k67è—)0`É+C$nŠJ„áY|¼)'‚O]ðóÅúÖ†º—ˆµ½2æâþâ°ßËs0’e*p[z©$§8Ú;ÖÏÆZÙWC×4»hɪÄod6â&‘Œe£F]Å_-´0n¸ Ù|÷[]vÖ9¼i=¬öºB¸¶k˜l'kTaÌhf;ÕˆÁ 6×ÃAÚÆ“å“ëæ+r½OSðÖ±¨xÛ\ºK¹ï>Öö{y‡ÚYw˜£kyH¨Ã¨pÙ,1AqáoWðmí¬º˜´mBÃÊ»vÍÈhù¹°hÎÀp `d¥yÎáÏèß %ø“ªèÚÃh¢[v‚Ý$å¥w‹ËÚä0ÒÚÎhÚD‚MÛÃ*±bV$ù‚B`¶0Íâœ{-zwŒôÒ\˜´Û`÷JÆMq“1$ÊóÈŠñqEIë¹ëÐÄûX¦Ž~häØìhYœgçÖ§¼XçÖ¨ÈU$¯õõçKÝ‘ßÍ6Öé!_˜qÞŸökXÙ†sÏ *´…óO¿œ€ÜŒÿ!R=Źýâ’HíšÖ2ŒÚwê{Œ:jÙJ-¡ÓlÖûØù¬2TœáF:ä÷Ç× ‚]IN¤a…Á—oÎЩÎ:‚y<`xGCÛ°ñµ½'Q¸Ñµ8ÖöÎì[OÑ2yLŽÊÑ”à«)a¹08Æ+ ÃLÒ¬dhnWÎŒ ¡¢³Ë”'#8#ƒ·¿Q“_Žª‰ìΗBqz!mõòÈŽV Í÷ÃãœzŸÿWåSZËudáY0ÎD„6IaqÛóÔÓà‹K†4²Âå"}Ùädvè}^bê_*àD¬‘; ‘œñóc¼8È÷ÝU³W´!¸yEÃlPˆØÎ_8ã×>çŽ{Ôze•ÐkVõíâ‘Ã$áÔ(+ÝžpÆAÚ3’1œÍ ‘Ý¡ŽÞ2¬ÄmW‹ž„c8 öoÃ9©c°žKa¶ÙÚTpnŽ~^yìOlzŒœßÖ&½èIÅ­šÒÞhÊQ»Õ'äöf-Þ¿á½+Oiá%ê_˜f²XþïæÄÊÛpBí©Þ\` eö¥®§®7Å 0y1´ŠT™~öN@$ óÓ#<&¿àËN&¸‹O·Ž@7ÛÎË‚°ùrO\• 9!Œ/ÃÈá·† gQ’âdº3!ræ\ŒµT–¸´žOÔ`¸®­<¥á±w«'u}´~~Gòü4«*´ß"í¿ÜnÝÿfyBá_náû£ ðQ±‚GñŽÜ“sõŽþÏMÑⲃErö·V®·VqÛ¬QDUcpSÇ(m»ŽÒ©-4È-äÚb;†<Ÿ)lmÏ@·AÆÝék;F±ù…œH±Ê¤)Æ‚ÝF'>Ø5R¤$’}ØsÛS>Sá&×ì¢ckå DŒmhÇ=8=:К°ÿðǤ}ºçO¹k9å§13g ¨å3œdp~làÕž¶‹QešÊXìüÃ$ªŸ4ŠÅ06*á1Œ§c›¬kéóG¥Ko,Ž#t1BˆR¬Ç“‘§“ƒ…ÇCUM»´c­¬ÚðϽL„Ƕi¤&~Õ– @îÇ®=lèžñtº½Å…¬ù‰¾)¼¼Æ²4( · ‚0Fà‡œ73ø_Æ·Þ°Ÿþ¿Ãa}s [Iª¤³5ãDH-°Œqîi*ª63/œÝÑ¢ u9É‘ %!Ô¬@0p¨1«1 ò(ÎátÚÕêRåZ³[ÁÚ¶•ðÑ“PÕtŸ¶yŒm¯í"Š=’ÛÈDlTH>û°62„gojÑøƒ¨ü:´ÖXð6‚ÓèÉ 7æ-J[{…²yP5Áo.Bgû˜*ZM€' ¹'ÎuI’{xßJñ7ÈmÙ„’HAL•†PíôPF9Ï&«h·fní5 k†•ㇺ´gpnr§;¸êzuî)ûHÛQ9·¥Ž×Ç|qy|«á]qôÛ{[“-¾‰Û•’TÙ(œ¯î˜ã‘·¨V®w½½–Ïþ :õU¦h>ÔÌÈmÆðrr¸V*ÛAÛ‚qZ¯‰5{}=-]-%Œ–GØÙ¹ÞØ!·lÂ(Áþ,“Á³ŠnaÕmd–Cg-¡•šu“Êó\é|¹~êÊÀíPÝ𽪓Պ1³Ô®u/ØiBÎkûÛH.Ã4„«H¤l,­€ê>V2 sØ-Åΰª¯k¬[Û[4q—±µ?êd@@—÷-½ˆÜÀ)b0ÄöÍKuâ+R¶û°.%H­Ù^IX¶Ç/¸4qôÈóåc±ÄŒ·žm.‘Ù”Û‚ÑÈî¡X‚†GLr: ÷fÎsæWÐNÑnÌèüà8üwmsywâÛHîlÒI´Û+É=æÅfg DH—¤‘ä]«ù•êT𷉥ሠ@+"ÝÄf‚¨vU*ÌT6@ ¥‚œã"µýÓÏ ×7·É$·Ê>Ô_,dt*àÈ…NîØ ã§9à¾ÏIJ[›i4ë6´Häcrö¤Ù~ñe8ã< ’¡z“­²Ž°ßm j8¨¥c MSâ ®Ö½y{ˆï¶Þ;Ù¨è7yhÄïùF *F6©ÇóúƦ¦u­.ì:9&8ä™cP{…cŽA8냀6-ίxg»{émüÉCΞ^Ô˜©o›®:ädŽä‚*ý–’úÅË[é—‰,9¸‘®n£IfîÄ(^ÝÀÈ Æ}§’æTðÿXœ\#¦²vü7û‘ÄñxyTå‹»ûÌŸ ȳÙÊ^Bdcó»0âºèÜtïZ2¬ûFÛ€>nIÅgèÓÜÞßÌ­kqŸÞ*Ƙ/ž7ääí׊Б¤î=ã?­~Á‘Fk)¢¦îÒß]~ýOžÅÿ½I¢­. «V·¹v—r íî+Îücà-BÞS"ýßïGÿZ½!k…Ì,Bã‚O?áøQq¨µhæ]ÈT— ÈÇã]Õðôë+1añ¡;¦|û©èò[1ÛïµsVaŸ¯5ë>,ð¶›vÍqd|´$ádãé\>«á™C‡püëæ1xBZK…ÅÆkS“•¼¾£ò4¢p§åÖ¶áðŒ÷s‹wˆ’ÝvòW߇©i×ZmÓZß@Ѹ?tŽÞµåÕ§V”nÖ‡£ ”ê;Xx¶ÿÄZW…ïõýOinAµ!ŒXþì Ç$IéЊæþø‡Å¾$ðÔ·~-Ò£¶»ûS#ÛȹýÒ•…΂B‚ù—=s[>+ø«á¿‡w6Oýº%º»½Xì´» }× Rí+/V\Œ Ù'rkÂ|cû_kk ƒ,Z`ä[H*HXÛ בÏAŠü†••£¤~g£MU«Ì÷ ôÇKeH¡;å|Ÿ›ŽyÉã·j”3‹Xmgó ™@_º£n~ûNpq^IðsöŒÔ|}âèü+â8--|ø™mê%”‘ˆÎI?6=Hë¦ÊFynR'TXIi’ŒqÎG#xéÏpN5(JÒF5©{7i"+ˆ 6åš7‘dW€N@À#9àç§ëBkI/Ò-=Ý##;;Ì6ò¤!ˆäxÏài ÚybTg‹åšL Ø$`t?\ޏª}¨«y¹ÜAtc¿nxÁÎxcôÍJ“9Úi‘]¼DË'˜«$ŒUvÄŠwCuÇNã=†tôõK˜’Sq¨”ªœŒž‡“ØçØ÷ôÅQ“PÒ;t’ÖQ$¥Ç1m+Àî?ÄGà‘]Æ«àØ-ÄÚ©›Ôˆý¥®.ÓáW6qNî2àÕsÏM- y¬¢²*AL…ƒìʆÁbG@~…G [éoâk]3ÄZ…¼VÓ]¤Ï#ä¯ÊņÈR3É'²ät¾.ðo‡<3m§jº7­5ËMKKYš]-äÍ«‰òeÀ‘J`¨Ü#*6ÞìÛÞ<°íšî°ÈÎH Âç®IÁ$ÆzqU{1¥îÜÞñfá84›wCK=¶—ij–vw¬Ñ·eßÍ-!ÁEPW+òn^[qƵ²+r÷·Ð´sIoäù«» [8ÿ{h9™§¼šÆ§”···h`lù!Ú[q pÜpíÎF‹–ºn¯"Z¤ñ³.J@>Fàa˜§Ÿ§Ü¼Ëæ™Id˜O’¨ìçv6Ÿ› òœã ž™çn-BêÂñ¢²³ |ŒÓYEi.%?!ˆV<S¸ú?-E>‹&£jfñ>±1,C½”_r79äòW¯'ÏoJô°¸(W¡íñUU(tºnOÒ+V¼ôFUq*œ¹(ÁÉþ6c^\ÛErRÒÁK¬Á›k`¹È$g'8xT.mm.˜I5¤cqò×óžHÿ<ÖΣe¤ÚÁrÖŒÛ`’(B`ã |ÿ7ç sŽO mJBnE” 1P¸1´ça`NöÁÎ:åŽOL}V<áü-(Ò¡€umdäÒ»}íg¿kžm\77:•ÔzÛ°ËMìVK¦´&$#%cŽBÙã$2dvè{uª]iZ•Ì·ÎÒ%ÁàÉ cêA^Ý?1ÈÍý>Þí#1ݻ¶yÇ¿ÿ^›ý“E©9*ƒŽ™Ÿç_o Šn\E:å’»„á«ôºW_4x/mÂRwOx½Þ2÷Jµ¹*ó«®ÖÜxUïÙ@t⢷дè¯ëæ™Ûý# ãuãô«J&·…T•F2éR[d3pGášöpù6S„š©N„c%Õ-ŽJ˜¼UEiM´Å1'j4³2³ÅK 1 HU ÇMS²ÐuíZK‹íËž7P÷3ZÈ­‡HÁŠœ3'ÊÙ  PÄn¿g{e'ÃÍsJší#šêhCÆÉ ûl*¾bÄ“'2²±ýØÏ–™‘GÊüL±Z;ß5ÚN"*—`AÈ q1\ž1_šq>vñÙ’…-aOn©Ë¿f{x "¥FòÞ[—4¿ ŽËÓ!ñBÇžw  Ÿ «V:Ö¨•Š; Ìë” ›3cÏÓÖ³ 3!24&=çr¼` ç$†äOÝäg©¨µË[ÔK{‹Ù‰?Ìx3Ó¾ ‡ô®Ìf1t¨Î)­núÿ^†u2ºm¹-Š #¨Rxç­,n¦6bCÇZƒN¹k”e{o%ÐÑ™0ãwnÕl`œ)Í~¥Jq«IJ;3Á’䕟C˜ñ5Œ࢞ ç¸RÙC,cé^•®è£TrI‡ ÀÏW+¨ø/U bŠÊIç…]߸±4e)hK Z 6oS‹—z\†kMªØî¹‰â/üFË4°™&Q´H8ÉíëÚ»¹~ë6.!.yy¾UoxsáþŸ ³Hñ,Î ºñøüëÍx µ×+ØôV:ynx¯‚þþÐ6ÖΰÕ4øï òï5 NicCþçs‚06 ôéÆjŸÆ‚ó|9‹ÊÓ|#®=µ Ù{®Þ¶óK¸©òÕWåpà±ËqÀÈÏÚQD#ˆ¼ó¨ÚÛ–=øù~½ þµ[ZOO¡\ßx…â‹M†&žõ®UYh>|ƒ¸‚GNù÷¯Á£©Î´ì}7öXÏáÓ²?>´É¯-¯a›Lžx¤HƒüÊAi?CšõÏÙÿÄ_OÄ‹kß\Ü}Z”Û-Þ²eH^Lîòão¸Ç€£§W¡øö¤ø7ðóQûW‚>™/.°¥-¬bÓÏÙÙƒÄïÈÀÀàdõÅiü1ø‹ã_w:–¹?„´›»m&H›I½yYc–å™G–­"ä:©%T ¨ÎÕbâ­YT†°Üê•zҤܩÙ>íÅÕŒöe‰‚$RFïuÇ)Áõ;ûÕ+¯¶ÛH¡ÐS|LNàA8é’â"¼óâÇ¿ˆžšTñŸÃOÃÁfhíKëip@}ГœîÞ²6À\‡ø[ö’ð–± ßÏ«xóLŽêÚ_³]xmà{Œcn×YÜ1=00FAÉ#•P«Ë{ÃW–çl‘Éml‹ ªÉt¤(äœc±ôzàŽ½úI5v¿ÑaÓ“G·Y¡UX峄°âœƒ´ç\מü ý§üñ+Ä‘ø?][6îD&Ño®Xn'Ý…‰Jª¨c»#!A Î{6‹á‹M>Þyÿ¶®nþßd3¥¾ÄdòÑ3Ÿ—ÓÛ)Óšv’/Ør=NB×÷ڌk5äQHcT’ISr€ÝÎÜòFì`ìõä6_ÝÙkÂáíî ßk´et|€@I8À<0È.+ªÒU.Ýî5$h×xAÜ«´9`à…É@ÍÓàóß#Ô:Ú^YÍm©.bÜbÎz.¡ã¦3ÍL㪹w³ÔÍÓZ6)®­æp÷pÆfª‡R©Œ2§Ù“Ü“€jHlP/5„RƖлM4ÓíŒü§hÎI\ª8äõ=MVÕ^ê9|£k8!I,¬Ÿ¼$` `sÜ8Áö¨ÖöÓLj¼ðÖä´}àƒÊ·8zÿ³JU¥RW–¶9Ô’–†|óKè’^“o-€ÇÍÆ9Áƒ“ÉëÎ ªs3Z©•-Ñ##€2sòôÏãøÔ÷¬%ŠKpÈ„ª¹Ú¥HÉÆ3ƒŽ˜=ùÇR}_KÓ–+‹ë¬È¬†H¢^PŒ…Æ{p:ñϾ¸*øœ6*2¢œµÕ+ꓽŒ§MTƒS²]š}ã<øÞå fË„r9!³ÏN¹Ž£¾)ÿ»bÏËŸ›qVü+ ”ÚâK X[ß\µ¾ãgqnY¶žåU‰*rÆ­ÝÛ^Þ@"ûŸn²»–’ü$ä‘ÇBa_³á8ãVÑ£êù\Wšiì´Ñ¶û7W ¯Ì›zv½ß“ÿ=‘— ¥Æ£(¶·· í0p=²zqžµžöÒÛ#Fw ‘ƒ×¡Èàðp{øUÛ»­cJ¶TÒbD¹‘±-ñ;ó…²³‘Ô㩠´8i%3$yŒ¯‰Ëä积ãí^ž_<ÛR„)7BÖSµÔ»ë{Yì¬rb0?TÃÆ¤¦¹Û»UÛB½Àšî(íg¾•"Ž2#Ž0¡GNq·“îsü¨ŠÒâÒ̤SÎG—ò—qÁmà` ‘ùtšhÊઠÝñKop'9û§^ê9>½Š¿Æþó}:kFNŠg 8u2.ážç-’-íÆpO§ŸOÖ%·„\ÞË; 8.ÕN¹aŽ„î÷ž­ ÚÊœsלS•w6àÄzb¼éðž^Ôå &öi[—Ñ~¯n†ë3®ÚæÕ~f~”*‡ «lL±,['’CßùÝΡÎ9ã½=Õ”£>¼Rȸû‰úW·–`å€Àƒ““W×þÇ^¯¶ªçk\o–GQ•— ƒMf ×Q×üO¥è*ê@da•‰É3ô÷®ÙN0WlÎ1”Ý¢µ(ë -Ö±—jmÜÄ÷ääÖŲA"T…Qž§Þ¼Þëâ}šj“^j çF­¶8à~ƒ“ŽzûšäüQñ‹^ºS w/oÊI¹FeÉÀ$àÿ*òªfxj“w=Zyn&½’ÐÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ýü¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿¿â1{ÿÁ9ñþ÷ÅÁÿÊšQÿˆ?Cÿêöø¹ÿÞŠö¿ÕÜçþ}~1ÿ3ÎþÖËÿŸðä~ÚQ_‰ƒþ‘ˆþ Òãâçÿz)ÿñLÿôަÿùÿÞšêîrÿå×ãóíl¿ùÿþGí…ø£ü #õÿ‚vãþêÏÿziÉÿÏ!?ø'p>§þÏOü¤Ð¸s:òëñù’óŒ¹}¿Áÿ‘ûYE~/EÿwË7 ÿö$öÿ‹­ÿÞªµü·w${ÏüãiÇCñ[ÿ½Uk†3×µÆ?æCÏ2µ½OÁÿ‘û/E~5ÉÿjÞD»Ÿþ ö9ø­ŸýÅTñåà›þ ðÿkâÀûЧþ«çßóçñù‰g¹S_Äüù³WãüEÏ)Îßø'â¶;¯Å€÷R/ü½{"îOø'“‘ëÿ Wý5RÿUóßùóøÇüÇý¹•ÿÏÏÁÿ‘û3E~1ÜÁÜoisÿþTŒŸ‹#ÿ•uMàï{©Žëoø'‚2gżî&“á¬ñ;:?ŒÌk:Ë$´©ø?ò?j(¯ÅÑÿxMÑ¿àžê¡ø±ÿÞªšø;–âBÁ>Bç¹ø¯ÿÞª ç¯j?ŒÌw–-ê~üÙÊ+ñÆ?ø;2âaòÁ?¾Ÿ ÿÜ]6_ø;=àÿYûö?ÿû×Wþªçÿóçÿ&ù‘ý½•^ÞÓðä~ÈQ_Œw?ðw;[¸Ž?ø'ËÊO÷>*ŒÏK¬oþ :-‹ÞÉÿö¶Â ²KñŒ)÷Î’ÕNÎi&çJÉyÇüÍaœeÕQžþOüÛ*+ð^/ø=¿í3²XÁ4¡™PãzühaŸÀè•n?ø=^I0áÚJý–SÿÊjá†_©ðÃñG\±T!ñ3÷vŠü%oø=Sø&ÏþfOþóÒÇÿ¨ù‡þ ® z·Æ\îµþÉÌ?“ñ_æO×pýÿ~ìÑ_„ëÿ«3’þ ©»vübÏþáéü¦:'üMÙ½ÆþóÑý“˜'â¿Ì_]Ã7æ~ìÑ_„“Á걿àšÇ~9Œ|dÉùG¦ÄkdÁ2ˆçøþ3cÿpô¿²±÷ø?þcXÌ;_û½E~¯ü®äá¿àš@g¿ü.CÿÊz–?ø=:7<ÿÁ7öX¿ûÏMe9ƒûŠÿ0xÜ2ûGî½ødŸðz R.äÿ‚oäã€>.±þZ5R›þMÔ — ÿÉELã{üh+ú‰e”w§ø¯óÇa_ÚüÏË)| g*ág?»P7ûv|¥Òàv9¯±¾Á noÚÞþçáçÃ;6[+ëhmî.õët´Õ-ä}}ev¬Ö×vП¾ñJÌqûµàZïþ uÿ2ðoìñgTð‰íí®n|Kaár+”b-]ßd•l%Ô­',c Cϸ~*êª&Rʳ¶íÉù™á1xGV¤lú(Æ=ªÔС91HøþùàWÖ?ÿàœŸÿjŸrú­®¦ý“L„¨k{Ë[íVÖhï`I…䌎Òr¿oë¿ðDø'›x!ì>'|DñïÀí~$‚ê;ÿˆþ-ðà[ûtp×2Cm ÜåcÚ¬™–@c.ó0sÇS‹ò¶¯ÑÁ7g5R»Võÿ‡?ãÒ´è Û"ƒÐ•£ì a¢íòóÒ¿bïÿà”?ðAë¿Yê¶?·‹[Bud•|-iñWE¸R”ùv°…®]Y¶±Ì­ ‚A®¢Ûþ ƒÿ#ñ¢xƒAÓô?ˆºØ,¥:†«ª7ŠtØ-U¢ßçÃs Àû7y™Bè§!ƨÇýyʺSŸÜ¿ÌÓýTÌ^®qûßù‰gnXì„^j9lÆQ#†kõ÷Hÿ‚ ÿÁ.o­.5ë½cö®K[ö‹HÕ´û‘­ÁªÆ’lûD+¥XݺFX–á"p%æ±|QÿFý‹<y¨ê:UŸíUâM?T1G iz€/ì£D2O5ýšÃ"7±ÊÛ˜Ô (ãt”G²ÙoJ‡ùð¾5mV?ù’³h÷’ žtiŽéÏæsPKá¹ÈÁÔ$`>ꃴg×#šûŸÅ¿ðDý3Køãi xkÆŸ¶‡áˆo ¶ÖÓUý˜a×Þ<0IäMFÖ÷ÊhøfW‚Ú`pOâø%¿À'Òoôü'ý¸-µaK cXýž­îí7ã{xå·yáCÄyŽ•TøË%œ¹\dŸ¢ý¥Ãy”Uã(¿¿üÎèü!דçþZ6ì})óXøIB%uO÷AW±üAÿ‚oÿÁBo¼w/…¿f/†/ñÕ­¶¢4ýFMáöwatÉ¢ˆ~Ñq b‘$ù¦ÀS¸¸c⟴Ηñ›ö"ø½7ÀoÚ÷Áz>“â‹Khæ¿ÓôMb ãlC˜%‘•çae`ÈÁî¡ÄY5ghNÞ¶ÿ3–¦KšÓÞ7ôÿ†2µhú\rJ‘HåFPCfîYG~¹ ¯‹¾9ÕnL>ðå²€sq¨E°L(lã½wºOŽ< ®é6z«ÜÅiöõÒÿ.)¤MÅC';I¾*ö¡á”¸-šñÆáþtÚ3øã¥vÔLRN•m?»kþ71§:Xwj´µó½Ž@×|s{>)Ô\¼%¯È¿®McxÏJÕn­âS®êÆg$”[¶ žÃåíÞ»[¯‡ž/¾•̤pÆ_劔øÎÔ~ ø¶ñ!â[MÃ#n`G9ì3XÕÃV•.EKÎæôñ8xUææKÊÇýƒ_µ½k}~æöíËà‰î¶u,qVhÌw[ÀØR¸0®Ꮅéû=kòJeoDp¡| Ì±‘Ó¦>j{O€×¶|¼öÌ3ÊÄ1ýxôòlRvpÓÍÝž”³\3³S×ËCÊí´k{A˜!U'«(?•9­ˆ9ÇàkÐ|MðÛV±¶?ÙÚ<ÈêK3,^``:޹k½$hí,î –b ˜Ox" ƒŒl+’zôâ±­ƒ–ÝjÆôqQ®®ÌO$7&qè3Q̱Ñ$Óp­¢—‹núl®R7á„v‘±Çû%“#ó³Ï„6»K-IJ~é§ÁqÇ‘œqÐÂtg§"¹¼jÁüNÅ8ÄDm‚{:ZÜ8¬ƒž™ÅX‡Ã·Šá]ûí\çNz…«d[,€ìDiN+T¤[²c Óæ™È®ö?y€Å_ƒÁÚ›Gö«§·‹Ç¿òÆsRXø®ÏN öÍD p^0ó’øçQ׿xt­r+tQÄqÿ¬üÈÁü…o„ŠÕÝö1o'¢²îÈ®|3bÎÜÞÜ]2Íb ¹p?*Ñ·ð_‡LbGÕ­lÔ®ïÐÖeÀñ:·3\I)uÊ—¸|©õ éêk2{ëË!WG†àçŸ1w†üXqøb‰N…7w½ñòÕš·?Ýc©ÕWÚ Ž û=E›ï+ÂÛ}°ˆþÝHª×QÆÎ—“éjC#I•‰ܲü¿ˆeã8-£H#°x,amãÁéê_úf®ÛøòúT_'G&EÈ¿túç'ቡ6ùšù"eF¬Ri|îKÿ±ÿƒŸ´­þ…s¡MðFßO‚Þñ/ÃoþΖSx’xÞ‹êǦˆ!+"¢ÌtÅ @SºCŠé_þ7û|EµñOÂ__±Ç‚lü5¬k7º‡‡|Gáÿˆ×c[ÒÄ™Xm­’2Ì[ÛFä·iî#Vá„ÀWÞøiàêZ¾³áo ZXÞk÷±ÝëW6ðí{ÙÒíÒIOWe†£ôXÔt¶·)QÐWåî¤ÛÑŸ[µ>ý’?àŒ^ ýо,jžø9âk½Oà׊*ë·¾Õ4í¤ð?ŠõÛýY ¿„Ÿ.æFöæi F–XŠH]ßyo”%{ rOÝ•5B©,-ÔÖ¥Îr݇¸º–ž ð…ŸŠo+»Ó4ˆm†¯}eqm}g«d’¬7qœÅpŠw$r†«/̧¡é^ñËöÄý‚gëÿþÑÿµ'ÃÿÜÉy÷ú'Œ|mne†FXH¶¸”´+ò+®ÕUÈ =kеï?üSâtñ·‰~x[PÖ¢¸Šâ=^÷ÃöÒÝ$±íòäº »k‘´cËüeý‰?dïÚ#Åö?¾8~ÏÞñF»¦Av³«èñËukrQ#”èBX`ŒHÆM&Ú7ÑSãßø+Ïì‹á¯ß|að/ÄÏ x³Áz|dÝøŸCñžàd‹ r4²zF€±ì y—ÃOø8àGÅý~má?ìyûBøÆÕ¯~ͦkÞøc5ÆŸ¨°MÒyr\<…H…dD;¢nÜ×Óš—ì=û+ëÂÖ/|Ñu”´‚(c\·7ˆR"Ŭ¥•±¼ç îÂîÎÑŽ‹Á¿³Áo‡×gQðG€¬t›†weŸO ¢»hÕ”‚±–%¼±„ÜKmÏ5­7ECß‹oÉéù\ÛåÑ/›¡óŠ?à§šÍÜzg‚|YÿÍøï­ÜêR‰à²Ô|ij·[¸ŸÌŽÞkÉw™bpU˜«pW«ø‹þ 1âo <±k¿ðLÚ: !P΃Àá†Ï ®Wõìkêù>=¾± î‹ã}NÂÑ|·º²H ®äN¼÷É6J|„‡ €e9&œ¿'°‚îÓÃ>&kî.VhWÉ’O/œÈ¤ù ¶î#i\w$“²¯†Q·²O͹~ŽÀãUËZä—ù3àÿ‹_ð\o†>2ðÀðgÆ/ø$?ÇÝ@ÕŒlº~¿ðîÂîÊùAWŽO*iʺýÇ FCzæü9ÿ{ý‹ôßø“ᯇàŒŸm<&÷ sâýÓàuºé“K,†[˜£ŒÅ)ˆá˜7¤}¡ñ[À.ø_k?‹<+ðí¼x5+T³Ôìe’ÂÞkØÍn‚ȉ7oY%#îà WÇ>?ñÇÆÝ&î÷Eÿ†$Õ—E¹»šþ}KQÔu;›@ÒÊZåŠá’Šêr¦dŒG3%Ôm­©Ë '¬?þeJßÃ?Ëü™çÿà¨?ðM†ѼMüSG‹Qñ-‰»ðŽ›âÿèZB_Ú%¼ò|‰§†IÕ£ÀVBX);\¯ÃŸ·oí×ðÓã=¤Zï¯ø%WÁ xCì£êP?ÃÙµ-I®žI j{ØIlJ…Àz•'~Ëô&¡ª|;ðf™âŸ„Ú—þ?‹^éîo´ F‚êáM²ÇäIig£Ä³Z0ò$i!›j3ÒD„F¾|Ð>3øÏÄ××v?²ô-RÅ®.íüN<*²iorìbû.¡ÝœwÙ¢óDðö“‘*;vÃ2Éé%Jy§½ùåoºú|ÙçT¥‰[γåþU¿Æß¡ø[ð«Ãÿ|Uã­rË^øž~M§éWz½¾•â½^úÊÆU‹çžašF‘†V$–\¾ÜyŒÝ{‡tJk«–áR"ÑÅy08±É?SŸ­~ÜüGýˆ5oÚöiµ?Û#ö‹ø)e¥ÇÈmáç…tñ5¶œv«Í%ýÜr´Q Û|©“œKú´Ãý¼ÿ_ðOÄáoÙ‹O½ñ¯Œì÷^Oâk\½€XÛBÉ#K¼ah£eL€€¹%]‚°¯£ÀqvBP©g'ð¨tõrý<<~O^ÜY3·n ÅqFc—»‚æ]4oïvÊpØfÿÚ-éeúŸ„þ/ý›¦ð°éþ.ð­áû‹‹ušÚJÂKfxÉ`VD”•`}§Ò¹-OàÉÙþ‹¬ÌøŒcô¯ÔÛ?þ Ãñ+âçŒ_‚>ðíÖu ^éÓ§Ä/‡¶’jzwÚ6+%½Ì7N¯ ˆ‘€06㯉ÿ´©ñ_M—J×¾x6ÂHÖÜh: X4>éO³” ÈÉP66H*A"¾—õ¼d?Ú0ÊŸý½ú$yuêÃ?ÝÖrù&øÁ¾&Ò.×J“Dž{v ‰í-QÁfbsŒöªÝZ41ySFж3‰T~|ŒW¾‡]à n{ãCYð¾…«çíÚu¹”|æ‰K‚=ÈÏù5Ñ<¥)7 nT3fÒŒãóGϧ‹»c!i%L`ØÏãšÆ¸ð’_Mçé÷ª%2”c“ìkÙüKð„jÒ“¨­ |­FªúœzŸzÆ×>IkjÍ é÷*ñÆ6Ï!M’c>„dñè+ʯ”ÎNòŽ‹ïù Ε¥¹äöí¬iWÒCsq“›YY› þ}+¡ÑüIlÓ,¶› ¨ùd@3ïëúÒ]ø_V†åáÔ4–‹“æ s´œ~uGY[{w_1dr­»í36Àƒ^la[¯}sÐr§[üÑÑÉá&ü Â]Ž|¦Çóô¨£ðVµ²KbØB&ãøb²ôÏ´sDlþBÖ™_tèþu½e6¥tfšy$–#—ÃŽ;*‚súW}?«UWQ9'íàìÙý·±+ÜÐAã?)ôü¨$Žƒ5ù ¬}QMÆïã—ç>ƒõ  úÑH¼R;Æ(ÝþßéKÂŒMVÛÚ•ˆnúR¸ç½4“œëïH®E?*½A®I „ƒwFGóßç5!¨ µ†Þ19 ¿t¥òQ.>ÐMÅpAíü³øQ¨hNG9¨æµ†tÙ!ý§|#âŸj^øûvücð’Zé[5=/Æwzv½(µ¶ŽF‚[!k‰n^fI$3¼ˆŒ’ †L|éâoÚàŸÀß ^xköGøÕâ¯k v°jPG©MáÍ2=1íåÍ"½àžæ`êÅe‡ ª©R=“}}ÿ)ðÇ_Ú XÕ~xkX¾Ð,õ+˜o¿á!¼ÔÙîÚ ‘q[Z›be°4Hcš?;¼Ž#BGÃÿ?àš7ÿ–Ïâ?Ãωî±[ꉻT›C½Ž6–'V‹ÛÏ1 Ì’ìKrî¿g“;2}|§ •J²ž!¸µ·[ýÚ¥÷ž>.½ZzÒ7áØàügÿý¨ôí+ÂÞñ¯†àÓí¼=a³Ã¶ÚF½­Ù¬K0Ä%µÔ@•|¸Âf Å_Îø³ÿøÁâïÜx3AÐ,|#§k7Ï4zŒµ·¸¸™åˆÉ=Ç™¨?! tèÉ"³áN ïÅ¿Ùsâ÷‡¼#§KðwáGˆuß-Ü×^.ñ‡¼+©‘ј%Ì“_Åö>G*äÆËcM‘#îy>Xø³£hZ7ؼIªüZ‹Zñ°¦ëÄö—–Wq]éW¬{ Ô·H¢iÃî ci‘Æ¿MÊðùmj4íMi}ïV“²^»ö>[ŠÅ©ËÞzú/ø/å÷’xóâÿÅŸ‹}£âÅ?øuírâñU½BÊìÿª¹Ù$‰’ÕI¯ÉÔþJH#K)FëûØ×plŒà{cùŠ©}â‰`R"´bår€mlq¸ã½}Jž?uYy+…j“»Õ•ou¿ileºÓ‡”’çt…ܘõ;€õÁúpMoøX:„Hñi« 6Ë-Ì|zdzvëéÜÔ®x²ë1AdäOpªž˜8r<óùÇ·ðåƒ_ùºª;È›¤–ÞpÈç9sÆõ`בˆ©Œr¾nÞjßB”(rÚ¬Uü¿«›Äúíî¨,´PM$4‘Ç •`F~ûùß©­ŸÄw¶LSTŒL²|äØr@C’?¿‰å&Ñü=ex%°†á FÑ ½_±9+ÈÁãÿ­£á»²¸MNòä¡WÄhÊ€²rrÛˆãЃÍaB®)Tq¨Û¾önËÐÒ¥*Îð²ù ªk>=Ó·A5óyh[̺µ³)ÏL²ÓÇ<œžÕJæûÅ÷±E6£¬ù1È ÃçÀŠYºp8ÏÓœûWRF£y0Öû­ýðsØqïÚ©Þé7P$×–÷qÈ2L‘D¡ÔôÎy8·ÍkW*™Î~œÎ߃"ž" ¥Ëú/ò9;½B$‰­Ä>pV*’Ü@±«q×r x±×5ÎÍck$¬^XR5l…°qÏS–?Óó­VO]È×6t¶Û7)“翺A,sžO9wœ[Ë™ãÙopÏ!ådP¿Æ9ö®iM½$¶=Q¶©’[évÑ¿›m$ç,ÛT~U$ÒÜK@Tȇ†ñTZô²yA9qã })¿Ú3WÌ|g‚JžhDß–mÝŸÛ¾X ƒšFv#î“AU)B² o'ð¯Æ®‘ö„fúÚ27OÝÓ,©eq¹0AzÒ¤€ç4À€ íOpïR’GAšBÁzÒ‘žôÀB3ßô¦”ÇCùšs £;ŽpqK™'`$ÆÜQçá1øÒ*ÌÅEäd ôüiÑ)mÞd[pxç9¥Í¨ ’ÛLLAèEK‡‡çP]ÝX÷ÇjòʤrpHþ_p<ý¡ôÿ‡Œòø‡Âº‚ÛZ:Åä(¯œ¬›Ä’*­]¥ÝXù{Ô°%jìvg££Wâ¯|@ñ5¶±a?ã†ÎòÊHtØtÛI-&¶b¤+µÂÊÎ['ï(Q€0¹äü»¬ÁZ½â«=/áïÁï.{§5Í—ˆæðØÔìo•Á£žÂñ”|’„ÛÉC1EÚ$ä|Cÿøo¬hoŠ´O^ÒÖï]òÃÆÒö]V vy`D{4´ži.4$[ayX Äܲ÷º&L¥­Yê¿àžž=ñ¶‘©èñÓÄa®Áwo¨Ú¶ºñ£™.wó¡º/½®]• l¥ÖV†0<êÇþ û6~Ⱥv»ñKÁ°x›Ä_§ðµã[YÂxlä’Þ2Èmâ±K$bò,[™¢Â4ØA!¾Uý£¿à¿´þªC¡ü†ëMÖôÉŠk:?‹¾Ë»üÌ®ZCx³Ã‚¨ò¾Mä>ò`hßð\Šõ˯ü}ñŽƒk¢EwkeâO _é–:fªiò"¤Á^Y%½7“ ÜÂ7*å ~kôCˆ²©Ýyjÿಭ…iÂRûÿàž'û@|/µø©ñÂ[ÿÂÏÓ4Í2õluß³ÙêÚÝÆtfMg%ÕøUSíL†WqÝÌ ®Í%øeñ/Ã^=»ÿ†wÕ¼MoâÍ.â7O†×ÅvÒÝÜ»™•-‰&6UWò·Q‘ºE ûHþÒ¾%ø‘«Üx#]Õüú[¬=Îá¨uøâŠIHƒíºƒÏunÎÃ&á–5…D*ˆXIázþ©á›-FmSA¿†ñ¯!‘KjßÊÖ{ŒyRÓì'ÊÄ2ï623ŠúLŸšb+'5~¼º?ü Yž>2¶7yíÒúþ ÷(ÿiÏÛ—áºx›à±øãë‹»Gu˜­ooî$ "€ÑKI¶%V]û¶GrùÛÇ>ñ凈®áøõû‘$ñÞ[–˜Hãx.YòÌs’Ï·=·ÅÏiú]®—ál4hí¤Ë.•l[¹<Ò9inTݱ %B“Y:÷|Yâ]7ûÄ^2ÕolÖïíbÖçU–DÛ¿ ÄnÛ…Ý×f¿IÂ`%E¹¨F7µí£oå·¢>J¶&3²rnÛ=ÔËi©¬Í}%Ìqr˜ÂžAã¿×ùóVô}A.ãhÖöÆ&FÄ{XgØœO=Çz§â?h åÛÝÍ+«lt¶<bXÛøk|CÕ¬£1i–6‘œœÈc$·óɪç®ì¯e:°VGSý3¹ß¥Z&àqæ …õgRÔÃ4O£©AnÈÛ#|Œ@2Ùü;× y®ßÍö‹½jåÛåAì`øU‹Fœ–•‹bI'IÿÖ2ÄEm¾ß¡Õ $šÖ_qÙ\xçÃP1òoM˜PVØgu\ôûsšK¿‰þ†‹L‚M­‚Í'Ž=á›O%:dã5 õªÛIjÍ;ºåÚ(Ûl^ň>Ã>ø®wŒ­²GDpTÖìì.þ6^“"Ae ÆÈUAL0ÿk$œý0+çâ¯r'’ãP‘ÚpRO-BƒFW q‘‘ƒÉæ²þÅ96„Žr1“šcé“»ýå*GÊS½sÔÄbª|Lè§C Mh‰®|W{æ“m)ùÞf;†ztâ¨ÝëZê"Ý\;Ýš1Æ#ÐñéS¾…t ‰A›9?áDšñ`Ï<+ž®ây€u®y}bo[›ÅQŽÈ¬º¥Ø‹çŽ6=KmÆxÇnà*ÊêZl’xšTe³&çsýÐãëÎ984‘é¶àóY°>]ѪGPOü)dÒl]<´¸ù‰¸…Œü˜í»~DÔÅUŠtÛ?¸màô£ws@$}ãK_”ØúÁû¼P[¡Í-E°\½Å•ºÒQH´ÖF,sJ#ÇVÏáABÜ“ƒíN¨q»¸ä³ifîE]¥J(Æ}óÔ¡©#€Æ»|Ön:·Z{?tKßð£—]ÀkÔ°g95å^#ÑÿgüH¸ð-׋´é©ˆŒq”eºìíÑÚÍ?—ÞyÔ}•x¿«ÔM>~§–~Ðú÷‡o|]o£ø?IÐ쿲íÒú}Y ]:Lá^@ÎÈͰ(ÊaX`ã<ž ²âR íÉÁï^ãûU~Ë7ÀÏ…ÿ ”€3Œ±#èht-üDP&þ6ãñ§‘ŒþTͬ81ëPßj gNÀ|ƒ-–(îO ¤µÆÏF4¾Ÿ|µûaþÞ>%øBð‡Áê/‘$¾!Ñü-õ”X”´Öå‰P’4(vLÊÐî•>b”g†ਟ²gÄÏ ¶¥cñ^ÛIGóãŒê×ÐÛL.!‰%xdO3u»1>Y•2#|)Qš§ Zöã}Ï ¾#hÿŠü3q¢è>!:eÄñ2Ãr©öÆ1*:u?Ĭ8èzWçŸÆïðVÏ|i½øE}âmWÅ üG¦\Ú^øËCm#G¿Ò#6òÆ‘Aòþý’gFYöÀdL©XäO[Ô?à£ßnôm2 ßE^ø¦;O5¤V¯£ÞBG› €(DˆÃ ’æi\,È„65<¯Œÿà±?²ŸƒçÅ¿ø8ëá‡ì¬›á´Ú†­u:¢Ç ¯›sÞ¯å?›‰•Ô²’Êà…C÷~iý®¿à¾ºÿƽ[…Ÿl´©ä¹ˆÍw¯ªðÃ7œŒÂÙÖF}ûp¦]«åŽ&½Ü&MœÔª¥ 6}Ú_}åùž>'”Fœïn‰ÿ‘¡ñþ•û2øAŠÁAlcÖlÎ×WÓu-+í1-íÂ7“ž6ÈVx݃•3GcáS `§åP¹bÇ +‚“_Ô¥œ.b¶öÈ6¨‘@cÏ<F:w¯´ÃäØÚü¯0©–Ùr&×ÎÇÎUÅá"ÛÂÒqóæi}Ç«xËöŠø‰ñážðŸÄ°é7V £û"üé Ý´AU<"71ðrw;œäW ÞvðÛN0¬eÔ|@Ñy!^?Ž3Ͼ3U¯N­¨>ÛYÔùcÚ¿â_M†£CKÙÑ—ÉUiUÄOš¤¿R¿Šeµ7¨a‘O—G%pxééŸÖ›knÓ·™3dÔ çè©!Ñlâ¶A’BàP±€|S‰¼ŠålŒð¡ †P°± þÉ9ý0(Iós3DãËʺ$_³[nkBë“å¡^²IôîjƒˆeŽY§Œ3cì=<û»ƒÆ[ú㣊áÝKO ›ŽK}=«Ìu½ãÐTÒFÄ—6¾Y†)Dl3ç'·ÌoNœÕv"åAP[å$uõè}ÿZ¡§ß;¬‘PàªI8ëÈÇÚ۲ºÑõ(%i#h$àF®Hm¸ã’9{…U9F¦ïRg}ÏíÛù+Ó¥0¯aøR¹lö­,“4«eJ_s8§™à ìê/¼þ–¬¼iá^ [I×í.í.4V“ "Á¹SøòÏÚ#öŒý¾|6—â·ÅoˆZF“£Aj ê—s„o&WC(#v ¼E@s2®2Ã??à«¿üN4+¯‚o‡Zž•dmõK]¼š+¤âˆ%³8·‰E¹Tù£y€É"×…|køÿñ·ö˜ñ"ø³ã—Ä-GÄš‚ÃåEu¨ùa–=ÈÅU ÷£‰#%—qËÇÞÁp^c^JUš‚ü~ïø'—‰âL $ù“ü¸¿m¿ø.¿ÄkŸ‰ÚŸƒbOÞ ®žmÅž$Ò]JYÎçµ’f>\L¨˜ 1<°%U«à|TñçŠ7ñÄ5øûÆ:¶¸Lép#Õõ.BÊ©å«1̰tVaTEòÌJÐ/ZÍ]oG¶„´ºŠ6B©äãØu¨í¼Hš‚âÞ'PHûõêFT£¤lŽ' ²ÕܾÓ[Ä (]Ê:Ç•¬Ë©\ÄÑ[Ja±‡æ}1Ï>¼Z–ö’]·›8 §·­\†ÎÚ‘³g ÈsЧ TZ½ª*ró0´Ÿ »F­qÕ'#'íïZ‘è"aTðz…ö«s\Fª­p“prTrzóœW§ü)_‚¾ðèñ7üY>#KøÀе .§§ßX¼q\m lò42îAHÅIFÕ‘p|ün? –¤œ\Ÿd›ü‘ÓB…|[mI%æÒ<–M)€ÍŽp)¢ÂÈ¿—a±Ôg?¥}eûG|ýœ~/þÏÚ7í!ûx+ÄZv¯$³\øãCž(ãÑ­e6-;G8¶ŠH§ Ê—!™LNÑ¥þ]´²¸¼ ¨uUå‹[°ÞsÑzqŒœŽ˜Áäâ¸iq6OS ëN|¶v³Þþ~EÔ˱”ª(-o³[±YıÉ6¡\¡®ü03Um4 $´ˆY¹f å‰ë_I|?ý<⿆xºOŠÖëâi­¤‡û„vÆÊ阘n‹Èn,‚l’IcMß8E]ÛÚ.âçÃxKP‡Zð÷†u‹}6þÁ]m®5Ûk‰!œÁÿ=¢ˆŒK¸¯ÈãQ¬ÄŽiqv@¤Ó›Ó´^¾†Ñʳ[¨ïæytz ’KmSÜ‘U®¼9;£§UÜãèk®¶ðe­èy/..mä–Q5œæW(T¹Îh˜ŽHLu>Õ ðn£&ˆ5Û]FÞIÚò;8ôe®gr0Ò&ÑÊne>Ü“…,r(qnOˆ«ìçxk£{[¿‘u2œÂ”9ÕŸ—SËîôFÑ„W6¬€<Ìp}³ùT&Á3$ö®å;…–Þ4WÚÛ'ƒ‘Àã`ŒÕ•¨hÐÚéåí %‘‡Ë×+Ó9¯ :u)©Ów‹Õ3‰b$¥Ë5fsCO/ƒÇ=Èþ^½¿Æ–èJd%¥+”bŒ/»z“ù qZÑiM"‡~öɧÞéÖIn~@¼u“¥/d­sUSS•Õ%b̰Ìíòòìs“ëžþ¹®+[VóX3“é]æ¯n_rI8 Žsù*âõ-6W¸u¶˜¶ ÞIä~Ló^V2-èOÖæ Ñã·$«ž§Ò›åi ÇËðc Êž~_~Ÿç½«©¬£”EiNéó]y#êÀœÃ4‘Ú]¬ÂâiD¤0brªrcÎ}{×ÉwhêzwvÔ‰’Ýmå%T0uLòOf#8ñëI´Ñ6Öã †"ž¯çþ«ÆÍæ}ÒOqžÐTñY4ƒ˜Ð‘дyÅ\hÉîK¨‘ý¿*œd¿Ö‰æ†Ú&–y4E,î퀠I'¥Ü «ú×ÉðRgý¸¬þ øÄÿ³Žµ¢Kic§]É¥Ý\‹yMŠÛîw…×.×[ƒ*ˆV*ì Ë)ÚJ)ŸTÝ¢ßDzÏÆož´³×<4×:mòØXy“%åõÅ”q\(2âk•·–8ãË Ì ±óÇógûmüVÕ~'þÐ(Óô¯ë- i¾$ÔaÒô9üE=槃1FJñÄ#‰Â+CIÀŽ0×9ñkö•ø‡ñVúMSÅcL°žÞæK‹½KH¶És3&Æ’YÏÍ0 …VbJª€ÕµÍWP¿žõµ9 VK(¯¸Ìsžzšý;‡ò å“öø[Z.ÞløüÓ4Ž:.• Ýþ‡Vº{Æø’EÈê®r·4ÛÛý.ÈÅkªj‘Dd$fm¤ýp2j×öÿ+_Êñ2“ÇÔÕ+‹Ø_滉ÉÀÆIõõ¯¬–-F:#ÂŽ ·y==ÆOˆzZµÅ­¤ cavuTúç¨yïÆ¹ó⻿²ùw^qtÃ÷SŸ©ÍaOxÒ¨ãÞ«½É å²k’xª’êvÃô5nõÕtÆ¡@ãõÔnÆÙ~µB òIò®O 8ÏéV´ÈüÓòí!±´–þ¿O®kRs–æÎœ!ØÕÓ·³ eÉÜz×Ee¨F0Êô8W?l„&e 8ù¹­+h剨ÇÊ¿Äßõ®Ê-ÇcŠªRgO§klòË’3€O8'ñ­eº‰ò>†¹8–YYm¡\í_•t§üjôrŦ¨}Bí·8Š6ÇN¹=ùôô®õRVÔà}IóÕ$ŒŒ¸Àúâ«ËkrÓßKg,ÛÚ {p`}ÕQÆ8û½¡À®n_ÞÉ ”O-dû†FÉöè{õÆsüª¹×æY|ǽwp~éc튊¿W­Y¤ýuB…±z;µðëâ÷<#§Ï£øvkM> –ëqoaµÌðΫ¶í8O9áe û¸bkÕ>ø×M»ƒ[‹Â߳߃¼C¬>™,1iîo ÊÉ"Ä|‹uB²;”€².F2ÉãÄj¦v»pIÈýáÀNŸ¥C¨x—R¼·6kví¸Œ²9#î+áñ¼‚­'RWÞÖM[²WÓï=¼6g‰¤Òi4¾ÿÇü¼þxSö¨øû2ê7ÿ?eßZh¾?Ôo¬b×¾#éÑC¬CsA!,Ûã‘sÜÒg°Àw^økû|>ømà;ÿÛ_á7ÄkøŸÃŸiÔoäñ¶Ÿ¦Bé%Ä¡náµ{©§2íX‘^D† 3mF;«ó%5vY–Ýõ+• ÃÍv™ŽîÜÜ“Œdôúâ«Ýk†¤û#4q<ŒÂ(ä#$õ'¿ùÅsQáûÚºy-w¼âfž¾gè§Ç-Wþ»ðãÂòèŸ|3ñoÆÏ,rZµ×Š,¬­­ƒ*ù…-ä(X •v‰ˆp¬²?Ê~<ø“á~뺎› Þ™í¯/vArTƒå®Àò.ä'‰dà$:ÝÖWuìíµ6¨iÛôÆqØ{ÔúkDp‡åz¢ž§“ÉëÍzÔ8o(ƒ4\Úþg§ÜŽ:ù†6ªwj+É~º••å…¸zu³º‡%™@ Xã,sŒ“êþ•aÑîóHUzX[ú¹,—Œãi?­A-Ó ÀíUå¹ wƈä‰Ó)Ëg¡#Šã”Û;IW ŸaHeÏ£‘V8÷—ç  =qúT¶Ð€\Üóÿ«Œ“ïßµ· Þ…«%8Éãï äã·§^½«FÚ˜I²yŒ¡B¨8>_ñïß°¨l"WŠ&Úc8Ë&z6:Ùç§5³§iª›"‡sœwǰúW]*wHä«Q"K 9‡tß!<(9ÛžƒÏZ¿klfg»"%ÃLê¼0Çž½9À㤂ޣó/ «¹—nK{cµA¨ê¡â1°D‰IÙDŒÜöõ<þC­v¥GS†R”ö-]j±A Ûé Pd•ÐåºòF8óÓéYw—p¤«äÄZ@¤Ûæ+Ï|ô§áùÖ›PIâÞÊ©ŽÀ`“ÏÊ?ÏåTšñUwÃ',Obzëþ}k)Öm›S¤‘ª·’óZ]ÏŽ< ¨åïcÛšÎ7ð«ñ–Éàž”—Wtc÷€m=«7V64önå»R'S0Ýj±»”¨)(_LrOçY²\ÙÝߌRG)$ÖÛ[FŠHº×R‚Q¥È¿ýT†a'oÇqéPî28P7ÐZ~Õ/_b[·\` ¥Ï7îê Æ;èGp¡{ñŠÒ³ŠeA‚­>/ ßÙ6×¶b@ô­;]ùIuj껀ù‡_ƺaNwÕµjÁ« gm}r6[ÄÏžÀqW›M¹²1‹Ð"p¹è*Hµ™4è„6«1¼ÿ:£{~Óη³dǪœ¯5Ôù"·ÔäNn]‘©'‡îáŒL$YòJšÒµÓ­"°Yç”)eÕñŠÀ†òêñ Å5æ2þY8 øT_êR ²jlÑ(ÂBá6ŒtÛ»­jªF/Dg(NkVoYk.ºƒXÇ01+ãÌd<çÜõ<}*Ü e¤Ûˆ¢Ï—¹Š‚Ç9$±äç'$ó×ëYOi2*•?/Ëü…^þÁ»š4u½•RHŽå’líö)Æó•ívŒä’ÓdQÕu›éÞÞbˆ–1“ÀÎ?ÏsLµðÜ×nhJîÆYÉÍnØhÖVë‹yP>cüêÒîbFŽ~èÅZ£wyër«DÎÓI玺ú{úéYÁ¦iryw:¹ŒbØ¿SÕH9$¶ýFa¼amÌ\ú-{­¬ô»4I®‰2)=$qž9Ç©?0ã «\ªI'‘"D¼šdã¶qœ p@±ÏP+*_²Fúª"‰•Ȇ×ì¹8m¼ž2 ¨Éç$óV+»ë‹e‹sˆ‚Œ‚pŽpN·^+¥U²²0t®îÍ+ϼ…­í[pßÃnä|ÌY‰à0àä`UF,\]¿9'œqÿêúwª·©X¶Þz+ üJ¬Úª¸31ÊÉ>øôúÔJ¢OVTiÛdi]Mª§Ì)ÈÝëTeºÛÔ†ù‹`/CÏ8ÿ?ã³É*…SŒ *!$vèA9>¹¬¥RìÖ4íê?Ï.¨OZ…î¤c…lb™%ÚŒC’éü«xËätŒ¤ÛÐÕE$L.ô­hé-æ¡2£ãq'©¿ÒŸ£è$§*K)Bœ¯ãÿÖ®Ã@°µ‚-÷¨å»Ðs]T0îrNG5|B¦½ÝÉ<9á½.Ö?:â ¿ ¼Æ®ÜJЃªˆ—»c“øÔ }4ŒéíUl—­,V×7®Y >,O½HòÅrÅS¼Ÿ4Ǥ×Aÿãê@s€D‡üjìeð—í*±K#/ +’EV´²¦ØŒt8®‚ݼ`67mçšÚOS*µ9tG­ÛßÚß½åòóÕD(Á==O5›r#r‰'¨­¿ˆ>-Ó#·:=“$×nAB>ìx<“ïŒ×/&­mò‰wí 7¨` Lö®Μfâ™ÛF3”h³ÅЭío¦‰\aÖ9ð9—¯9®›Dð<ËIy}·z†pÍ’^ß•r0^ùš£Oab!‰\•ß~~¼ËŸ­z.…¨SNI&¶(Ê 8è öÅi…P¨ÝÖ¦X§RŒUºîO§évZ\Löг9\ íœý=ÿÃÞ£¶×-o¯¾Ál$”,[ÞtO‘y.}zûq×µ[i6mb ʰګó‚¶ÒCwÈ\cž#ÔdŠÐÿhÛÛ9¹’}××È1) Çqlgvâ3ÙÉä`†Ë«‚’’îãñi«ô×§_–†z0¬š›÷žÚÿÀ,±=ŸS2ˆæ˜¸ ¬F@$ž¹ÀÇ\œj8µ{¨7ÁdŒ¯ òä+¾ÕaÉê@8óלcWÅpé—b%ðlQZIk§ª]Ü_ ZyÐ+›V=£aÈB79gr¤P¸¼GÒcÕí½×Ú.`E]þÐQÎÒv»°FÈo™IPgÏ#ÆUñ©,Lš¢Ýí«Úú+¶v®SN…8º1¼û·§ÜGoo ¬b8Ëc@çù#ŸN+sRÖ¼-Õž‹à¶ýÿ—%½åÍÅÀ¸³À;¢_Þì‘I –’6”a”oß‹*áqžµúVW˜RÌðqÄRƒŒ^ÜÊÍ®û³æñåJ¯,ÙólG7Ê0éÅ:(YAT•Ç®Zª—­»åOΦ[¸ð Îzu¯”RNZŸfá5±æº"â–†mX’"V@Èã0<ÿ…jÚ30C>yêÈáÔþU’ <ƒéW#½¸|2ì<’ò8ý•ÑN]Îz‘lÚ±$’\%ÒFÑ`3['¾àŸA^{TšŽ§y…·G)$‘‡‘T81‚A*8ÈàçælÓ´èg²Ü‰¼Ìlgò£(¤ü¤¨úäõàŠ§¯4p&Ïi>ûÍ1˲¼ßåíÓ+¯šJ6G7/3íòƸl*B„É;G¹'ëÓõª7ò½ÖU›¦@÷?äSDªÁ€mœýÕ;â{ÕK™$°$úVšjÆÐ† è¨[pSƒóšX'¶|„A=yëU'¸ÞÅ^^ù¹¥Kˆ¢BÁOá\êw6³e›«èâ_-q‘éYÒÝK$¢8\àžE2îöØËʰb3Ïzn—yeæêìñ‚c3™öÏ^õŒª)J×5Œ9UÚ54­2 ß̺“‘ÉRàÇ5½¥ÜøzÁ•®v«ª¸šåŸWYUI’L›p¤žÃۚϸכyŽ5«õÛÕ²ÅS£ª3–u™éÒx‡BŒ ¢š5Oùæ¹,HÓU¥–ñ;nÍrþ)ø‘6§Zè¡ã€õ™Ô†M¾ÕÊÍuoj&0ä/Þ—æ,ŽÔ5kognóÉž¥sUÆÔŸº¿¦– •7Í.Á§a!v|³»î?SKåùê}«N/†~3ºË>š± ýë€OÐVÎ…ðƒRwYõ½J8ãàì€îsííõ¬!C7¤Y½LF1»’2ü9i}¨\¥¥œs;1²F}@ ÇŠôý"Âm?N[9U73nlHíýjÃW‡C§Å†v ÓO Ê‚9ç_AšÑ–Ê{ˆ¢ƒæpÈÜçÇê?N+jùŽ]“Gýª¢Œšº_Ö‡™WÛbõ„}Ôíp·µžy„qFYÉÀ ¹9ÿõñõªó^k ©Û6p†å‰Ž33‰œüÃŒîÇØÕN¶ºx¥Í¡®Ìs¸cåù°Àg‘ï’0qÆ:ë)?‡¬ô[Í^þæ (JÃö—!„.ùd’±Ç’Ìn?1ä WÅÔãjY¥Oªý]µ&–6õì×õܸa¡‡—2–¨óÝ'Kñ âÉ<°ŒÂê•`RP6¸!pÀ“Ç9é“ïë~ýž|u¨ zãJŒ<˜÷wòÃůlÔ°%*²»yl6Hª[Ë=HÁókmªêÊ#L¸< *®ÞGÞ^FGLm8­m'ÄÚ¥­ÌwÅ7ö“ÛyépÛÊV(”aÅL*«PUU8h¯8á\^ ŸB7§›×Õ«[Í«»u;0¹”j5 —míØÔñ÷‚4íÄsÚhol‚‘¬5¨‘n-Ú5ËÄÌ„‰žV27`¨Àfå÷ãê+SMÑ´½>ö(ìC`Œ¦+fHÊ>I PŽA#ù¢/ø’d˜Ú@$6êÄÀÒ~ð œg?3c=ð»ÂüeNqú¾>Vzr»Y[k;hŽ|f])¯iAz®§Ç‘_ˆÏïƬ¦¬¼€}?úÕ’Ë*ª’=3NKæl˜cŽ3Þ…ZQ>·’,Þµ’òé ©)ýåþ¹éOhïÐohBú0ä~o|m~k[³=vš¿‰'’&â/0òH§}}Jê§Z›K™Ù˜Jœï¢-¦±r®#P¸|ÃùzÔ°kR´Êa¨9Œ®?fMª¼‡÷C8\ ý©­ª9ƒk#NÖ?µ^ÒÒBtº4u ≮­ ¯‘bÑ홈Vê Éù€=O<šŽóÅSÞG#»Lœ,s‚9+žþ<{õëj2ÛÀ¥žM„ò›ÕO󨎬ZM–ÐÈ2FíÓ(bAúúU[9I)Ÿ¹Ž=yíþ5Yå‘a% •C}Ö)W–{+y­õ  ‰b "KÙ Ï÷s´cûg¥7Tµd,Ê8ã`ÅV93•Î0pxÉÏðŽØª’›êJpKcKßcOo›“Æ=};WÑ䘺5e®ÿÖÇ…œa«B£µú•ÅÒFwÉÏ=ÍOk ŽzÏ©núž)]È„sžH=Onâ¾3‹òlÓ8©a©E¥ö›\ÞžKÓS§^ mJO^=NŠ]N-[Xšyf·‚êâw–â )`Èù$H'±Ç­â+­f=ìFâÞ{yÜù`FRfen¤äí ·8w`ã8POh>]N噋#Ìrr0}°G ¦GnŠÅ¼µ€ ®=kƒ#àLVKˆ¬¯~X¯×óЊøØT‹ŒVýItëˆ,ïmïït¨oc·›{YÜË*E7ÃyNŒG= ÷5>—mc.¹lö±.CÅo(Ø œ¯;³ÔsÀ u#&´S4$†T*[…1åG¡Àl{çò­O‰õÝuK‹v‰eÌRAzªŸ{vG^£ž@츮~:Åã!US¦ùoºR»’óŠZ~&¹u(Ê\ߥ¬ýY±…%ë£ c²’*’BÜl€«¯ÞêX`Œ`âºÿêTÚ­ÅŒÑG Å›ˆßpæL´Š„õo—¦@$Œàá¾­¦¬FkÉeCï»±¸b ¹Ta@báqš /[MÕY-âXdL]J# l£ Gp~~‘ŠüÞzõ_,bþæ}9Ò§ïs/›>¿Ó/­ Yà+Ž2k2òÞPw²’3Ú½¿âƒ­ì4ù.Æž0 Ë"ô$íšòmbÅläa· g!{{ ýo€xWfm‚ÆÇ£:¡ sNŠYÕÀÞO<ŒÓ<Õ H\gµ4Ê ýüús^#vg©kš©2( ܹûª:šF¾º…¶ `Œ:¬œÖkJãûxìjHMÎüÂà`|ÆEÎnª³/f®_YGP¿.ÓÇ8ÀüM:kÅi>t?*€»‚ž?9¬øïÙ¤ïr Ìhö…ïŽJ²·Ð<“Av¬¡‰cžõ¤*)u&P”VÅÈ•eE¹Ü¨w‚@'>ßáZ–î- -¤»€\ä©Ç§¦+ a0Äæ<±Áù³Þ´t»‰@U–EF>tùAõâº(ÎÓ±…EusfÖä"˜Ë#-€’G‘Œ`Œ‘ž¤w© 0CC$¡p’8òOÐópHÕ8$f'F¡@€;ž¿—é[šzFÛû8[Ä唈9òÎr9ür=Ïá^5Ïêqͨ½ ‹½1#ø l±*Äó>ñç9ÿ ̸±‘^áY‚ w9Ít³ýšÚ&¶iYæH”8áNUvã§N;ðzäV5ÀHÙ• X‰\.èÈcƒŽç­eZœt.ÐÉž5eÌ1Üó2A'Óòüª2XåY— y}ýªü¢Ö8v‚HÉ2`mñŽN*¥-ͳ“˜@ÃtbOÿ®¼ú–‹ÜꋾÂ6¡åÌ®’1çvéøÝõÇ4\ª](’Îwk•?>G|Ô2ÝÀÍæÔ’ÄÊ¢ó%@ó‰¤br6ÆJ€Ýk'>ŒÕGkh#Gonö³*«©÷àZÇ»ŽKwΠl}ëQî Y1,¤¹äcæÎ=j•ͱµ5ÉYq“–'?á\URšV:iJÄVó¼,0[ZOˆ.mxŠá£ÊY[•ΑXî'h<SÁ7 k:UçIèË©EMjdðTqëö!࿈ÊÇt£á˜äç9çÓóë^‹á/ Åmt²ÏpK÷Uï_>x3Ä÷z£–’€Ù#{mÏ_Ãéþ¶7zv®&ò&lHìdÆ>ö0yç5öyvc†ö*SÝ/Áb^XlÏj#á:Ô$à©åš7Ç{¸,­¢ÔíüÓ#*,Ø`6åÎ÷<ŒŽA厼%wsöñ¡¸T ð‰FW# zgõ5ôTs -}¬üÏŸ¯€ÄÐÞ7^FÀ‘¸À<œ{Ò+ÊÏÀI=ÿÎj;k˜o![›K…’6«/ ‚2äjeÜÝõ®Ï‰m4õ¢Üž[ªíÎzrxÀÏæz`sÒ‘cŽÛ O9$ç©'©÷ÿëÕÝ O‹ZÔ¢Ó®'h|Þ„{·7÷p?™ãÔ×mÂÿ$Kju¹f¸r,Ûd`2IMåŠäœƒè¸8%˜æ<3‘âWÖ#j›ß•·®ï™ú÷ÑŽŽÆCÜÕzÛð8}+IÔ5Ù–Ÿ™•7 IäöÔzŒºUı_)M’20!Xòx'Ø]÷‡>›kO»›ÄRRWŒ’89îíd]8ÿehÌÀmõ {¹P-Îç*€áT¨\ãÛŽÂ 1ãÌ6¾¬•X5çûµªÓgm ’­ZmT|­|Ï™¼es¢Úhòfæ¡a´´ÎAÈÉö¯ž¼M,žÖ¨ä¹]ñ6Cc¡Þ±¼OãK[¹I/®fA½‹ÎI>¼ÖCj÷lpïÁ®¼Ë:§‹”lo/ʧ„޲¹fõ"p``äþµOi³u¤k Ü»uDZG#rp+çäùÞˆö¢œPÈuƒéVíšæätü)‰ˆ˜Ü`ƒÐŠI$k´@+Hé-E7̇†)³åÎIÇz’EŠ8üèЩ$ÇåS[[,ª$nêÈ…©“Øfº# =Žg%…BDe‘‹¼îÿœUí"VXTÅpzíÓüþ4ÆÒ¦’,9Œlõ­ M:HÑbŠ3“ùuÆÏ¥vÒ§5+Øæ©8ÛAð®öA ù·ä€*õ‡Ú¢uØNvü¥‡áÏëëêM>ÂÄÇ%¤~ sÍhØi‰q1ŽfÚ ”wϨöÿ ×§JŒšMîqT¨‘ŠîK·‹íˬ¬‰,ù¹'ŒàtÎzc5RöÄ‚Dg>fA#ÏSÏZÝvŠà½Ì± YH0 ƒi8õÉöÆ+2yå¹*ä‚¿ÀíZʵŒã6åèa]h–æÜ —›ÀKu8èzñôô¬}BÎÝ%1_ È^ŸŸÿX×_sš]€’2:ļ°B?wnªÃ‘ɯ?A5x£¶•[-Nvê,±I&TªØª²™~È]]Aàƒ‚~•§ªér¿‚äü¤ž¬·µ•%òZ6Ï ô¯¤d¬z4åF÷"8\K2ŒŸ›' ô4ëÄÅ®ÆPrÀ· ©ìåŽ)ÁxƒH {T׈o™RÞeœ(æ±Pn+žÓô1¦¶>^æE`óŽi¨Žœ “ß5±ymýž›¤T.{zú ÍŸRK‹}Œˆ¥ÊBàŸ©ük””»›Bn{ØIu“ Ï^ 5u+è• GÚ­Ëèxçô¨­/nm¸Œ¡9û­ƒúSnnïuK€é-ƒõü¨u‚³w…åf•cŠ×ðç‰dÒï¾Ý41J9,¦å£8#$0Èãsžõ‚žÖ¾Ëö£o\àfQ“úÕ|}ôíÒ¶Ž"½ )4Ìý)Ý&z‡í â?Ušå/!–CB§åžs‘œñùWgàïÚbÆðÁeâ‹HÑœ±–âØ±Hþ`ÊA$cqù :s_<­Ç' úUˆnf·$„ÄWu óFzIµçª8ëe8*±ÖÙz&¿cªÀ—ºMò7Ìs)*Aÿ¯[zŠõÍ9ÚXn<ÖlÜø ç#=;þyëÍ|™àO‹+ðŠ$zƒÄŠÛX–wgž00y¯|øoñ3OñÍ–Õ Ôh ñ†žz ç úuÁ }^–çtýž"šnÛ4ŸÜ|¦3.Ååòö”›åòýO~øwãh¼Akv"ó›Xo,ê6*ur½ˆ ?gëÏ5¼QÝÝy7Úõ—RO †Þz7|`üÛzN2+Â,ï¯tûy§]Ë ¨#tr8=²9¯oðMƨøO×&ñÝÚÎÍçûÖHæU •wtæ0>ðÆFM~aÆ<= ›±?‡7d¿•öôìzÙN>XÊ|“ø£ÔÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ýü¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ SþP…Ž%ÿ‚rB¤öÿ…ÌþáêK¯ø=6 8~Ó7üqü¾>qñ{Ìé½/ì|Ç–îŠÿ3“ëØkÛ›ðgî•ø7üÕó¢ÿ‚j Qügã>ôÕˆàõY®n>ÏmÿÊšS‘/â뜃Ðó¢Ž+(åØÙíÅ™oEnÏÝÊ+ð¢ßþN{§híÿà™Ò3'úÂ>2.r²)?â4Ù$æÛþ ·lÄ60~5Ÿ¦Ý‰ªþËÇÿ#ü?Ì_\Ã1û±FG­~7ü©v¿$ßðL–Fÿ@ãÔgGþ¬Áÿ£×÷_ðM)db>D‹âñ$œw'H 9ã­RÊsíìÿþbxÜ2ûGî•øeüy$ÒùGþ °ÈGÞñ‰r§ÓþA4‰ÿ #; ÿ‚jÝœ}Ì|Yûÿ‡öNGãMäù’WöŠÿ1,v¿‹ó?s¨¯ÂÕÿƒÒvnKŸø&؆P~UŒƒÓ?ñ(ÈüCÿ©®ò£þ ¶÷“ã cõÑ…/ìœÆúÃñ_æ]Ã7æ~ìQ_…CþKw7üXŒÿÉbíÿ‚zaÿƒÕcø&ÑÿÃÅÿÞzÙ‡ò~+üÅõì7ó~üÝŠ+ð¢_ø=N‹Ìÿ‡nþÈøÃÏþ™êÿƒ×r¹ðMÓ¡øÅÿÞz—•f Û“ñ_æRÆáß_ÁŸ»¹´WáÿÁëŠ~÷ü6Aéÿˆsÿ”ŠkÿÁë—ýWü°ÏSñ›û‡¥ý—þOŘÖ/Üýߢ¿ !ÿƒÕduÝ'üD'±øËŸýÃÐÿðz±ÇÿÓwÝñ“ÿÊ9ªYN`þÇâ¿Ì_\Ãÿ1û·E~'ü®ØÌŸðMP`>1çÿpôÑÿ«ž­ÿÕüár÷ž‡•cרüWù‡×0ýÿ3÷nŠü$ÿˆÖrø?ðM/Çþÿyé¯ÿ¬²¶ÑÿÒÐŒŸýç¥ý•þOŘ}sÜýÝ¢¿ ü¬ÝáÚŸù™?ûÏJ?àõT=àšçÿÿyèþÊÇÿ'â¿Ì>¹‡ïø3÷jŠü#_ø=^CÁÿ‚h¯þSÿÊzzÿÁêe?ðMAø|dÿï=5”æÉø¯ó®aûŸ»4Wá?üF£žŸðMQÿ‡ÿ¼ôø=>Aÿ8Òøy?ûÏOû'0þOŘ}sÜýØ¢¿ ?â4çïÿÓøy?ûÏAÿƒÓ›·üPáãÿï=Ù9‡ò~+üÃë˜æ?çÓ5™nn“NÒÐpÐ@4žù*ªÞ!±ðåµ·™u=Ýã“Ä.\§×<Ž:ã­S†]Pá®õ©×æå„¤“œw'ùÔ7–Ÿgin¥¹‘ÁcÄ®ä·û¹< ûéËš”~÷úl|ÔcË=þïóÜuÝœóÇm¦Å¸ G!;×ð^ƒñ«·R½Ü…¯Õ‹b6Lž™ô~µDjÖH±GÉP$€žqÉÈÚ?0i‘êÚœä(Ó¼½œodêGCÄʱUTZ¾¾Ÿð 97¶ž¦…Ìÿ¢˜£TSʸ ¤û•b)RÕq X^éX’Kwqx/¥”ùŠ8ùEK5æ£r¡d’GÀÆÕd›²±.›²»5eÔm#P\`'ÝÊÓ5^-fw‘–;ɤ9;FÝ«ù/Z¦-.gËžÎFÇO›Ï4ôÒµ&sztÇ6)çéÇ5~Ò´žˆ)¥¨—×¾q{‰äŒŒœ¥ Õ/-Ð-…Ó #æmÀŸÃŽ*Dðæ¡q6ÖÓ_vŒt?YÂWMº2ØeprHöóéIR¯vÒ5.¬ÊVSp¤™åœòXûæ”<êåÖâLŸöÍj?ƒüE4«ee£\yÌ»öIV+êOÒŸxŒ[5ÝÍ’ˆH&Yävë׃IP¬Ó´_ÜÖšjíïó¶ùãêNqNˆ~)'G‚Q‘²îPÈH8aœdg¯Jk$»‰óúôË&‘²½‡ žª?RqÛõ¨€eë9çÓÿÕNXäÆD¤~”˜ì‰2GCG>¸¨™z6pWxªSaʉ“̻R – Hâ‘Ôgæ=GJ9Ø­qDƒãzV!}óI°úÂ¥X$cµKšhNÉèDDWÝ´Lã¥tºw‰´}ŠÏl•@2Üp3ò+Þ£ƒÂÊ×z=lV&š²‰Ë¯Á(â ÑܾßóŠŽ×àÌæãÉ’8ö‘“#:ã®+ÐἎøGÈ#†Îiæ&û±®ìâ½ìÜ'DyÏ0Åug'¦üðÍ¿ü~LűÎÐ\V´ð•‰ÄG#©þËZ² ØÎPì#ã9ªó ›©þÓ$Í»øTA>§kUB…?†n½zÞ›)Ühù^] «n2yk’GÖsy¢¤¾dv<ð£8ãè)š¶™y­XO`‰(FB<ÑCè9ÈúÖM·ƒ5̤D…U /'Èè2¤Þ•œ¹£+F%.WÎdÚÆ¹ak[ +U2<Ôƒsl°éXwWÈSõ`|ØÀ_Þ’1ƒŒ`}ëÞ·gð.µoåG§ù,X‘"ùÛ²Ùý9«6¿ µ)bÅÇ“©‘²ZÊTñÆÊ®¯#Ÿ´Öu›i7Û%±Âm\BÙ+Î9÷éÍWÕüYp’.Ÿ­YÄV`Ž\dûí8'ð­ûßêÖ˜lmÌÛNu`‹»Ó’¾ ïWt/…–ðL[Q¶² [t›vǹ gš…C'È´+Ûáb¹Ùå~,¼ƒT°x­t¨$'!UQ‹ê~uÎCá@(iGlâ@SŸé_MMá?ým¿³¡dQÑ#Ư4 hMùzLL«ºIÊP£h,Îxì$ûW=\‹ÚÏžs5§(G–0gÍC@tL4O×ךcè²ã(Œ1Ú¾‡—Á^ ÖlF¯o –\˜Í³‡C†Á ŒñœŽ8ýqJм?o´iš[˜ ¡íÈfüó”r8Ié5o¼ÑçRŠø]üô>kM Pk[¹aÛi§Á¡^ã fÇxª>™¯¥'@½ÕdÓšÚÍï`]³Eòo‰O¨ä¨ç¥%·‡ô„’Øi6¼±YVê#¿¡«ŽGK¤Äó¹_X;C JÙÍŒÄtû¿Ö•¼/rÃ0ØL}6Çšú%ôm4F©%¬( %‰zwÐSÃÚs&Áb…Tçj ãßéZ<’6ø¿5»ß—ñ>xÔc =”‹é¹qšÑÓ<©\®õ·ãߊ÷©mìmáSs¤ÛmF ¸@§ƒÜ’2*ÂÛX•WŠÆ4+Jy-4þ+‘<꥾Å´ÿ‡ÌîvØÈB´"ŠÑá>±${eÓæn¬˜Ïç^¶²ÍmVm òAâ›.õ_0€:]QË0ñ9^i]ì3Ó¾^Ĥܢªç£mýjÝ·Ã7†QÙÆÌã|giÜ…<ƒÛŠï^(œ€ÎIÇ8j_³ÛÉ«—“ç8­V ŠÙ¼}i-YÇYü+…"/<°&âpÉÇà >/†z~¾zƒŒå]Œqªž!%SŒgéšŠâØ°%w('ŒšÓê´C5Œ¬ô¹Ëÿ¹Ӣ%ÕO©éü©ƒá¦9Ûö¤ÙÔœg5Ò‹K@!ÁùA<ýsNQ3/ÎJýNi}^dWÖk1‚ÿ 47t{‹“µW¤c“üêõ·Ãÿ [•Éçæ#šÒL­€ÏJž_'2œžyâ´)ü(ÊUëµnfx<–×jᣆe’É>0søæ«júþ½a"¦˜š‡’¨DÒËnÒóª({“ŸaÆmA¯ÜÇŸ9Aœ‚ÊF:ü˜Ïã‘P Fù%óRq·~Db>ß?Ö¾V¢N6Œš>ªšåw’L<7ãŸ\Ý­º®ØÓd×Vï a–ýq]¾ŸâMYUZ÷SÓ2-¶OONk—Žªu[¶Fæ6þñÉ^YµÔobc#5£²nP¶$œFâÄxÁô®œ,êQVslçÄS…]TR;ë=hHDRÜ%rrdƵ´é£¼; *ú ¤šòï\K‡ãÔ!Ô%²”I¸-—àü£×ÀÔ^ñ>·¨ ¸»Ô®Ê©%ŸÏpp|ŸóÏjï†`£YS’ßSÏžR¤êEì{µlÒsÀ滯ÙÛÂ_|mñƒFðgÆ¿‰x+ÄÆ;ÿW¸'“th¤•+w?0JÙXÊ7‘èž9Ñò’yr‚\0üA85Öø3â÷‰|-oygámzîÒ N!§f¬Þú5ݵg„’“(ÞØ§‰×^n®Q£+Iìïk~ á§MÓ¬Et¿®èýðü/þ Óñ‡Ç–ð7ís¯é7RieŠìVÑ|E,ÛM¥þ›}$I Û³7–Ñš`AÜ‘•5ñãþ1ûMü-ð¶¡®|<ðM¯Œ® fžÒ #ÅÍ<ÏlÛ€Uû>’Xðþñ ä*¡=~øyñÃâoÂßÍ㯇Þ4½Ðoï”E´Â;¨Ì†Cú7—åFwmÛÀÆ3_P| ÿ‚Ö~Ò¿tçðO‰üeiu¦\¤>±­i·¾ ½iHÀ.·º¬JýÓ±‘xÉ'?ŒÁñvò¥_š+»×O$µôü¢Ââr ¯–¥+7å§ü7öœÿ‚hk_?g]3ã=†««=ò¥¬#Ó|Aoœ-/\"AÏ—5ÔeŠª²Fß6å_1@sêŸðNÙ#þ áñãÃÖ?³·íYàŸˆ~ø±®YGykwršsym‡O²Ã$›æÞ‘;snÛC¿#÷m^5mû7~×ßµ§Š5ÿéž.Ö5½3VžÎçVMîk:æg•B[-¦Ž×I‰£2ÁcS³‚ÇìïÙ7þ ãñÅ_cñŽüU⟠YhÒ{9m¬Æ-ò*ÊÖRèVe•†é–WeÎ<×ê¿+‹Ï³¸ÒTêbw½ÕÓOµÕ®¼ºÕ »,•NztmÓ[5nö×QßÿàÞ„$ðœZÀ%ñ.žº–£-œúß‹üao$P[uIÖÚ>StŽØ*žlGrëÎß0Ö¿a¯Úö;øÉáû¯Á1üñ^äÀ÷ú†µ Ùë7z=ŒRN [Ca#¥µ«(:¢B~WE@e?eÉûPÏû ÅŠý¦?m/éÚËÚ%ç†n<{·Pš[$VŽÔ[ "”«Ë.ì¯/&ç+ùíûNÁÀµwÅ{¥²ø#y‚bµ–î ^Æ=ï«@X,2‹k(³}€åD’Ÿ¾Zß-–}œÉ%y.òm%óZ¿M}ŒþËËàíî¾Ñ·å±éß>?x;ᯉ´ˆŸ´üàß…ô1¤$±øŸþíîÆìÌÞU¬–£W‰\‘ q¾Ul eYWɾüeÿ‚|;ñ]÷Š7|Vÿ‚xþÑß 4ýCöÛñ„4]ÚA{¨j ïßUÖ„±‰ØùðZÏn!c"ðfuÈÈÆÒGv+-Ä哌'Ùõ¦ÛûÕ¯øØâ¥Ž†22”eöšýO~ý˜|UÿÝÞÙ\ül³Ö|6»â a¹Öß㈮oµHîT ©4¿8Ø1–R@%BÕ/Ú3þ ÿçxBä|9Ÿàƒ|kIºâ_ü:·–_b…St!Ü©á£wƒ¹•†+á~İGÅßÛ|Sýž¿l/ÀQÀ“5ÿ†¾,^í±cöˆ´lü•Ú±ˆØ¿%HãwÉzö…g§j÷Z^‘ªAªÚÛ]Ÿ²êé‘­ê'Ý$ª² 9èê¤wºr܇ ˜+Ó­Q%Ñ©+}úbó|^IÂ}SNÿ©ö×í?ÿÿ‚PøÇÁš‡ÂoÙóþ =¤O¥Çmi+ÕµËñ'VWçì ö–NI»Mûˆa·†øwÄ”~ Ô_P±ð|•ÃFãM°½¼–}ˆ 2Éwq<ä»›t„Nm ˜Z_ž9ƒ)(…pc¡8®)^VߢZ~¦‡‰~üRðï†-|{âk6:Îϲj×v2Ck1`J•ã± 0O·C\½Ÿ‰.¤ÔVÎêø*ìßfŒ¯®í˜ü‡©Ïc¡¨ÛMráÚ4òÊbBz¸=AüÏ~æ‘ìí§HİK*§ÝPù^F?—èòâ^õŽKÒ¶ÄBßT½¼—RmJ!ö†ÚXš(çwù»“å6Ü oR²Êçk4mî.á€Y[5Ô–[¦³ÀLà`Á?ÒµÒ+x¬0º{†*X …›Ì˜¾p»œuéÆ*'…‡??^æ‘ÄÍG’î݆™5XØõ@«ïlãþú˜úÖ´ DÓ²î?+µ¸9íž;ûûÓ^ ÏÍÃi#:ñc“M¸Ñ¯\í/E‡ Ï¯ÿ®´´í£d§¶ou€ÑÄž%•w‘»Îâz㌯Jd·¾$óÙ"ºFÙ œó´gÿ=蹊åT¬ì’*Œ¡Âå~¼tÿj¥Ë\’¬›B½éÈ<}+))J׿ÞÍ#Ê» kÉ3õ¸Pô1'=‰_ñ«Q^êh;ÛµVb7HÃ1>ø<½³LK¤;ÆPí#r¶ã·Óg“šG[ØX^_|¦Ø¬Œà9;Û=Æ1Vm¥ž{9– <,Ê1ûéÑg’Y€rI>˜?CYY•"u‚]HuÄõ9ÎqÏCÁïQ¦£t ••v Ù)ôã'Ÿæ~W_Cê”o¹£šI}GU[f©òm-ð:|ÎÄžx㯾MF_O†é®Õe¸–;²yî\(œôÎ8vßÎk¾•ÉÃ~èwß?¥]ƒUPI,OlkªR9jQv;{ NÀ¡Šy@É~œÕ˜ÐË–8ÙUuí\}Ÿ‰„ª0;äqŠè4_ý¥‡Ú]¶‘ò·}®êu£=.pΔ¢®‘¨bÛ²-3¤zåªQP¥—¨àcµ/–ª@ Îx­ÎnfBaLüÌ®E!†2Á· öǧ0ƒÆ@ôȨü¶fÙËŸáQŸÎ>Â}ž%`Ø9ÁÆ1G“ díBÇ®§¬ó¹2SØœP¯ À×ÜGµ\#€Ù œàc׃ǵg*”©¯zIz²ã’øUÆ*w, qU§í(p‡jôëV-î ¸•`F”HñG ‰¡u`e2à‘‚\ëSÚØ^_†,$qŒÆ¼° 8ëØ ÅdñXYRöžÑr÷º±^ʪŸ/+¿kòÁ#9*;¹Ži³Z‰]7È7¼8ë[Zuõ•Üú}ý³C=´­ðÈ…Z'_¼¬¤eHÈÈ>¢   ¤|õÅTT*+ÅÜMÊ;¢ŒVZW‰éž‚¬GÓ‰±…úSþÍ>B•ÉOn°\çïU¨¤ ÷!’ÐJU‘òqÒ’hU`1…«QÆB˜äôÅ)Ã7¨|¨žfGlÁУap>é÷V<¦3Ø‘A·Pr‹Qž´Ù#À·N@4+¤-ØÕvcµuêsN‘YpsÇ8Ñ»H¡Êão*NN?_¥Köv'POéLì30œ¤Æ=èXbˆ3)I'·âiÉyÇ QÅHa!£8ãñ§bn|ó+Hàã ÷@P8ü<Ó™7c¸Î«2ÚC´ÈŽ['$œqùqHšEäï²Ù‹7 £'ô¯”%ÐûdB ÁºkDx[_*éäg¦ãBxKY›ìØPpXž3V©UþVC«Iu3ƒr?!SG0ÜpéëV†uBàw2ÓNu¤P¬N0iªu"ö8Kf(¹~n Qtàð?:X´MBi6[Û³sÁÛ[šWÂÏj§rZˆ“»HqŠÚªÔ~ìng:´ ¯)$c­ÃmÞ ?K ®ØPO=1]†•ðUã`ú®±Rù)Œãò?縭eðƒt GŸQ¾•‹°K3*…¹Üsž¾µÔ°uÖ³ÑyœSÆá¶Ž¬â-#¸—æŽ2@çÖºÏ xZ»‘gò^ >y®GSŽzŽ+JOiÚ~§¢[iñƒ&Ù¥’TÁ*ÑŸ›$õì:Ž9ÒƒFÔnî%½Òõ»w`‚S¾Ý° ¸+)\“œäœtïçÏ;ʰuù%6í»IÛt·"PÄÕ§u/2ÔóÛÛAûà?w‚[8Ç^¿ýj›NÓ5=fÊæóJ¶‰ã´’)# *Y@$ààn$äk°ø{ðâÄ+}7Bð…ýÍ“Gk-íËB`Q 10Ì÷¨@›¥Âœ…Âe¶€÷¾.ýšÇÀV2ñº Ã&Õ—Jd»Gf–HŒmå¸6lýÅ'k€c1æóN3ÇJ§³ÃG‘'¾÷ûÖŸw̬>_Mk=O±ð—µ`-lü1{;#tÇO‘×Ëû¢C€YU¢^GÊ\y¶aø=¬ÛHñx’-JÊ)tÁw¦Ü¦–é•®Žs>Í€‘1èæ1Ž´}Ž­ñ³K g¨x6ÒÊÃVµhÃÃw¤n10FA³¶_0…& Ñò…ïÉøâ†¯™tKŸ±´ÉåΖš‘hÊ퇖`ç$³g%‡$ Ÿ'ÅÙ¶"*VV;ieØjO™™ú×Ã;oø¶¯µû;É- R·[³¨"NÚ¤Èù³¿$‘ÒÚérAðêûÅžñÞ§m¨¾Ÿu`–Þ]ÛÁ8,[î*4@Ç88Ý”I°H…°£Ô­u‹ûe¥—Ê% ‰fÛå†<áqÏ8àc‘Ö¬^êzV¦ÓK<ŠÊÒ+ˆØaß‚6“žÜ÷÷Ç5àË^¤“rz}Çt8§Ë¹èð÷ÀË_^ê:gÄZÿT“M{dèêò0-µäE3F±.ÖÚYËí°^˜óý.ò 4éµÄ¬p—)QG*™Ýß9ÅV²Õ%ÓÖI4éDb`À]¬Sæ åÈ'=ÎyïYM´{¡|'ÝlR0®bhØýÓ—rçøp¾ :˜œEDÔæõÕïºÛîè(ÊVÜzÇÃÝ~âÓ×–ú÷‚âš ’òuw_^@Ïbd²ÏIs«ÑªI¹ïi:¯Ä¯â|=ð ‡U™ZD´² pe?4Ž8‘B2T|Í´­\Ôú¹mg¾ûLû)¶uŠVŽà²*Á•˜¼lJáIÀ Ëà/‹^4øg¬O{á(,ín¯­šÖøÍ¥CpZáÕ~ÐŽª[  1¹ µ^2–ªÙ·{üR_“ETQ>G§É?Îæ£üø“c¦Þk§…. ³Ó• þ¡4+X2¡†ù˜ùhÅy[sq€IÅgxÁþ&ð´:}Ïe«kö5çBê-ÛwÆÝAã#¡àò+Ó<#û]|sø? <,¶º±¸Ô,5];Í\p¥ ·ŒLnmfT„‚÷„|µç~)ñ<}ã™lu27×/®c²ŽÃJÒb´'I f! !V6väœäרQãêѪ½¥%ËÖ׿ÞÙäÔÊèrû²wü?#%caÉ=Î0sOòÃ¯ÌØ=½ªþ™¡¿ûµ>Ù Þ-»ßž¥™€õ瑟›ª·dÜÓyб UDÞr2í8êã‘Èéƒ×潪\u•MÚp’ù/ó9Qˆ·»$ÈŒ`s¸ý ëJñ¦ž‘³©òÙeÛŸ¸FO~9ôÁëùST2yLøcÑO^ý¿ ú\s•ã×îj¦ûlþçoÀ௃Åaþ8±…Uc<€úRÇç½·¢œcv8z€Pkd0Æ=1^Ž«s”q_T••>¢šÊû€‰²»Wô_x“ÄwÇÃz4Ú•ÀRßg²O2FP¬Å‚õ *18è'ŠÊ¾/ …5i¨¯= !J¥Gh+Ÿ9xFC>£äÞC½s¸y‘“ZôM>ÚÎÝ<ÕDc?Jó¤´H²Ðü¬}k§Ñ¼IRÚù%.@Eëí^q¥îÈú,]7?z'Oæ$c{`(÷äfµ Ñ ÷@< ¦åð‹ùQO,ÛdPçï VÉ(«# 7-õId,¾XP äŽ ¡uÅËCo¦BòD[öI`»F2v¡ù{w‘œ½oRÕ/µÅÒ¬/Nž ŠIe.â™`Cà€­»ã¹äûà ø“á}£Ýxeæ¸ñúDwZuî‘e™Gó¾Ð²´o,dÜEJÕ`ÇÄ\©*sÉéŽr)Ò„êÍF1m¾‰Òi+²QrZÝâòQ‰ùS/b†æõíüé£L`¾Ä$ä6lGBÝ8Å,¢èo¶º–?0¨îÀ‚wÇÜúž˜éÍwŠgˆ¼W.YUV²äŒõä烑ƒÐMyÅjvGm DÔ‹8L'ï æ31LAcŽx÷êsÃ/n´»ˆ¶]âU‰]šD /C¸íÉ€Œn9ÎTXïãÞ ‰+*)@B¹;°Iï瞀cž3®moþÂSíÞL·j$BvŒÊH*:ü¾†Ÿ´ŒÕƒ÷N‡Zø…«Zx~ÒÆÃÇ0ÝÀö~Už‘ª«QVäHbBÌ|š8äÝ$äµMâ?ŒÞ*ñ<ö÷^0Ô­ïôÛhÄQèÑÇr!‹÷†H;Ëbd RBÊXW¨É¬ xæ·Žê_8¥ÊØí0Ä¡°¡U/~ÎOA‹³[Aj^ÊbË‹ËxnAW…9ù•ñ‚1Žæ7¿ÞÞϪ·ä÷ü=I~Õü'A­j1ëê röZM²[6-ÖB#dRÌ‘3‡Ø=>LºüÃ¥3L¸·Ò,íÈXeF)$2Ýþþ6AЩeç8'wLã'ƒšz5ÐIÖÆh×,ùB#äà}öÇB Ç>¿@nM¤FêÌZE‡1¹ŽHÛÐzWÖà¸V®g†UðuT£·¼œ_꿆®;êõ9j&Ÿ•ŽŽËSÓ|Q|¶ÞðÑxP –†ôNžca°¨EÝœ©-iºGŠ<4÷g޼7y%¶©&£´ñÇ{§Ctcc&èIJ!h WFhåÝ^¨/í:=Ö“o4 !îc!йQ¹ð7ÌÄ( ðÄ '3Ã,|s©^ë­­øsJ[Xn.ŸNÔõ;‹UºŠC£ÚGUòc~eY~FmÕnRÖýÏZŒm©¡ã¯ŒjöóèþÖbš ¹¾×­£:Ü‚æP¨òÏ,®¡bfŒm•Õ<±Ë"&Ò/ï˜ÞY´2áŽøö0€çŒgÀù@ȨµÉQÜcÛÈäKs*,EUå`a@dv(ªA²ç²ŒeªO3A$±Ü’j#ã(Ü{9ÿLJ­sJ霳sæ;Ÿ|O½ðž£6¬ÞÑ5¹•Å݆»¥‹Û{„À[Í?!ÇœÆHÌo¹Ë 7,ey-Nø ·¹±·Ž/2Bí Ìp ÎÅ.Y™xÆ\±èIj§g»vM–£ ¸·ØL¯’GðàœusŒñÍkØøjÆÅY$’Iƒùx}܃8Éüù¯ªÉøW2Î)ª®Ð§Ñ¾¾ˆãÄæ4é{²Õö3%Kɱ},àgÉg'çÚ7c Ü•À>™5³§YM§ÚùW“£ªf6ާ'¹<œý*Ã$ÍA†3Œ €=9Ö°¼4Öö÷òÙê³K?Ÿ+ „,eò>>]Ç‘Ë3÷±œ…Zú«a¸"*»N¬ç¢{%òÔጧ™Ý_–Ý 7Ö­·ù±Ë$¥K`‘‡®æP0}sU"þѹŸûJôùq©Âí(ÌX6àGN:`zS5 cL¹Ž7)x@ÜÙ [Çæ$`…Çcžj”:‡ÛÀfg…IÇ™y‡n~øÁô •ýM|žmÅy¦gg9(Ç´t¿«ßôò:è`hQwZ³BßRkÈÑ•Y™W{F«æ¶Â~pq¹:ãŽ2s֨͸$t¶6rûd‚€‚®ýÇ;—ÜÕBxµ]‹ eÜv›ddtR\dí«%¶¡)µ0ØKlP>ûƽ·bÌ€–ÀÎv‘’p½H¯–u¤´hŸõkè![¶²#Ë“šO–Af àòª9'®E2+©dóþÞð62¢#`œ¨9ó¸.8ç®9Å 5KÙƒê7оLÇ(†8¤!™XïR„ƒÀS‡à‚T`&Ÿ Å§%œeÔdšÚGIŒ—RmÂãwʉ .ÑÉÉl“Ô`‹RÕ ¦·,ÿe[Ç{oujmíà•”•–ÑTÈÀ¿p|žØç§ÓNîêÉ­ž+kF†B ÛÈgVgmÅvasº>AàÌ9ª^¡g{kjífòËnG+¸6Öê§Œ„7_˜àžqFK>vSw5ÅÜnm¼XL–6•eãhõ\I‡2Ý—®5KibÓ|A} 7WmÆbf|À†ÁçqéòÕëkhï!K‹­"$m’@ÒÛ#jô_•¶žçבÆy=cV‹IÐìÖþKÝܧ٠¿‘åó¼‚èr ?ÞàÖ¿ƒüm Þ©wcÆ{*9^å‰R.pNAÜ bLŒk×Ëó¬Ë,ƒxwîÞí5tþý¾F5°Ô«ûÒOÔ’ñÿ³[›hneGmè‹,‹+y+ë“ϯ¸5«£êSl|û¡ yþÕ ÉÁ#«s¸ç±5cÕ­ï“Gq$m ÓE³2’ª‡s• qÎy=8¨7‹»rlm$‘mÐ,Þc³ìMÊ3mé÷½=øcQ,óíL;t¯ºŒ¥fûÙ¶CÃÑPå—½n壦Á¨jgÄP9ŠILw&5AS’N@ôÏnMÅÍɸŠö˜_7æÁ;É‚7¸Ê€>”ù 'ón—Ì”Ä(©LcæòqŒÓñŸ–þTKÈ|À$*ÿW¼T®zŒdƒÇõ® ØŒF&«©Z\Ò{¶iX¥ˆ×¾¶{i$»k£m#HÑ]|íò|‰(È8+•pWyîEÒê#H ÎŒ’q"0yø+Ã&>` n™9ãµý3Çþ)¼ÐÂÚµì3ÚÀ¯ÚnmGå±vh¼æS»;߆#ƒKâmj tд+d¶ŠD“/ÛÒd,.Ù1Œ³e¸b½qˆr[sr;ǨäURJ®3L’9N*`ºö¡›wc_ÒöGÅ^ÅUVE#9"±ou=GJñjjðÞ UH$^k*8 IèÇ,ÙÇÝã‘Î2w˜„î8Íbxš;2óLñ>—&â A#í FK‚Ë&”c'~Wç­|ßP©_#ª ö³~‡¡—TPÅÅŸdþÍžðÆ‹à #âÿàZâáÑæ¬-¾Ík}qeYe’5¸º¸˜Å-œb9$¸#G'ºè?´/íèÙý“⮦ßKw¦]êzg‚íáPÚhžq;ʶñE¼’L…/ÜU>Ný‚lþxïÄ6Z/ÆßxŸQñN‹®@þðƒ•—%ªÂ<Çi­-îIÚIü‹‚A©™70?j/Ûèž9ñ'Âý/Çî¯á#Ä·öÄ·"=@C”ÞÉ,ÌYÂyjä"» ФüIÆTú¥nÇÚ¾gII;#oöŠøõñ>OŠZˆu‰–ðKw²-F¿•ÕVÄ—Fó7 Í<[g/7Þ#*Û›á‡Á¯ürÓ5;-fÖî-ÆÎâèøÚÎû>ƒpÖ¯4v,ÊËи‰˜¶>h—ŵKÙ-¦k‹û=©“m½ì'h§rr¿'s¿5§àÿx—Fñgö΋¬\Ù<®ditù~Ç$˼FcGÊ´a€ÏËÎ72Bœ§;»ÛmN5%Ívh[x£]ñ¬×ØÃ¨C¤Aq³ØóCjo*¿2.@bÍŒfÈUe¬[¯‰íeHd*³7›„‰PÈ Ã8ÆHü½©eâOx\žÿÂZާ¦½Ð—–7r[In@#¥H!Kgæ‘Ó©¨ŒÞ$ñMìúŒ¶÷7÷W24·´+¼„îy%Øî,XòK÷4•E¡2”ï¹,÷í;MÏÑ1†q€[qmäç 3âQ× .ÖI@½G]°åÌD¨(2A'8çœz ôe¬—Ft[0ÆeÄ‘6 ùxlŒôiÃ{ušèm4Oø²ãíZÒ^Å;[HÖ÷¢PXã ŒÁêdœãQ·¸®™…TÉkq<¶ÒÂï9e‚WÞÉÊ||ǽyÎk]‰sÀ<1X‡ÃV±‹ƒi9’[f7ër¿*OÞÀ9.`—é’¹º?‰ì—@‡V¸žKœbX¦Vò—qåþ`3»œc3ú¿ ñf¥*X ÓjIY5³kò¹àã°TÝKèγ.ª\“…8¬­Ãz·ˆ,&ÕtÍ&þñn'š{h´«34žZÒ°òaÏÊH œýÑT5Ÿj·'ýQv‰` "Kw&deŽŠO È眎* #Kø—¤ÜÅi/ˆnÿ²ÕV)-#»˜ù…7 <Ïœ.B—PÄgqT3¼â„)RÃI(»½›~–èV^ðô$ܦµ5üEá{†°:’K ¶ ,¨Ñ9 IÜNzûpr4ý6{«hoôÛøU#t2‹‡XÚ^ ¡gÁæ@Å›!Bÿv×EjÚ‰¼Ô$Mð[ÜŸ.{ÄŠõü‚1µ¥e@ eÄyêÓÍMm¹²âîM)ÄÛ¢ ·‰Ùc §Ïò(Àrüãåsð+†3êŽÒ¥Ê»É¨¯Åž£Åá‘wôÔÁ¸ð†³“imsl$“ÈŠBL…ÄÛØ’í°mÉÀc°u¤öÝŒ°ZXýZ(b7·îԲ㫠 däq“ŒŒŽ•m.u‹§YßÜfÓ-$¤Æ;I-µFx ?à#¾MU}"ÛN_¶Ë,ŒÊ‡É/! °ä cwB{ôì8¯SÁ˜ª×sÄS]í+þFqÊà–¾V2¼+á-ZîâØ[jÖÆìó$žÝUUYH/(UB`8bà)ÎsÄ|b¾ñ'…®š [h [­†[…¸FicävÝÓŒçžúãM¹:‡Û¬tk¡qpÛåŽrv20ÇÌ9»Á ÷<ßÔ!Õ|OáÛÝ?Äú½”_i’9ÿ³­5F•~㵼̖õûíí® –bÒXTIôwý?S¯^-©É[Éž'¦øëÅ>•4Ïi·H²GæGö”hä(ë•a¸r_Q^…¢jöúþ˜5 ;R.’d<ÚѰè€3øž‡§Îiÿ45º’-NíÑ]÷Gå66+sóÏ|äù=+±Ð<;¢èº6V …ä–dèK0wÐtö5YL¾k÷KÞüœD°õ5†æO‰ü¥ø‚Ïeý¼³3‚D>$P¾l“ƒŽxàuâ¹ß xUðïÄ š¢FŸ£¼“»›p*Bí#,“¹Ç׳C=Â¥°ÜĸÎ2€Ü3AïžÀg׊³+[ÛF¥g•e—Yˆ$ û™¹'€8?Âs^u,uZ1t“º}:Ò©R0å[Å41:´æåÑüµ-»Ë'’Ì9VÀ'8ç¯'¤–ÝíLs¥•¼E¢#dÑmu-´‚˜$2•'¨¦ ÌrÛÝß4v *3G" sµÔçøA8Æ3ê1ŽÝ(Æû» úYvŠpȶü°Bß.p½ñ’6ñšÂ馑ËÙ˜%‰æÁ*•™Î8°0Ž€~0³³kìópí· [¶'#åÅs’ís®±I ŸÄR ˆpG8õ§'O¿¨‘zÍ c#õªºµ’ê6­o5¸ÉS±ˆåð<Ö•#(nTT§p{2£7 &ˆ~7‰|6«á/¡ºÒlåžãS[ÿ%’ØDÈØ‘H![vÆ%¼Â6±#4½N¥Ï‡¦l«msp·g+m $GÀ.îIêÄå·WCeb—z›é0ϺXàYäŽ|§¨r¡7œÙî ;ÄÐXÙ](Ñ`‘‰Qæ#ȇn[ÝÁÈ<Ž{u­òú<)J¬pTµœ“¼­}-«¿O+^Y½¬½Ô­£8ÛÝ.ÊêöcÔ,RB-äšTQ$••‚Òç<+w!k/UøãFÕôí_Æ?t«‡,¬48×匹oÞ²E ¹É.7ìCn®“RÑ®dYÂp’ù½*@è òúóXw73:µÈž6ga#FY¾lä’éÎ{Ôóùîi—críÚ9¯]MÓ¬ñ–u÷’‰[·Þ9c$×+­ÃâøŽÂd×$VÒmv&?$ëbxX1ù•‚0lò# s€.yl/­§D˜í{x™°2§x>WFÉ8ÎA S€Rýï®­à´½½ŽâŲÓKuà*·%C«3Î7Lä_ ŠÞ÷GµU·I¯#œ6ì?Ñ B8ÜùeHÙF@$¨°@äc ŒwÐÒ­§/ ÁÌ"”rbWP͹ 8nGl~£2köð¡šÒk7ó™e2 nÜ2½Óè:ñÁÒêQ¸Šõâx¤ˆ¹h¤!em¹ÇƒÉëÀþ\é;²vÛÔ«¬Ú®™{q§yï3e°´~aûÛ—åæ= —çv*Œ“ Ý¢Hvå í¤äœãŸË#óÎSR¾y&Žîe™&!…Ÿ>o QÀ8'#=úT0\Mu«}Nf€>L…ò¨ÇË·¨ã çÓÍ=¬=YnK[{Hž ¡™ŽT&qòüéÏç$ô¥Ó¤±ûB%Äñ2yk"\+ÀõÂ…-ƒüJ3Ž„p44[»ˆ-æY¬KÛÊ’§–£2§v ŽB°ÎÑÇ9ÎÚžúÜÉn­°h×Ì2!U$ ’ßt…L•°OBe¦¥ sꢷ1ïn—Cò/5:W´0.;o’D“±†×äw8Ò|Qˆ.oôöÓ¯míc¿Í¢Ü¡"E2É>\€lÉA‚PŒ â·â×ïîíb&qºïÊ…-ÑZŒà꼦ÐÉ’>V'žõR9¢Ôn®b³A Äq¹Ùn(Ê”ËpH8s´ôϱIÆQ»î¥—,×Ì–òiµ›"‚ݧ•Ñ’&ePA$c”Â#9ÈQ–²£²Ô®"if“zÄÍæìºĮ̂PO ~ppGÒÝ뫦i mb!Xb·p×Ñ›•Œ1Ú»÷&0Jº€ Ùï­É§ksɨØZÅoHØŠ)G(EP¡_x*O:±™¾¢åRW3^Ú*¸Hd` åcÊã;r@ƒ‘‘žÀ8£M½‡Oid¸%|¤ÏÍžGU<’8ÝŽIÁæ­^G%Ý»¬{ÜK/,¡¡ÚT°Îâçnê*^[\K¾{…,øgJ§ 2`IÏl zõ5¼Z[„£¥Ú:5Q¹†ÓúbºŸ˜½éÅ€ z×ôáòÑI‘ïùRy©ØÑ ¦©ŠY|‰mà‘]8º}±mÁÜ‚+‘Œçô(…—©ÎzsYúλi¥Â.å¸;b•D±ÄAf=¹È§¥pfq¥W/«NnÊQk{n­ÔÚ‡:¯­×æw:¦–ÚrIu©FCÚÚÈ$Lž0ä/ ¯9ã€HÉëY> 3Mp-)c¶,"Y'U Áƒ’ c¶@l s“š“Âj~ŽêYnÔ|±‘<-æ4+´'˜]Fö*Q™”œdäð—PðÖ£ö¯´iàÜ@›8£d•”…$) œ·!xÉè+𾯇¡U'$¤žœ×k~uõÑŸGUjAÆÎÝmúMá«È„‘ÜKäb"ÆW ˜˜`P)bä7@NÇ5¨h+w®®¾\ìCXMn£(‹–ó¶’p­…$‘é´kÉv[I¤GnVPÆV\±QÁf' Á=j=oºö‰wvÊñ2ã`Ë FâÌÃÆNñ×i¯§ÄýS2j–iýç6œ¶i-µ·ºµóg%(Ö£:4½Ûk{ÿÜ­Ÿƒ-#–ifÔ2îÄ[²¦xƒÎ:c¯~¦þ‘¡. °}±¤¾NøÓ§¦1NzñVôÕZm%ã¸ÛòïÔ^¾˜ç?Zk3Íyq³ Ø…ÎÞ¹8íLç qœ×ÒÓ¥Â,¤áÍ©óIí­µw‘É|ǤS³ò²D,@({S|¼Íǧ5vÎ åc´K™|ÆRXËÁLTœŒ’1‚OzÚ_†w×ZJêöZæ&QX·uÎY„ÀÈÊ倵tQ㌆´Ü\œRêÖÒ×*Y6:1ºWô9¸ï?³œ_…Säçv:¥wºwˆ$Ó4\ðΛòÍtÔ…™!±—!Ž$`m àô ¯ ü;Ò.-ßÃþ*´³?feœà£|ÊÃã9Sžƒ8«ÖºŒ~°þÀ»µŠm0F!QLÃh#jÄœ.ÆÉÉ?ñn}C=­OØE¨Âú¾·òí¡ì帘*o™êíò7ôÿ2Q$Z/w ™£ºÒ¢1»«ËðŒw6ðr€Ã+ñƒÅ÷šêáÉ‘*›§²·¯1F#Êâ0«åî$2Öñ6»á #G±ÑRÞ}>ö ¯´YÇc~²5ž l`¨ P ) 1€~pX“ÁÜkøÛZ–ÓKY–+8U¥¸‘Ü!pXãù™c¸28Êç ׯòVO˜õÕkY6XÓ5ÙßÙÙÚ]Žåàm¶`¹ùÉÝ’ $ç¸?7jŠ÷A‡\¸¹–Y'‰Öä$Q»‚‹$gpP2§8a×< ´úW†¼-oy•Ψ>Ù};üñ',ܸl!ùº6Ìm²Z´,ôsû=ô¨ÄWFíZÞ{Ã*$rgœ°0X€ý à0fµÝ]™KQ;Aœ¯c=Ô–‚Ä,ž`ue í‘¸áSŽJàzcFÊÇU·´·Km:FeW0 ¸‰°]Ê£tã#†J•¥yÉÉù»³ÔT¹IzyÖ6æäKGšâ_ž5óI çAÈɇ* ¦4½–…¶µúEü­#¢%´’*F¤¸ÎU1! ‘óe˜Ÿº~F±¥xÖö÷Ë]^[êQ¶’ÚÝefó˜È á×ÛÌ9‚°z Å0\ë¯}ãeÓ`·Š=º>³¨Ã8xcÚ G¡nsË$ˆùVaüdcÌùmc¢5t¯©ÈÍgw¥èfþkÿµµÌ†Xã}Í#6BáÜ0b¼á†0Ö“'„µ-G¸¶:íþ‰ktË$׎­ CÃyygfb»~V9$Fì í.çÓdÒ\¯î ´&$ed0Ú3’6òÞ˜ë“PZx#Vñõè¶µ¹xcWuÝv¢Pª£,Ã, .N9r Sõ_i·:T¾%Ô¼Cb„Ü™$‚hn§“ ’Iݸª¥ˆTàp9»ðþþvÛâ{:]*Anòº´ cz‚Täãøp{ãšÝIEXQµ´:}á߇ั{{Sæš»9chÔí\< ÊHÚW#%!A–Ó@ºÓ4ˆ'—C†8ذF°ß,o—|`3&NAmaÁ"«Üø»WŽé?µ£Óítö?¹‘mdØÙlÄÇfvòY¾è rI+M—Ä–ö­gZáµ±™šÊè˽qŒ¨G9 0qÔ¼OŽd扫â?éö“›sQ†9$Uq.Ÿ*Bã"FTUN@€@Á±ü5 XjRùÖ:$«ÄR{¿°¡PÑÁ°[Ôî=H"®¯âíRïTÊÝ]iovcŽ[TêAvfǪA`2zWQáø4ý;[ CV‚î&;&¼ÚÕC¿ÈU·d2’1¨tÑ¢‚læüa¤x»AÒåÔ´˜/n%´d–©hÙHe›`Ý“ó@èsϪ^Æñ)*> ½…îl±_:E¿I‚B¤Ç'j‚Ê6°`3` ÖŽq–ȫͫ&dh¾ñ… osá⑳‘Ç|V9F[,ŠÍµp>^?¼$ .Ú«?‚®H]ÆmÄ1F‚)ж1´òvóޤRÓ< £hö isokD$ÅþÈJprvÈê/ñî’,jÞ‡M·ž;+è–†Ù§o-àG,I*ƒçŒO$ääòJ¹¤0‘–Ìð½@¿—Q¸ÔÖ!š&­ÒAp€ »É8à^A5ÖXéze–žc2\« ¹rI<‘ß'ƒäzcÂŒ Ý-ä#Ê€nòægrË÷Küc¯9ÓÒKhdE…e]°È±b:žQðßàO çBqšG-j„®Ö†mõ´¶ðîT‰!gýáòÇÌ3ÀÎ2¿_SÛŒ*iñ˜Þv€™$*£Ë\íUlÞüd‚^©¢[™®s›Ѩ$ÆH(Ã/«»†8ÎïJŽÕEÆ ÅÔ\LŒ±³Â±m"B¥X7Až3ŒãiÅo[icG@‹PKã$‘Àön¥§x‹n'æùF:`‘À<‚3н«hgQ’ÖÒ-Qg™þØâB Æ6 –,Hs…'Ãl¤¬v×´á¤&@Oƒ’ $¬{à)Æ\ÚkµòUmå Ó°—td¦ݸŒŒ€Àap $`€MFïC®”"Ò]u*Ök=6'j‘Ä|¯”ù2p$’§x•P3¡°Ò,§idÓBȬsº-œñÓiäpOç®Jï„ÓuÉÌwW&9ãa=Ì@ àaÎe $våÎé ]¤*âFºFXq`{¨?!ÀÏsŽ£ ŠqƒŠ;yˆ¡£ü6¼¿¶´¿¾Ö- †í ‘#Hw0P”œmC·žIê2kÕ<'¥i:.†‘Üj)ÐÅÉmqòÊ¥A²°cŒ6W' ü"ž›¦iÑI&•rVùíüµµHoQ™˜‘¿tgÚNKpX¨P["Æ­¥á(ÒÚ]jÚòêh¾Ó%Š”[ˆQ›!ŠI@fÚ$°p29ïÎ3ìÇ<šúÌ´Né%d¿Ïæsàð40JñZ½ËVrZk°¥ÏÃmnÖ+É'ß›«YdŠí™·c+°qòò¡zNU¶Oˆ5ßVúµÖŸyqnl%¸XYm š60È¿6Ô˜à†9!²r@#bÍׇ|!uªYÝ\Àc‘n%†á;Ùù”Æ«°)+"ü¥w8CÈ9­/ˆ^/´ñ¦­m§O§Zù¶3ivÿd¶xLÊî’‡ÞØ‘ J’m$“‚à7ªÖÇ[MÞÌàk˜—GVñˆmü?c#Y"-oæ‹Lû\àãžñÁªË¶•¥}’úÖ]‹{–wØØƒl䃆)19ª1j^!²š5ñ†i$¶b³œ¨’DÉvISò*Œ.$±#u·§…üC0û)/níEÄÖª‹"ZÇ’PJ ñ'ÌHËœ ÔÕG£(x[ÿ„Qneñ®½m«isé†M>êëÊób$7h;ÝÉUl)$ —Ö™®øf夂Ñ..aeÇi›©ƒm›Œ6ä㞸5ÙÉðçVñv‚ò_¥¾b—b[µN7ÎT(rˆ¡ºÊ¡úàÇ5Èkÿüa`òÚ\ĶËgrËk –&ݹ£]ÌT–U ¬pTm#±¥®„g$üŽ‚ëâj]ÇŸ©ƒn‘(1Á|ß*`íùBó ÚÄ9è@À¼u ÍýòGxÌÙ¹‰&[f”+¯È#‘@F;FîăÇaŸàoÝiRCá'ÄzS›¹X,Z}°ancM¿+ɵ¸R6«¹C·2Ýóø÷:ä> bò¦[WUáX*õBsÁP@ã9U u%m¸:sј²x“G½‡ûKá—‰š{ZH÷OÌÈÊ0hÉV$XŽNwü%ÚÝ­ÌQéBú9¥œ £<¾™Œ eÐç†c†9íòŠà]¸àœö8ã Àô"rwÐ~™ãiž"½µÕ‘c…¥[˜ž5Ûmìà()€«ó÷äI³â¿ø7Qºk}Âã¹[’22ï Éî;f±îôhD±Å5ÔÁÑÈ&> #æN¸ª£A°Óçš÷N´Š–ÿ[,0*—ã‚sÇ~`zsš~ÊâF›Š"i²Âå;]à†båUŽ cÂ’ÍÁzõÅ`ë[nRö“q–ad„cnyb8-»=U-µ¦ÖêÔ8ša‘26¢®Ö*1ŸÞ3¸#V‡‡£·µ¼Öµ;méik+ÛÀ³ß9ÚÄã›lm, 8,Zøåô½kÃ~³¹µ“ûNÍÚó@3(' ˜s*.Õmኃɩÿ°Ž¯ákøü3¬‹™å»š9\Ƨf Œ 8aÙè9CR‘Åk-µµÑ ?c…f$\Iksp ÃƒÆÆ+ü<íÃnöûØ£®êú_Œ.´Èïôãv¶( ³±¶Þê¬2…xWáŽT/@¹Àæ­\ü.ð¿Äý~ÃHÒî/î!´ùõ[¢à¬l¡šWÉØnÓœp{|ÕÞøgQð†tÝ7Bð³â Äê"¶¸Õ¦†Þ„Ÿ;9±u26 ´Žç*<£ÓKÙÆ79¥ ÎZè)ø“§xËÁ~#MĺÒ%¾‰÷Z\Å,R.ìᤉ°œ‡ €J¸ä“Ì:OÂÜÞÚèWL–1Áö›‹}NClê©–x³0’«m*¤yy}ÝMñä~8Uÿ„ÓMÕ`¶¸Ú­5ÂÎX´¥ƒ4S+®T…ÂíêA æ¯x—PñçŠuMB-¬·WBe¿·bE’8ZeKtŽ5ÞY£&ä]ª‚JJZ[b–‹Z«Øæô^¿yEçÅK1ÇÍ’)Ö1¥Œ|Áp®Y•[9ùAÜqº|;°ð_‰í5ñ&¨[Û_F‹”³]2*›íRC,‰— ´ÉµÎà­Á §¢XKá ÓÅ~ 6V³\¯œªF³‡@Á:¨.ì‚ÛÉ9 €sþ>ñ†î´[í'Â×,n¥IM½ô,¯‘#üÆ#æ @,01 Ôp¸šð•Jpn1ÝÛEóØRŽŒ[³}/^ƒÃ°ÜVÅée^_ßÝŸ&ûvвƈ“ « ­µB±=ÏÁ VÐîüÛYSM,­yC÷3ím¨»"[%”†ù‡Ìx3yM–±½«Ø[xƒûE®-¬R I5W2oˆ9#ËÜÊQÜŒ¨($W²øOÅv^Ò.´ûDLª>HÄQÿ ©c07¥‰8Àl°šUœŸ)¬ð†±zÕþ©{o©®‚ »%À»3’±Ç( “ÕÈrËFóD2Å&¥©Jú•Ô ]O0+±†,1“¤ñÎðÇÃú՜׷ÚTúämöÝ^J°+)Ý"’ªí¿vÐå‚ WÔé®>ѧj¦ÆW¹·>\qB%>ZÈ1;W ÁÀ¬TÛÐäjQm4ix_D¶´¸]AžGWò†! €@]¶œÉÏO¸?„šOÇ“7‰®ïå0Æ À°+ÜAm¹ Ã!pq÷±Æ0¥O>©,.Ön¢y<‹yÖ4$˜‚À6;ôiô®KãêIáK 7ö¬L“C¦Ä¹bK¤à  «ã‰ÚrkyE¸£¢‚–ŽÚ÷ú¡ñí”VÞ#·˜¥Îm ™£6¥U˜r¤¿ð€[œðà·)ãÿ†1Xhñø¢òÄMu-Ú}¦XT¥ĉ“æn'<¶H«$/öÝX[½¯Ý'ùŠÌ: ƒò²€½sÈçj¿SÓŒœá¡Î~Î%½ðG‰$ø¨7‘Ó¿Ø¡Ô.ÚUU#Àv C"àßÄ9oKñï„nµoI*Nâ;[x£–y TƒÌïu>X$ƒÀ*=ó^qâûÛ2–òø\O¨ßÚjðMiikmæZÚ 7ùáŽÑæ®Û7¬xÇ´èÚ—ËJÚÙí/g@Úœ1¦Ï$áŠá :åã'æÂäÒœÛvŠ2©N5$Ôúêyÿ„µoY^\xE-còغIGÎ ‚̓ÛÓŽöç~ËÂ÷¶¶ió&iMŒ®qÎHÁÏPO>¼g5cNÐN‹=ý楨¨ ]¥J€'Ýl‚s°ܱ9çŠóŠc¹Ôn´O ÜMåÄíos:¸Ù.ÓÎÁ’WmÈÇÝ4üNµ¸Ö-®<1g¥ÙJZúÖî7 u¼.ò72±\|í€Os‚+ÖϸK“Su]H¸.­òü­«[™ÐÆTTÔ3èµ6µ \¯†î,nJ¯’ÕÍ´lÉ“” †ÝÐáòr@`ÊÇTÓlíì"»–OÜÀKKsv6•‰{ ‚Ä6È#†ëþ4C{i¦O}àÖ;ĵ?h‰Ë¾ÖɸÆà®Xæ#–ÚÃkýì×ÇÚ¬^%ñ5ËO®ÛßK$#c ‡•´r6·#éþ5Ád‘Ï¡9:ñ§ýÿ¦Ÿ=άÏý›46ÛûWñWÆ_øGOÅõìz.«j4ÔI@ùIo-÷Tã§lóT4?ˆž ñ]Ì·:.ƒ}3Gþ‡&¥p V(–Aæœ6v®Nr5æxnx¼˜R'žuOžg¨còäùàã8ȯD›PŽS œ/ú-˜·•¥¸,òž>v9d“÷B‚@8ɫⓔbiÑ¡Wžêïk¯»cÏÂæ51“‹w÷sq#G(’ÄE2²³ pv ç¯Â÷5ÐXkþ"‹NŽóÍž)¢.!DùT) ‘÷HÝœàg+–·MA&†YØ¿¼`Ã9À=}¹"ºUÔËN–ÕdXxd|¹FÁtá°ÇõÈÍxÒ·-™¼9®õ×Ô· Þiš$qÝÏ¥ÿjÝî(²ÞÞ›©·`p%“î ž|¡¹ ¸"¬ß¶³¬\Ç{¨ù²¤Š¢D(I?wåÜyê7ÜcYɤÉsÿCífC¶7ù{°s÷³´ñÏn¹¶N¬—š£CÙuÐaEd[°ƒj–8Û‡$ª1b>`8#›Œc$Ñëá¾l¼ÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ýü¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ â4ãÿHÔøxÿûÑGüFœéƒÿÿz+ÒþÉÌ?“ñ_ærýwÜýÖ¢¿ üžOüãSÿ3ÿyèÿˆÓÛ ÿ‚jü<ýç£û'0þOŘ}sÜý×¢¿ â4Ö=?àšŸù˜ÿûÑGüFšç§üPáãÿï=Ù9‡ò~+üÃë˜~çîµøRàôÆðíQÿ‡ÿ¼ô¿ñY?óoüÌ_ýè£û'0þOŘ}sÜýÕ¢¿ ?â4Ù?éßù˜¿ûÏMðzQÈþ ¯ÿ™‹ÿ¼ôdf/ì~+üÅõÜ2ûGî­øX?àô‚çÿÿyèÿˆÑÉû¿ðMŒÿÝcÿï=?ì|Çþ}þ+üÅõü/ó~üÝ:+ð°ÿÁèØÿœmü<_ýç¥ÿˆÑœôÿ‚kÿæbÿï=ØÙ—üûüWù‡×ð¿Íø?ò?t¨¯ÂÓÿ¤0ÿœmþÿûÏHßðz1Q“ÿÙøxÿûÏGö6eÿ>ÿþaõü7ó~üÝ:+ð°ÿÁèøëÿÙÿÌÇÿÞz?â4sßþ ³ÿ™„ÿòžìlËþ}þ+üÃëø_æüùºtWáoüFŒßôÿ‡‹ÿ¼ô£þDoúFÀÿÃÄùOOû2ÿŸŠÿ1ý{ üÇîø_ÿ¡·ý#dááÿï=#Áè¬:Á6Gþ/þóÒþÆÌ¿çßâ¿Ì__Âÿ7àÿÈýÑ¢¿ ‡üŠÍÓþ ²?ððÿ÷ž—þ#DcÓþ ²?ððÿ÷žìlËþ}þ+üÃëøOæüùºWáyÿƒÐß·üdááÿï=!ÿƒÑÎ6?ó0ÿ÷žìlËþ}þ+üÃëøOæüùº4WáwüFˆÿôüÌ#ÿ”ô¿ñÒ6GþþóÑý™Ï¿Å˜} ü߃ÿ#÷BŠü0?ðz Ò6‡þþóÒø=çðíµÿÃÅÿÞz?±³/ù÷ø¯ó¯á?›ðä~èQ_†?ñûÿÒ6ÇþþóÓÇüx§þqÀ3ÿeƒÿ½ÿ±³?ù÷ø¯óö†ù¿þGásHN>÷¯„¯%åmÎ?R§µWÈKwãÕM}êÂW}žxŠKvbì9É›¼w®…|ª®7@øaLJð& ¤jÙ=¶’iýOü¢úÍæ “ýŸÖ¸n•¾žפËC¤NÀHˆâ¯Ûü%ñuÌY$£Ø¦ý)¬&OH²^.„wkï9áz/ëJŒÌ>àã§×·ÁÏÂÁF…/?Þè>µj/‚ž3‘ý€(n™oþµi»þÃ3xì/ó#‰ýópTSö@"»aðGƈ{eÀË7Êš~øºÓ—'¨8«X Twƒ#ëØ^’GqýßÊ•"y:FsÛåë]<Ÿ¼K Äö¤c“‡ÏéùþTÇð~¥l…®-d@;”š>§]nƒë4ZÑ£Ÿì0X{S–ÜÏ·jÜ‹ÃW³©’ÞÊB d¾ÃåREáé™w˜<M5…› WŠê`}ˆ1FI>¢šÖftoC×ÒŸ NYO–N9ÆÓV!ð|ÌrcÛžOjÖ rЬùʭŠ(ù•ÐÒ 3Õcl}+²¶ðs3„òw¥6oÊîQ¢ ³²‘“úUýF¥‰X¸w9´f ùPmðq·?C]cø:RØÇŒ“Ž)“øVuLHöÇ?Ê“ÁM bàög* Ýþt‚ÝÝBk¥>”2®OðŽMD|<æg…”™4}À=3éPð³KbÖ&,Àû8î§ó¦}ŸutrøZâŒ×9ýáŒþuZmkr3 ìaþ±¸?U˜Ö"/cÈoZ zdVÜzC18Sùf£Ò1U„œΗÕäR­Ã(ÿõÒllà ÖËèw%°pî1Bx~ä¡giì d𕆛èÚ&/—)?rkf=i–am=i²x~H†U ü1CÃÔµì?m'$t4šÒ]œýÆöÊšdºI@sž;…5ŒÐÕH³Þ¡ðŸ‡íNE³7]ªÜv—ÄZ|CкnÍ]Óln5]N=Á îòÅÅÂÆ¤€Iœ…ŒžOŸñ L¾øo¤é:Ö¥6™¨¦³ÿðøwÄ6òÛªqs7 Ö­ó¶`»#Vìe‰ÁÒ|®Jý´ÿ‡>B4qu5Iµó3ÚÚH‚c´@Jb5¼Rìò“wQòkgá—Ãï‹ßüE¨xsÀ?|c«6—$k}w£hj6ð³¢>[1*ä$ˆÅA,7tÏß|eý> |Ô5øŸÇ~¶ñ5œ‹¾¨Zj°<Ó6ñ§ˆ<ám/ µÞ“i©|[±¸¹¼» ÒÞÏKcp.*L&8ÑAó$¹Ëh†<+£Üø/㎅âkÛÕ]h^Ôo¦¼ÓüÙWR·»JºÅ,Œ­Ñ #ËY÷¶­ìéŧæ›üçsÐþÆTéóÎWôkñoòµÍk9´íNÝ/m.¢ž9z>ðj龓Q—Ãßb¢YæYJ¢§V¢æÚË]{isž9V:qs§nžŸòÿ‚ôÛ·-àƒM»ðrÝKpó™¹+î¹è}릂XC„ O/Jöåð£Ø=ŒÕ±OFr¯ðùe@‚åp½ÉfÇר×áÐnd”7$a”’=ús]c¡è¬xëŒÓp!UN?ˆö¥õj=†±Uí¹ÌÍðóOeÌ— »®å\gëš–/h¯¾Wÿ­]zXi¤ÍtúÆ.£‰Ú+anÄHÁÔ*ïè2¥›$q·¨ª; 2FÈÝJçúŠˆÓ£)>U·tT«VQWfð®ŠK4’¨Ç Š_øF¼?œI fÇÊ ¿†•n’òâs€~àÈÇåIæ1lI+côæ«Ùò¶©ÜÀÑ[’éæz…¤“ÁVäȤž§ýknKu¸9Pã #ƒÂikºñ³€>v#½”/ª¯Qu9Çøl—ªÌ„“œ?ÐU9þß”V°@gµÛ‰q€8#ÒæÊØ""ïÅ E•ã³3ã‚hÆÉõ?0í„p޽Ï~éëSèM7‡üEiâ­ÝõÿG“TÒ­î‘rÇ"ä\ã(êêGNk ëð`²8Æìü«œã¿þº•5«Åzgʃž:äþÕ”*‘´£SHƬâÏDøûFüiøÃáÍ7Á_¾#ëšîƒ£Iö?‡nu #Ó,Õ Hí"d‚$PÌB.Ðp¸˥Ƌ/Š®üUwðßÃÒÉ2§Ù­b–ÖÖ¥Y[rEÊf µšFrÁÛø°ÃõÙ¢w‰“¿…øž=¹üj”^]¸ž;Ùºüì²’=±ž~=½+a…Ž”é­;iùû\Cw”ßÎìíüiâëO/—¢|*ð߆aù¤èWzœ¥þR6°½»Usƒ„ ApH9š/‰†ÛFO-m© „pÅ †bT Ì\‚ìXóZçÆïxó[±Ô~1ë2|C:s–ŠÃÇÚíåý´‹‚»ûJÉy ÆêsÔœàä›Xcdk‡/·’zþ¹þ@U)„.ÎËe‘Å#Ul‘ïÔWŸ<» :pŒ_§ùluÃ]é)7óÿ3oÆ¿|¯Àšf‘ðSÂÚ}¡%{¯M©Häí#ÊÛy}qF1…VÈ­›k­h÷7‘$D¡Ê'›æÜžj#ÏéCv©ÛƒßœçùÒnKÍ(d/»/Qý*ðØzø}ºóZý습aYk£&“ÄöòJ!tv?t7”\œºÃýzpÖÚåVÎÑÁb`*W¹ô÷ëPÁáX$gžUV'* †\¹ê}é­áëxXÂ-AG#Ž;ç“Åt/­_[XÅý_K5þºb‰ceV(„6}‰güšŽæóÄ~SEknKô§„ò~ªØÇNÕnãF¼e?eÔ6ÆPlY¢g*{wÏcÖŸöY–”†ªIe‘qõù‡jÎTªMë&½q©ÚÉ3-u]rJ+-]¼²T–¾MÜ÷lñÇ:Œö­k[›;à~Ér“óú¿*Í/'šf–“Û#ò¸ù²Iö<úÕžQqÂcÌ „Œ û¸9öëSNSë&åw×R¥ÕéoK3‘&b6ƒÔúûzÔ±\Ú# ê=O©®fþÂk¢“^j2ìD;#lø<c¾ ôëëRMâExd»i0bŒçyÇ`A< ŸÈf•\f*姘㇥%¬Ž¶)§B Z”×1Ê  ìüH!xçñ¨¯5=GÌŽ'h{HªÍ’/\uÇNsXš~›4Rùé<Ó+ <¬™È9##_^i“i—7Œ³ äIJû¥v Àäã§=³Ò³öõêS³ƒMökóÑ¥NWæOäv>#´ð密-o¼ãÿêz»Ú~©á›;kxÉ\¹Šxî¤g ÙPZ5Ü9;ÎÁ«kìÎo57BÖûcO³¦Aüg“ß‚*¢&µ˜ ªÈ®ìà÷=sÓùóZ6–÷Ïn3où‚«dœúñÓ=yüV4p’RMÔ¨üœ´_©s©åŠôDqê [@.5¶]ò“}[##?*¯×jý¦­ ´[¹ï–FÈýѵhò\ä’3Ï ¥V–ÒxÀxÙ•OP„ãéÛÛµ 02ñ¼O*ÈØ={þuÕO ìê)sKÿ—å{~œe Y}Ëü9µ­"\5´’;Ïüz8ÏãŽj5×l@>Z;¯:BÀcñÕ8’'”?Ù”0å+€qøfžòÝd’( %rYœ³sþ~•×í&Þ¬ËÙÆÖH'ñu•¬ºÂðˆù ±Œ0ã¦HÇ^õËê¾,ñɸž] ùqùDVªx= n íÐòzqÓ©WmgävEáO½©°ß@ͲzǸaG圕ÌÂâ1qQöÎ+wG÷' .þÎþºœå‡|a¶4º¶I@¦mŠÓŒý8<yÅtZwŒ¡Xä²Õ,dy6ƒÄÇ$áˆ=FWpqÅ'ö…¢9™bMÛ~ò&lç5± øâ‹ô;ψ>ø}«ê:V”ou}7G–[[rª„’"•Œ€Àœ‘ÁÕ…<\4m,LšókþüKu!RZR_"šZÂÂo¡aD©g Da±ä„TÞX+’ ñŽFsC,R1  ÛÒ½¾SÏæ+Egj‹´F¸ü¸Q‘H¶HŠ#·o-$ sùUÅXXs_ñþ qûnxÃÅ·~&ð¯ÅÝsM±i$p›¿!™%½¾Õ…¶ —žK1ù›É£žqeá0ñŒ_Y_þÎê™f[‚ib*6û+½oÿÚ~Øëwk¥xƒâ÷à FöE[M:M~àË2á™ÝWìà°P­<ÐfŸ{ÿ%øsðvÆâoÚãþ !ðËÁWÒAçhÑÁ¨»Åv‘ÞäC´.FY<ß¼2£Œü1ñ'ö¤ý¢>;¬V?>)kúâAÉê×6W "bX*¤‚qòÐ y¶­«]‹å¶†¸¹Ú6y™;rONx$ÿÀ½Æzþ«Ä“…ñ¥ýØ«þFJ¶QZ/ñIŸ _ÿà™ÿðN? Xj~+Ñ¿à²~¹Ól ‰íôÛ;íBää‰/S$»p0ÙmÛÍyψ4?ø"džVößMøáñûS¸ÓìI?cð®—_܇ Ëwm¡f`(Îö +|‘a¥r›'‚4Â,~VY¿ *¶4¹æ>l’¼JÎX,s0Èþéç§µwÓ˱ӊrÅT(¯Ðç–+ ¥¯›©õ•—àˆ¶ëŸ…_´w‰Å¹ŽmkH±Vm¡¥Fò¾|g*Y õ; cƒñíýðçáåÄš?ÀïØá&“c ÃÛé:漚ž¥¨<óL.o%V¨Ü2H Œð;°¦à,ï8E@ÍåË×CõÖ®ÀtèG˜‘UðÀí$xñ¡å ¤µ­6×y?Ñ¢á™JмiÅ/(¯Ô«ñ/âv½ñk^ÏáÝ?JižI$ÓaÔÉ€ ç/Aìî–dw…™¥eÜe|…ÎsÉÏCüúzíIwº—þÏ+q»œnÕZïQ¸¹‘mtØf–W˜"A®XžI?(ÏÖ»#‡¡¥)Îv[¶ÿà˜ÔÄׯM.[¿ë±œ!ÕBÞ $E۹ݣ0Àô>µµgšæâ}^"ïÅ^Œ;ͨkw$諸1£±ÏuXôìI¥S0ÀaÓö“JÝßôÂ8\UGx¢ËiðK8ŠINBcås·òõü3ÓÒž,åXÝ'¼¿?zÌÖ5Û fmÄö´0m_¶é²±Mì Ûå\$S¡~fÙ°g³ÅBºâjA.£ñ=´Hc/³Ì\õÁ9þ¼~4¨f¹v&<Ô&¤¼šðXªO÷‰¯Tjµ«mhåVùÏ 2qøÿ…WwžÊI Ê8ÚxÈݸ0í׿²ÛXžÆw7È;|¢6ƒ“»zr:ÕØé ¼IâoÿiÛëQðÎ+°ð¥ïÇ [­j-kV–k&+)¥MæÃh¬¬ÆÊù m 6è3Çms¯øŠêèÝëÊé.\Í%É‘I' dõã?áEíë”m¶Õ”ÈTȧ®p@לžzW‰_ŒêÖI:1vîÛü¬vÃ)„w›ù#É‘™Ü= øÔ&+Ðå¼ÒÀ±bªÇjºÎ…eÇ©”3•C0kõÞKŸ%Ïä@–ò:Ò°Ú1Œãó©U|¾ß"ªž”6[‘øSHžaÀª°ý+пg†º_ÄÍzK]SLYmQÕMÔÌd‰‰2…ØË![†ã%}A™zš}ÂÍqš¹HPã ðGN•èŸ ¾3Ò5Yõ{5–E´†ßN¹Òç”çlÑI7—å<’D¦@ÊWª u1Ëù®S*4±ñXÅÿ?ÔúÊ‘®ðŽtž½?à#Iuw©js}z­<²î“s“´tçüú]±Òm‚‹›«¼’¿(\|£Û9ãŠw‰~x»ÁÂ;ÍsÃ÷q[¥Ôo˜dc’\|§ nˆ!†Aщ/-•m•KÄT‘ƒqÏ=+öŒ-ZrŠpIÇ£OCãªÅ§fìÍ–¹´‰ I(zóÍD,l.¾ë噲HnIéõ5¥‡‰£*À ÿ‘V#±X¡XÌ*Äp¬[‘úWlyäîÑÉîǨô€[¯ÈØÈãjñŸ\w¥,ï m#¨aŒqD 0M²²“Œ1QCéö²¨•²9ëZYÛA]'©¤w¥%„!H'œúúô‘DPÈ D× àpëéÖ¤ŽÎØÈ_¼1š¹¥éÿÛ:‰Ñ⸎ <Ÿ1|åer É#8碹qxŒ.‹­^J1îiJkÍB’mö3n4Y¯È¶³p æW—ÔðH®ò×á·…Gƒl4OøGOú%Ü·3êj€Ý^îyˆÞ± ÆPİ'iZÞÐlì#S{$htuž$”>l)Ã(d)È#¹¸®¦ÆöØÙd"M£ÆN2F9ÎÀò¿+âŒöžgVÃ7ìã¿K·øÙ#ërœÂEº¿üÃË#²é†Þ¸:ÈØrsÞdtÏ?Þ=‰ÂüMøeá?øbm|K:ªÑ›¡ç# àgPÖ½CQÅŒRHne‚4 p‡lwÄýÓ–Ç¡#¯A^ñÒßâ[jCRñ3=Þ—…QàbÂ%$#E¹C6Ü Ü/Ì9ɯ£ŽÄP|Ѫâžï}—Sוu¬œnsþÕgŸP2܈ÃÂIp£ƒòüÙ€z{ò;ö— í5‡·_b²kI¢`ñòùÁáC®ÝÄ‘Á'+;×Uð:_…:·‚M·…´Õž{vO· NÝ Á-ÿ-_†`¼‘Áã5¿âûm3ÅbØß[ºÚE6ûWe••NxC¸8Áí‚ ÈÎÙŽoK…N;Î->n¯å÷nqÒ£V•f›²ÚÝÒlü[ã]=4«ÿyš}›¡·Ö5XV(ŽÐ¿ºWq!$„ùbˆ\ô GK©~Ë^,žæ c@ñª”7ÖvéqPë½LÊÑ«áwm;c,BðOvž6×´x8èÑÜ%µ³:G"ªZX¶ínUN3ž3Ž23­mà±Õ"ºÒí&†æè2«„ÜHû¤.=¸Æ±^&ìñ©òówOþí©):\²³·f™‹âÅÚµ¦Ÿ÷„¶û)[U}1b“ ÆæId;FÜå€>ãv¿…þ"Zø6Ðø{Ç7w6‘A }–ÉÒ ä˜Ö%SåŽr\d×nu,µ6{Ï"[5–RAûb"–ÏCÈmÝNqê3Pë^ðߊ,Lñ 4q2›V‘B²!a€#î‚1†ç’Àú)g5g—<ZiÇF­tÖ¾w¹ä}V›®ª&Õ{/x[™K¾7Ü„'*¾¤Ýý*Û6ù„–÷q¦ÝˆÉ±reIL2“† ƒŽG8 €G™ë:ƒþévqͧx—SŽi>X—Q Ñ®=ce}¼` ‘ֺχ7wºŸ…–þ]R;°ó³D1h”gÍ…7'®[9>mu‡ÖxvùU´’W»ó[ýÉ[ñêJÊʧ]š:Lnˆ¥òæUð]r¼¯UÈ?6:Ô‚%Ô X¢‡'kWÜqÛ<Ý^;Õ u¦ƒýž<—Á‘YibÁT•#8Ê€:b¯è*Ôt ÛMxÙi÷sÚN²„¿´C4c•I’I Œ×+•LŽH Ž€ûŽyª÷×jeYö °ùƒwÁ둜wë€;W5?ÅEþú‚kɵþdË&¥ög÷£›V˜¶9É­h­ï‰­µ–•cûYÁ‘G˜9( >s‡$à`Hç *ìº-Œw1»[̦L—Œ>90×’1ëÏZÚð¯ÃŸëKsÿ 'Äë/ Z›YäzÖ“vð¹^möXæ–‚DdsÍuæA‘q_,-WìäìÓ’ºNýÕú_S<> ‚®ªAs%ÙÚæs\êAZþIžCe 8Á?x÷H(=­jiw—+]ylð¤XˆÊǘÇG×§¯1vú—‡µ'°´qp"&8djÆÈ ÚÙeVD>êgÏ}mBù 0^$Pˆ †Þ=ÞDJ0£ J‚NÇldO?˜eï/ª¡í#8½œZi¯5­ Šx˜Ý¦Ÿf¿« ñU‘“Ï·½ÄPL9 •g Ÿ›Èl“·x5çhþ5Šð–³å¥ÕÓݶ›} ßeûÉ@î‘¢»ØÛã@­ÐÎÑåc"ç†’Š¿¡ß†—³©w¥õgû9ü=}JÝþ%O¬]ÃwMµ½ª²E8DWËg–SÂ*9ç'¥zl‚8­ÚÒÉ6ÛÉ7(# ä·ÌÙÎÇ<–<Ž9&¼WÀú—‰>ø¦hšÖ„¶×÷1‹Ròw{pŠ!Xì –'*Äc¡eá/‹Z£Eý¯ãÝ2ÆeS,‰g§,‚æämß+‡œŒ~½+“(:~}µÿ/Ô¼u*ŸXæmYìj:Û"îwóå„ìX!åß°àdç•!”ÎÓZièÈãåV*Û׿=@ÀÆ:æ¼`|s¢iË«xnù5FC‹«{ˆ–7hÇ%‘Ójîã¦<ŒV—ïèþ8ðä·ö4SF§í292D@áA8-‘·g°<ñ]þÖ ¨µ©Ì©8ÓæÝöEËZ. ±î.…AžO¿ ‘QkjÂêÝln÷ÊKesœ`_o_™&£b&h…†ÖbWäÎÓžwéšm¶©ëIer4áÀEGÛóy 1œ »O89Ê“€i½R#•Øçµí ÅŒ!¼–y®‚̬ÕîFH#ùúñSx*èxjfÔe¾¸µYץ⒧ŒåGÜ㎙®˜¬S ǤÈH)åø8*95™®éw„ÁQCE< ÌÎÄî\ƒ€I8Ž™#¿Ÿ´\¼¯fa(ZW¾¦•çŒ4ëÛY¡[åfØÒâä©CÉçƒ^{Õ=?V´yè»Ê÷>pÛ‡¯9çœtç5—âw¸Ó DÓ!–UÁv0ϵb\’0G=CÆ}«3B»šÍ…”*Qc60H`ô÷»çš ô°:²Zž¥}¨ÝAmo¥,L— vU²'+‚Ž+ïíKKiüÇQ®-›³`1Ç8ÉÉ'ó«–Ðj’_>ˆó2\°Â¬YwY£#*ÊFv›ž1»oxŠÞiìuŸê,Ö¶òK<î<¿'æ’IK ¬h¥wcîäNp¾þ‰k`pî(Â2jÜÉkùëcÏ–ªsNM®×CÑôÛ–cqwL–)K™×Ë”†A´¹Ë»ïÄ!¯ ¼³½õ…º[Àà— Ì7 ÆF¾ïöj«I¤‹u–Öú19‘¶G$«'N€Ÿ <œc&ît‰²Ó¼ŽYvȬ¿{Œqž ò 'ÊÄæ¸ìn•êɮͻ}Û4°ÔŸ»»FëJÏi9k˜æÅW]Ù¸ 0ÃÔó‘ׯ¥+‰mõ- ìÝý«ûB{œ˜!Ž4…6’¬9RÄíU œC`‘Н}m;i÷PH!UòJmS)*:`þû§ŒZ²IáëB¹ù²=3Éëòñ¾IšsÆ;­Ód‹JHÕ-c\œ n#F +À'æ •qϯ7SÄ–öè·ckVSì¼ qצîxÆÞvê{v¸w´´X¢3†`«åûeAÀ#§ÇÕö°­Ö˜d{›£‚‰$‚1ƒ´|¿('A?Ðsе8¥¡¢Ä8ÇDu7ÌúîŸóZÀd‰÷‹à€É8í.ʹÉl±É#;j}Kâ'Šd™Xñ\óòÐ ®@ÆÃ•SÔ¹ nàô®%.§û$°ÜȆ%‘CI'îÔœàe`œrI\ã#Þ¥ó$”4pÝ8UÊµÊÆ@E-€~Q¸äñè1ÔTªŠÁõ©­Ž¦úûYñÌš¥Åä0}¡÷£P7¸…À, r[5NòúÐÌaŽ@ìˆWr6àˆnsÈǶAÍdéSê·-6™£>¬![Á$€‡*›»È‘Ž‚º„ðž¿âyÚØZéßbHŸTÕ¯$ÐÙ«î*˜}Ò3¸8ÅO:dª•&öÜΖ)cØZþ$…§ Æe=FI1õíÆ¤‚ßPØdµµ&|œJÁéŒïþMmÃ_ 5Å›Ç)u©¬X"·µÓ&†cÈdTa[ðÙÀKak|a¬_µåÀÓä[Ûé'Êb›¸Æ Ø dã'ßYßE åµ“·âu^Ðì´ÍVÏU×5<Äó€‰4olÐ*²’[,O+òž9b@^j:“[^hÚí»5Èk’Ï*–€—V1·ÈˆÍ×`¨'xb<ÒãPÖ5·§’I®ˆÒ’|Øv†l’p6î î:QolnîZYåËM vYÛ~O¾9Ç^ÿ5?t¸Ö²å±ÑëižSe®Û'Ú­bi%aƒh ­Î1·¦0G5ñ‡- –×X†H¯[(§$3®X¨ŒúðN1×Ò•Öƒg¦]ZêÖÖÚ|Ó+“(RêAÜ ä^Þ˜=ûÓnô ?ÄOyq¥ÄHɼx¤ò‹)à–ØA~ð9;$ô%~†‘«hÙ—µÛŸÉáË›Y®oa•‘‹]Å8€[&Ò”ÉÛ‚FÒGÞÎx®;ÇŸ´†‡a¨É¥ü;ðÖŸÛÛÆ«<rÉ…Œ#™ÙÜ’ ;ŠƒãBßá÷‡ZÔéW?lu\6MJS°Ï;³´ò ç2jO‡~O†“ÝÙè‘Y7Û%EmIô¨&¸…± '„½«Œßo±Ž0Ä®šŠuiY;T*ÐŒ¹æ¯ùsàO…Z§u¼ÕÕ•”–ï4Ŷ9¤;U$l8l‚Š÷í.ûSJÓZ³®ßèwwÂçºL¶¶b=ñÁqçåFAv“ç˰í_“¨^O³ì¶lÜ…£ ´’C1r1ŒäàäääýÕ©ƒ’¶¬ÐÓïôïÛùgÄñÛî†Ižæ&ŠB£pÄdœ0sN21›âËxu—Ó®¼1$s|’n²´"o•v'?0àõê2~REs6I©êšž¡­YOeo-È[y¥ Fë½vJî6®ß±eïò odkVº@¼½žÎÝÖóÉÔ"•e’(Ï–Î’¢Y#*vÈWm¡˜"ÒI2ùfÕÖÅm[_±Ó/RÂî2adÚµ´…L¤AÚø$yÈã¶21ÎC –:º%í¤©šèÆ8̆% H=HàõéÜWàOø;ÀÚ*ÏoáË«¯F¶¿´)k(u”H„ÆLô8_¼G`Õ•ãÏj8ñD¾)¾²'TÔsíuÞæ@U‹ g’MÌL§21v$œÖ’‚нÎw(·­Ì h: ~Gˆ5kU:´ä1I|¶·Š&–"còœ gk§¤nœpxñ'Èid•Ò-í•S5ijb=¹y-W< ñwÅþ kûí.ãEñWÑÄŽþ#Ñá¼{ ó!ŽeýÓmŒDLyY# B²ñú…¾©ob-u[â¦c¬,>6ðücr_£€=ˆ«&¥{QÅï‰Ôâ!ÞxÚr H¿Ï5’ª£±­H½¨'°¿ -tØí$Œ¬omo;lÀ;~PÙ+Á'°1÷y¥¹òíôÙ °rQg¼Ý½ÜÀÚ>U8çת1ÜAÁxöo.Áå‡bSnÜÆNÐ r=zYŽî=fÙä{Dy#É2Æìå³×§aêxÎhS‹µÌùŸQb‚i’]FUÈö”vùr Ïƒ=êßúU˜Ä˜Æ¥ r#vBñŽ28Ç¡íÎ=»È­¨DÖñÊA»™Õ˜ ?6UFÒp:‚H=sÓMy ³ÉÄ ÊÅngî7À==cŒu6ª&ìÕô,+ÜÍx¶²Ç+‚°¸Àl°Á¯@¼g8÷-Œ²‹†]™,Çrp¤)$ãqþQ›öÕ6¯ In[åUäc¡ùGÇ=½y&†º¼¾Qm,;Óª¬Ø ÊþèÏN˜#µW´QV±WFÂjw =ÊÎ-mÒù¹ Œ¯vÉÏ˃’=ÅRÓ¦7³jUÞYÓb¸9óYúíÛ€ >Àó’*yÛR¡gUò‘4ø!BîÀμƒ¯8îj¿†uýcÂWÖÞ%¶k‹]ZÎêAi8Q”V9 eq÷$!âÆA¤¥Íä>Vv>4ñþ§kákmG[Í9mäÙ{ŸnÑïÒf6z³'×µ7×-õÏEöÛ•È}!q2LÏ#Ec‘æ³H …Ë3›<EwaÞ[”Œ" ˆÚrDD¼NÎá³ÎA¬ÜŸrç99nné^5ñ.—ª>¡uwa4÷ÉO{ªé°Ý´dVjÙFñÔ}à]NU˜[]³×/ãJðµŠÎ bK§¥²Ñã’Ü,Ò—qoÝ£å ÌW}x9ê¥Ð5K]&éï¥7PHç‚™TzA-Œd sÅS«>KEÍ+Y®dv³›áK‹8ÒêÙJ&wþôjX©o½À¨çŒWu †Ô‰<Í ˜Òî+c”s½Âv– O~¼`Pß}·PÕfí ÷3]ܲDÑB¨¡T? ·;€EÚmÁ;¸¥ ’8ÜÖsEµÊ±’.‡vÁûÁ” ôbFÒ‹nJârzfýL1Ø-´™ÆÒ)PFí£9IÛž1ǶeMrÛO·ym'´ŽHW÷±E!wcƒèyÎy#$ðxÍ[V»…˜e0\eeN8èO±&¯èžø¥ñ/P¹µðΫ\k›Ï²‡žWê^BOÌØ$1bRI#е9w5¥-˜Ûÿ¼eót Îì΂~P2Ä2v‚¸9 äônŸâ+»Æ†Yc³ÃôœÌY³sÓo`9cfjš?Œ´ »{Gº´žVWxõ;C aoºªá= Ü;f }sRУ‘F›nЗyî Þ]Âco¢3í¿=@§í”V¨ëŠ©c³“Æk_ÙÚTöí¶6+o2©,PÉ#m —jÉ.ìe‰X[fŽHî£YB¨ –±¨ÁdbˆÏ…$+`²œÎk˜°Ôõ¹â»ŽH|ƒt"ŽêÑvr£ÈA¹áC Š·¦øƒXµ°kx"ŠÚ†ÉÔ™ÆàÙSŽWï–$ŽAÁÒ5]¶-6ºö·¤Y¬sjRZ¬¡â¾›Q¸˜°P¨ŠËÈ€:0c8âkðÀ³AáÍA`Žâ6(©Èì™l0¦z„ãÀhÒøžþ #Ã: ———·‘Åo·óbÄ䱂2T09㊞%¶žÓXžÏÄVOizŠÈñK.â¸'+¸>F? ¥)=È|·»%ÒµrXaÑa’p8HæD2Íê<¡lñÆÞ<Ôúºi~#ѾÉs ý­ÅóGz|¦Œck! ’r£øðz6v¼=àÍâ7‚uG@Õ%·Õ´Iõ ý>öeò¯lÒ0_È(7,‘òÅpä¨Ü í9ç$qm4óÙ²BŠÏûÍÁÙ£ •eʲÜãÕ°@Ö\­4åÔÅ·­€ëÖv{(™®`WkrÃ:0 œc?7pK¥ì¾Ñ7æ?.åä“ É½X)çæÁzc¿.ÖücâßZ,zï‹u+èìlþÅf—š”’m“.*¹*±Œ’±c y“˜&‚â`±Þ®U³æ çnSŒ/N¸ÉϾkWs>YôFæ ë>,½›Mð퉞æÖÒ[¦ò£È1GûÇ9ÆjnvbB…GbF8Ì‘ž[h¯/—;ÑÄ· »—q=Ž„ì|CáË}BÛIñ6¡o í¹¶¼K“Ï0´ç pÛ ©4öº}šI6™ö¡u)0ØÅ1FU ÎHè{–Á œYšÐ„•Êr»É y‚Mè¢(䜕±’ÇŽ¸Ï >µ»£x•´;o<ÍnÆuhŒ-à(#–#‘‘¸0Ãä¹z½Å›ê_Ù–ì° H·Yg U mãïϯzlåÝ‚;„ 9äŸBQÿ¨çHÁÉó4¹µvþÍ„5Ò\G!6ì¿ u]Ç*1“Âà‘Å—672½Åž˜ð+)C,æÏ=CœtóŸ\$ºïÌSoša….; ªØbßNâÀv4e¾½ŠÑôµÄpÊα¨a#'#€;{œ˜áÕÊömmB6žÞ9â!Ãy{9!-´å†áÏFÀç© ·Ž 'S0X∣‚錓œðp:N=6æ – 'x„GÌŸoîÊ(f“#îñÛƒŽãRNŽ%Šìv(xÔ€N Ϩ dœrw¢õì·y¬_ÜÝ\4WF$•ËŠ2«·Žƒã?<Œši$‹ ±ºÉ<…[sänÆz{‘ÐV$ŒC*¢Ï± |ž sŒ:[-*âæ)%K(Ý–!sŒäœàõx}´´ØÒ1+Ý][Çk(¹·IÀ%“æÇÞŒÎ3Æ}p $¢æ<¬ˆÒ1fo(0¼Œýj8ôûËÀåâ°19!Júø~u òµü¶þ[5´@æxT& 3.8ÜKî z’Û³ƒÆbÓEÂ-èO£éž$ñN£k¢èÚZ<æCŽŽéáÁ˜±qÆ“ƒ“É¥s{u£kñhúN±ÛAª<¶ÿk…šÝ]X‚í½Á$ô:RêŸÙa5¢%½ÕÓ¨‰e1É£i%Ú˨٩XK$†të½w0gB"HÖ5¿2HdùâhBc݌y½1Vmu›]<¬ÓÛIòÚãcJ¨‡qÙ‚AŒñ5Œ‡Á|E½:&7ÆüIáFÀ>a÷”ö=@ÉñKfÖw%Þ‘¾Ö3¹Ï8—åç 1•È‚@#œux渕ßOKH® $¦<¨ecƒ•ÜÇvr~îOý>äÍîqv£«’2[‰ Œò{ÔàÐÕô¹N¥¬X¶ q­¼+¨ ) 3ŒWB¹ÎrA$çŒÖÝÂé¼ZßxÒØ€mn4}A!x\¸$)tpOS–7<ò4»ô ÍlÑx¶‚%Úr$ä㢑Á9ÆáÆC<×wÐjRï‰!’v2òóŒ}ÒNã¨ç’7+Þãå•/y3Ûþ:k³‡Œ­ì-.þ!xŠç_Ó¼8%ÔzE´‘Bc|¸Y¡ù®å¤rÈc ò i ~Eöá °Ö!†ò c´€¹Y#V`ï³z±ë‘óçíÇ¥ªÿhÃ-Ö»âo)çfÄ`ÁQ…;ƒqđηr+ÝÏÐfY$ûçn]„’¿Ä|U8Ê}Kö•^Ú"iN‡ea †™1¸‚ÝžÆ4˜¤Œ2 ˜ T•8;X†f…dÓd­Åú£ãî·Ž~bÇ ôÆÕç¡.ásµà¾[iímŽ£1;¹ÂóÆ8Ü iXXhvÚ%ÌZôÉ$•ŽÖÖæWD›(Y ŒmáË‚g5ZœâšEÓ¢§&¬ÊÚ~³y§“¨èw¢½¹6ÐäɨÊÊI©?tô>‡Ž+Á~.íb–413#bìÆHÜHÁ+žsž¸ãoBMK$Ö×»ld´0à€aÜ\®GÌÜ’ '#æ8Ú:"Ëze‹¢¥bˈ䓸 äîžÇጛ%ÉÉû®äioe+n’Qö`R9-\cwð䃎üžõ òžÙv±ù˜ÿwêztôþtôXãí0ÚÈ…P1298 3»qû§@?)Ç4%¾¬á¤SB0g‹Œtl’ÙöúÓS²ØÞ=.ZŸNDŠ+÷•™0Zb"*©ÉÀÎ=xäc½sËõa1l*Ã#“œgÓÜt«p^Þ&ÕÒÆó©Žä½Ì…\GÊ(¹+Û¹C“Ð&‚{‚Éq¨I•µó’§¡;²Ao›Ý³ÀúÑr»²\o¥µ(­¼­ØX”„÷†_CQÉg«^â<þëï+“Ï;GsÁãŽ3ÔàæM\§¡8ÚÙËcæÊÐNèp‚z#5´­)a’mvÚQ,gʶ¶œ0ˆñ»$tÁ1–éÆ[máÄ• ¶Ž)ž/‘0w2ãžÙ#9$`ë!ð¦-¼òÞKK„Š8Ã<‘ Umê íQ¼íî v‚1Þ¬èš|–Ižâ ¹¶ˆwŒõ n#'$ŽAãæ«™XêTyeª2u_ ë‘«ê‰j’C€ Š@à·@¸a’}Ȫpè÷ú~±m©C¡Î$Y £ÃÜìû‡ È![§;pÃ5nOR’Õ•­-ÈÀu‘ÝŒ…€È K ôCòŒž˜©oäñ&°¦Ý­ïî‹'F±Ž WœwÇ%‰ìà`‰¼“³‚Õh³ë’j7:Ìój‘ÍvòK§w{™>mÀ»ÌX’sÉî@çuÝ%¡ºšaghP9fXÎܶ@?ì–Ï©ºi× §Å¥I4ÓZ<{c€å ‚\퉔p9Fn1XZ¥×ŠVüêPÊRåXœåB>ód•S€«…È<BmhÓ5åJ6dšbØÇ"ÛØ%Á2+ùxÝ‚x?Þ` ä¶êö6öÓØÚZjÉp·Ð´¶Ö¶³ù’[ìR lƒb’T`ü¼ä`nEe§^Zý¡Ú{Ù‚Is2,޳H¼õÈ-Î1÷€ÁÆk.YõK{èu;Åf–ÞO> ",CpG–Wƒóœ€s•Ÿ©›†š™7w—÷Z*Au}pmôÒÆ+Y.Uc¶3LYü¸É\g„ nc™—=`s*%Úcl›š7“㎰px8ü;WQ­ø¾þòÕ·[(ˆ—|‘Ã$…Ý÷y‚CüoÉ<‘‚ø€­NÖ,üD'Òc·Ònm¶Îs)d†8Ô‚é”Û)ùQv¦öcü$f¢)ÞÆ~ÎS{œ¡Ò5k¸Ö%±’‡l+Ž eœó'_âj9 ²xÖ[XÄ±ì œ Ä£pãR}1Ú뺧ˆ¼q¬Ûø“Æ—±ËwwÀT5XÄŸ*ì…  @qµ0;ãq$äjÖÖéss­ürŒ( $ûÒ<·-»ns>éu9àœ¶…º2й;^5±Y¤Ž?<7öä'pF2xÁÈ9ìsV'sªXYŬ]YCFK[&ÕdhÀÜ嘦òγ1ʾ‘Õ–ÎÊÖ0m-îÐý¥Sˉ˜yb:Žç<“™n­.9ๅäycD`àPÁ°rBð£9Èäœá«-D”Ö¤ƒÃVÖ2O´e†ÖÒG.d_-$yNTùCçTI`›¾Ih§‰®¥H­nb²VŠ5O´AbŠñ¢³2’À•˜rx;UWqU2×MÕvEq C÷$郒pvœƒ’NOLã‘ÅiI§êxŒß[•Ys4ŽÙœž8¢2„‘ƒWehå{{–¼ÀJ2b66ì¨û܃ӭ0ÜB,£lX–ÉÜBç¯08ÈxÀëS[x[QÕµhô[“ÞêAgpÌÅbbH$àð¿7Ìppèºæ›&}wekâ(¯â†F„ßD¥Ð ÀÈcÉ*® 0$ðqMSæW%S›M¦Uµt‚U‰¯¡Aj^!ÎÀÎ3×Üqɼ·ÓA»¸œ˜D{pªÀn.Hù‹¼¾ ð{±ªVÚQˆÉ~¶Ëqndx_iÀ91#<Ÿr3Ç¥*É%œÍ’‡iÜ›† $¯8É=y¾µ2ƒŽä¸?´iÃ}-ë$vWãy"vÇ vŒœsæ(¼ÕÅ”+–l!ýà…Fâû†Ž8¡È'éYò•·ƒÍ‚UmÄï‘ ± Iãkr9çŽ [Ž ¶¸– ÒA¶;‡RÅÛƒ³æÈ=OÝé÷i5î]‰ÎP@×¶Žci•_ +DåxaѰ2¸ëß¶1Ó0´¬–LämbááW‘ƒ–lœñŽ?•Fæ9Íû¼nì¾iY'D îäúgŒqŽ0Fn_øjöÊEE¸gD¤*ÅV>»°çyè3ž‡‚T¥Ê’6·k—rBš|ÈË»9øDÏÞ ?ÚÂ’Hc8ÐðŸŒu/ As6•a¦´÷1c̽O5­Ê²²H€¼c’Tó•àcš¶šÅei$Þ0Г`3yé‘ϱá±Å*\FeUšo˜Ÿ—iw°>¹â§žÒ¹ƒ©4îwWðűŽ{Ÿí!FiåD(@9)ó °~„㑌›šg†>úïEQ‚x.Ú[[î-Ø·©oœ…=ÉÏ9$šÙ…tûxµmnyü¹¾Ã h2€¾À n!‰ëòžøÎTi-©MÒib™ÊùJü¡ dm#æÉŽXt|×MÜõd¬Bþòu)õ;«ÙnãòLA˜«PÊà "6ÓÁè‹“ÛÓõÛXUdÐo#Š)ZÙ¤ÃpHáHÆ[Ôç˜U0Ô¬¼HtW·TÑ¥òßX‹{#‡X7¡&5b‘nb1·åÈ'ªÖ¾8ø‹[øYÿ ªÓÀд¹%†âd°°ˆNò¢ ÊyÁ‰Œ1Ý#o.I 5òÞ>ó6¦”v8û'C¸–ßĺÃAïØÏog:#K°(fØ ’5ç €¹Á#vÜÔú¦Šöº‚K'‘¨Zî 5ÈŒ Àäm#¿)fÇ{«2pÒ<’ªùq!€Í»a,9RÝ2T¹͉‰¡Ž £tåGòÒR>èù[åá=@'9¦¢ ™š¥œ7%µÙm@’$ÎØgò–àç*Il‚p1¼çž¹¢ÊòÇT¸h®,íãgÉ„\G¹öá¹%{×J’Q¨éÚª%Í­ÁË’Ùc Œ(ÏãVî4Ë6);ÛÂóÆû•±°³äŽÇûdû K¸Jö2b×`Ð5æþij·¾ÄR“kyöˆÐ¹ ¾PW XäØà±§ëhuÒu˘Òö[›£,·#°v9%˜³`ÀŸ¾Äõ-ƒÅ?Ŷú­Ž¡‰f3Ä̳G'ËÙÆã‘¸v=óXFó_Ôî—Ng-,‘ù $®$ÛWfÒ06«gw$nŽö×¹c5.… Ç·-4vSÅ"Ëq¿ÈŽðÀ8ÁÚCñžOÓXéBÒÊÝÌ’,ë?iå±µŠà ÷q‘íÈô¿NX%Ô­swg‰c¾xМ¨C¸ŒÜ¸'¨m»-Y´‰b³¶GycO¶Ãs·kÆ­»¯8dŒTœààºqåÜÞW1aòµ¸™ìšÞnƒ™à, M±~u@ÀãkLÇ9RKkù¥igŽêYacæ8bì2Ù<†$ä ñÀÅtv•:5µ¬pˆÑŽÈ|’F@ÜA$· qÚ=I¦ÝxRâÖóȾ²¹·˜°6ñÉ–•˜–í×''Ô‘È.ÖzÒ–Ì¥{â+t›¨SDû+-ÃÈÒÊ­þP`ˆ,I` ï±+õ¥ÝÕ´:s®ØãFP˵K²í~à­º0§r˜#°Ò¸ÒØ¢_B ¤R`…l•ÝœQJœã'Ôâ–ïO¸ÇÉ"©’Q$™Hø$À¶2:äç·µM tšV‘‡/ù2Dò °ƒà’çü‘Wâ·µ–ÖJÑUU.V)@BÅ#(ÄA±‚ÇìÇSš³g¡HÒ-Ä)ùdõ×r‘Æ<œñКі+­=¿³-a–‰Ô-²mÃŒž —9 ±Pp1Í(FHq¥ +˜–ÖÆ‘Üi‡ÈUÃ4oµG8ä—ùyùˆÏ>†¥¥ÖÀF ‡Úîª@d`c±­7Ðg%¼ûMªíÅ%ÌjdÜ6îÆY»ucsO øÅ>,Öí´/ h·š…Ó3YYØÚ´ÒÍ€[!QAl*È8Á¨äI’é'¥Ž~ûOÒÌA­ôû -ö¥Ã¹Ý´tÎà /̇ 2 倪0h/9 ùŒÆDi÷œ “è1Ï­t†;‘t·ö쓸1¬Š 9%`r Ã#©<æ£K”žkk‰Žìvæ_»òñÜ*ä‡vÓÍKÝ‘>ÙØË³‚ óu“m;ª²¬W–Ë*)*rÁHÁ GÓ=y¬ËŸÇy#^ϧ™åo"sÔà(çãßhÚ47²9Ñ’U†ÕŒ/ï‚»+¢¨Û¸¬ n Ž Þ>Ôm|Mâ¬ZxcKÓ'–8RK-˜mHŽ%‰] |ívÄŽì†f$ª’EgiÅhÌ僒w<Íü&寖ó3b&Ë( l\’ª= zg=ª£xJâKìúŒM+d…‰U8Ávqë¹'±<.9Íek—ú¶‰©Ãm«éîV{d›)»ÍlŒ ç$Ó8 ƒÏNª-[TÓv½áµº±·Pïq«Áppü¹†OnsŽŽÖ&ðÇŒ!•´³žè]EÂá×'¿ þãò©w“2©N<®Ç#$¾/œ\ZÏ'‘þ-Šy]Ë·™ÄJq·?{æé ?MÒã´wjÈ×u!œ¼€Aäã%ÍdišE­Ö¿‡5MJQ#ª=Üåü»|¸’€¶9=÷àö×ðeïöEÂk7žU¶gG+L e'$@¶à‘Àäí šåkÐäQÚÿ3­¸†ßF·—Pˆï¹ ë$€” $!W-Óæão9Ãi–ºEÜ÷Q¥Ý·šÈûàa–Ûò (&58$mÎ?<Õ¸Ú5+s Âav³"¾%¶ÄlD£åt_Þ>`[–º œN5­~âY"BÖÿiµÊuÊôÈ@~f<ª¹^TòÔb–‡·m˜6ú3jºÂE¨My§Û]¼1–A,¨Ä˜Ò_âÚqÊã}8µ‰so©5ÔÚÝäQD¡ 3‚ÞZŒ"ܶ7g§#'¦ t0Úk·V­-¬wÚ ï›„*­»F r¬C|Àe‰­&ÓHÓãÍíº¥Èžg;>l¨|¹$9ö$är‚ÐÞ8t·9‹Í*áÄŸéP¬æ"¡c— U$ y9Œ`ž„§†çž&x/#†^r^ F€#®}úc ­››æ¼f±v¹1Fò0@#œ/ÞäðÜŽ™f±¤x–UB—0ÀÃÂÎŹÃ΀yÁÉn1š|ñµAs],ôë«gD˜1ÞU¤EûöF0§8ÉÏnƒ5¦†ãN²há‚[˜mÔ¼Á– œÈõ8?Ït3Ú¸·º„‰‚Y;@ŒwÏ@zúÖÞ‹7„_Iiuµ(¦o(±h™h³÷°@*ÏLr¹—A*J§‘å~,Ñol.wWr\¬-(9PËŸ/Û<æÿƒüVÏí3Û‹7ï‰rH îFp1ÁEYÖ?³uMF[3&ÞhûÙ9$õ9bsÏ@Øà÷†–þûN[{T•V&;’­€1Ç*zƒÐŸ\óZ)$¬ÅK(ÍèUqm³enÑŸ,\‡1# ¸ÞÊGÌHŽGÕ¾º6‹¬Û¤ºÊºîœ«Ë¿ T/9W'8o½œdcÅV»Ð¬m•ÓFiåµ–9¼ûp >Õ8È'<7lõèy.qLìTݵ8Û½CPK©M©5ÛÃ7ÈeÚ²í—%ˆ;xÈž¸¦/‰¤ó¥á q|;"(¶CUxÂnÜ0qžäg€ ×’qUfŽÄjw…¶—ö¨æ¬j1’Xœª1 ,sG šÍÕ÷ö¤œu9)çdšI ½”ÀûÙä”<†àm<( 3Wn5=jãJ{˜$šð`ù£€Yv†#8?)É Ö´ò_£Ãj¶HÛ¡ €D«ƒÝÃ6ŸS¾lMkªXÛÂoîf[yÝÚ&Œ,p9l䬊qÇœ`’1ž hæš÷ITõ9ˆ5Ý^öÒÑ/ƒG:¹weCrvå#<ò;æ¶ü)¨¾‘ªCw*$Æ"A.ä€8ÆæVV Àã?Ò£ÕôÝ'CÕYã±[èÄÌ^ós2Û#v9ÈàNÙÃE…™™cÜ…Uá|0ÇͼcG¶1ÍÑr‰A#v_ì½fþA¤Y °hü×HTK#60¥%wóƒ€\¯< ·‚tÿ´^šŽº“. ²Xe™Ú@ p!ðé†ÛÀÆ'‡/mÖKhÞižf$ÄÂDÚÍ’Iefà}îÛ€ÀÇ!iáÝ^ÂÅâ–æåVHѳ,l¬3ÀƒØÿ!Õ´/êÖš^ °£iCU¸ñÝ‚w*³4-{·[˽ˆ;ceZõ¿þÏ^º·ßu/‡§´³ß~ÖÖzœ"f„ ŠŸiÈy™T+Òl–Suq¿@XyN;™V:5¥î¢ú¾!³Š%ŽÔ´ªÛ# ¨%2 /å‡Q’õQœ{ +áô‚Ö4 re`I2CÈÆK`·9õžµË¾¿¨\[Ç¡o%¼ÌnbÛ2¡É*Ç »®6ªãשö„w:Ö‘ë¾%6Rµ®Væva ƒ "*–]ØÈ ­ó0@ÚG-IÍ$} %NÕ¿3 < l[ȹÓ²BY¶Ä¸$Ú2 pN®JóÃ×K¬È–®Šr ä9'©ÛÀ¯HÀ¯[ŸÄGÄImnú©dQˆ9dVígwËýæ$ïÚ88ªW¼]ã]få´x¬ÉÒ<“™H`®¹[¡ã â¹^VÜŽ§G™hyn­àÝQma¼ŽÒÃ0’8Í¿˜D `á‰;Hãù÷4ËQ±Ò໚å–Þñ|ã',»7>`6¶Hèzž¯G>¸ÒäžAkdG ”¬AGVÎ6áx8äò7úf}ä½ÞtFÜI3\¢³¬ åví ÉÜ é‘ŠÙJRˆ•D笼$3O}/ kó¯.zäŽ8çœ÷¬½OÃI4—›0Yƒ$ÑÉÎà8u=}ë²Ò .bš|òn€£F“[@çƒ!×!r¥p@ÁawÜßOnó &•XäbAÈ898÷:TsÉKVS¡p±ø~êâ42 “Šdƒ¸zœu<ôã5³£[Å&yÐLì#nÿàܧñLõZŸ‡lfÓ§Ö"V‰UVXbu!®Ï˜d|dáX·;GîÈÎp*½î‰4‘[$pxbäË+”\'¹$w란WD*¦‰tfš%Ó<9moe"ý¼V,6¦Y²Ø#ÓƒØñ× «ÖÔõ{Ç–B0`Ȫ§r7y Nr dŠ‚ÛPžÎâ ¬"MAâœÆQ¤*Ic´(Æpp ä:džçJе-BheÓt–’ ÑKF軄G*[ —ʪƒ¹Vr›ûÍ#¢8ßxCŒ#ŠG¸` ‘À'w'Œž¾¼^½¥G¯2jšO…¯ÞÜÁ,vW×d~i\Œ¦Î@'’[Ì;ýYð‹à-÷Œu8ôöðx‚êêDK†xó¾è€àü¿)BÌxË/ðó¿þMàO_Y>“iØ‘ã–ëOòÙ%x÷q6HN2KÅp*Ÿ+ƒ”^Á¤£cÂ4O ê£N^½³ŽV·,¶¶–ì#*0C:g$döäñPCi•¢¡²xã'2$¤ªîûÙ9태s»¿×D>ÓÞÖ_ Ëo>¥đϱ4ÁùÀeHùs‘ד×ôÝ:ëR i¾x#f|û€¡\ô\® á œg èwdL9¯©R²ØÁ»ð½Ž³áùìMß”f·h®Àš Ó9*JãiãÀèj®¹£ë;-^ÊêxáñZGÌ¢YÆŠ¥öžScä›=už¡ÜÛA¹˜Éq>Öv`C¡eùCC×8"£“Á ¨,§Hs5¼±1Žíè$îÁÜG^Å?Þä¤kTŒyo¡§M»ÛSÕtî|;wc¨]$_j}‘ÙùK™*rKÜÊ:c$tç× éiáËh­-ôéÙ‡k4ŽìŒ œà ×®/ÂízóUžâÖKÇŒ,Žcš9 pví,­ŽpÇ~r?«|2ï[M¾½uaÐ-À ¸õÊ9cÏ?NÄV‘ž¦3Ñm±Õµ…µžáØ„;v#±èÁŽÝøŒœu"º{wZŽâ 7Ô£Ž)S̉n$UqÃ/=sß=WØðŒ²Inš|fIÄ­ç4;9',»C>cøörÛÁZµ¸HæMé;F£å—œO#GqèA«rìÌÔeº oˆ~*Ôš*ÞHÂE Y ’Æ2qËuÖªä)'r`»ð Êölj2+ÚTƒ;/Æ\HšÞŸiqª $kˆU_½ûÒßöqŒäö=ÓYѼ;âE’òÎÊÎÅÒÏjá^2¬ áˆÆw2;ð9½?XÒ®tã¤Ç%¼Wü¶×Ð#†–F~÷=2AvÎ85%犵-JÕ4¥¿b ¾¯,{ V^1‘Ž3†8ÚLSŠJZ Õr¼qÿ4? ɤÜÙ¾¢’\ª¬Q!f;6 Ã1Û´9Ž:c pÚw‡%±´]<è:v¡y#’—W6 ‹\ ÛÑ••[#å;Ë·yð_À{ß÷ aл¿ŠÝÊÙIzƒåM¼G³çp*F{€qŠ­«üøyªx»HøwàíR{=rÞÞHu=%õ;DV¼V0F$xçf%SæyKœ«I1*´nÓ{nyØŒ¥%5¥ÿçÓ­m.e¿ÔnÊ5µôfæÒÒ0<%†Z7cÁw Ô²—œw¾ðW€¼Ao.¯£üP¹¹ºŠßíRZÅ¥Ícv±&ܦV_!Ù#Vf;ÂŒI¾PKz?³Ç(¼Yö/èÖ×7ݽ’júÿ‡àžÚ9d“Ê>i»AÚç2í*~nf»ø#ñïà×ÄwDÖôíâ{ §kïøEöOiåù²)Eò¤ó"¨K* ÎH*½54®µØÂ|DܶŒÊðÆ‘ð¾æ{ËøQ[‹©c wíØ+”/ö…V}ﱸÞä(éšé4¿„Þ ÒuÅÓ´˜/,¬¯|ÓxÒ]ù7F=Ä1 LnÍ´F ¯CŒœ+£ø#7Äߊ3Ò~x àt7šÍÝì·ltEk¼F„Ë.íÌr±æ=‹ÚYˆ®žG¥køkžÓ,'³T6Öº}¢Þ%»2”‘Lëó'b‡p*2T«©R¤W4S;hòO[~<³Ið\3Áqe{ä0$@=¨e”—*ü;£^ ó’sÉË-toø.Ùõ/¼·v`n†Ý#”Îff``u^  ¾6ýâ˞ѵ9u 5 &×L¶´³.a‹Muó‘gÀfmì3‘€w·vâÅ¿ÃÏ…—þ0Я-4X¼¨àŠá•wLÙ%œ,›•X†ÚṄ9È g9Jn¥¢®ÏA§ÎÝ’BhšÍö§¦\ê-¢Ý¿ŸE-˜.ž^>b¡·y'«¸À&¥µÖ-¼zÚ–¿¬ÅgÁÙ%Ìó=·”Ì[jä€ÍÔð3ƒŒ×ËšçǸu=>Xt4ÓÝó‹8¼¢ÏÆâqÁÇО>\rñxÇ\1j>&Ôî¥R yR±m¸çöÉúäsÐW¯‚áüÓ1’Té»=.Õ•´Öìñêç´èSrq³õßõ>Çñíð[Whü?¡ë÷Ú̉ÿ‰lÙ¡Àvr$ÏÌ8Q¸+1$ Má?‰¿ 5+84¨|;¨^_%ä²ï–ÉcFÜ™&?˜ ð9?tš| ðãÆ5¤xÂ7z…Ò(-›hÎʹÀ'hãŸZ÷¿|yà­}ãø™à½ršt³5®£¦\«NK*DN7t”p¯ŽÊIžm”RÉê*Q¬ªIèÒVk×VyxN$Äâq¦éî÷Ôêo<o¨Ç?‰­,.¬­üЖ¦ñV8ämªÅÊð[ zå{·lµ].´¶ÔôEÑÀ‚{IUÔmÛû¹%\äpä ôÿ‰¿|tgµ¼Ò–Úýõ(Rõ,,¯£k©!FhÞSk¹†p¥±Œ’9?5qòøZîç\°Ú_^D-’äÛÛ¢.äiÞ\/8ÎÐ{gWƒQrJÓÐûZMTã©Èøâêu 7Xͪ©Žõ&\˜ÄH›efêqlF9-ƒ™¡â =J wÝ|®ª¸™ÁÁ襘™õ`qž¼5z:|Óµ[}gWÕ~$ÙÀ4ȅΕ§ «‡|IåÅÉU“]I (Îâ+ŠY5˜|a¤ø7HÒ®õyu»åµÓl @Á$™Ü9؈ˆYžBNÅÉÁÆ* ïX™.Oy»·úM…¾—ÚR]ÀceÙm"™åŽæ •.ÕÉ @ÚA=‡ôcâïÛϦ_Oqw¯f ‘–Y[x6†W^0A$˜œ3BøUáoüvO^&ò%Õt¨âŠûNÖ#[‹õËÁye&ÐíÞ˜rpÁTŒ™ £ãÿÙwQý˜.µ?xÃY6»ZÎç^š[{AË›?{$G.NâfêÀ:*•jm©jŸâs}n5>UÎßÃ>)´ðŤzØ­¡Õ>Ñö«‹ë©¼‡C#|È…‡ÞUB›q$H§øWÑ<]«Ïá¯øÎÏÃ,³@%1änÊ@*v¹f81Èã#‡Ó®-/_j¶7ºÂ+OÐìÃOqÔÒ…DhQ•X”YY#l0 ´ísà‰~|Bðåþ¹áI^ã]µ·’ óyd"º%eý˜Ë(·$Jè`‹´9ÆO½W„Âà#ZµFç=Tb¯eýçútêxtñøœN:ThSJÑÊN×Ý]»·òaéÏäÞ06ZÔ˜µtÙ\ˆÚH-Ôþä®C ¼€[ï–c¿é650SnîKäŸêŽéSÆE-"þoü™ƒ©h~ŸHûlÞ!±‹Ê¶,°ƒ0•÷ dÜ«¹_lŽ|°ª~áäpØ>:ð‡‰4«¿³C{ (ØýÖ¤ÎRG Dr88ÀQ•ÇçÍã{ £ÚGo¥Û@/™i±\ƒˆÊŽ mÎI¹ükžñÄüe=·ƒ´Í+X¹÷Ö—ú=»´¦½¹HûAûKxÉL©Röº=/Ô΢Ÿ³ÖÜÝ–ŸqÜè:ŸÅO êÅ¡ð\ZŒ×6mlíçy‘Ý'–#$ûyQ‚W Srœ-lø³Å~,ñ'‡¦¹øƒài òˆ¶‰õm{à dºÝ#1N€ªêùÂŒ¼6OÂOüRðÏý6Ù¼D/|Sáï0™õd‹ì1GÊ’¯Ë*6s•]¹ùy%r;ë?i>-±Ñ4í{ÃÞ´“M¾[Ýa$–{h¯`VeXÖ$˜ÝN«ºLædfV ±|‰¶*.Iôvê¿Cš/ž+§“8ï„?ñޛ㸼cá­:Îò ¦Óíu›Yf†WÂF^R$P3ÞøÁVÜ ìþøûâAuá¯iך5¬ÓÙÚG¥”‚âS€Q¦³ó¥º»áe@¤Ÿ%òTkü ýŸ§Ö~7ÄmN/ EááͧYjPH°ÊñH±ÌrÌfM’¥d„• Œì®ÓÃ~ ø¥|#´Ñü?àóuuq­ÊVöîO2K_(FR ÊØïa»vŒ2šàÆMFÒå½G I¸róþ‘ç_ ¾x‹ÄÞÐÖ- 5Õôý.k«DÑŒÖ÷öh%ºEHåH#i|¥h‘¥AÌbÏæß~ xóRñ%ÿŒou½Vý¡³5Ë-GRóŠ8V8š)ÑÜÃRÒm.Ìx,>–ºÑ¯¯/â¸ðî°—ÒYË[ÜÜÚí–W'Ë$ Û„nãp.˜cò«X?toR•´ò×Ööút¯¥¦0¤NîÎ]±™R>cPS× Æ¢¬ÒÛúû޹à)ºV–¶?ÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ýü¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ üy(R[þ »}Æ3Óÿôÿ¢ø&üEøÄOþá…zo&Ì—ü»üWùœk0Â?µø3÷BŠü,þEg}‹ÿÚç·ü^þóÕ†ÿƒÎa…CÜÿÁ<,áÏÝY>4`ŸÃûšÉs6¯ìÿþaý¡„½¹¿~åÑ‘ë_…—¿ðze¥¤BCÿçŠV'压ò1#×#DÚ?:†?ø=DË“üIÜœ¯Åöþº5GöNa{r~+üÇõÜ=¯Áÿ‘û³‘ê(È= ~Mÿ§É~kÿÁ4x÷øÉýÃÔMÿ«ºŒÿóœŸâã ãÿ(Ô<§0OX~+üÇõÜ;û_™û¹‘ê(¯Âÿ¯FGÍÿÑe>ñŒÿòž—þ#YF`#ÿ‚k‚;çã&?÷Kû/þÇâ¿Ì>¹‡ïùŸ»´WáBÿÁé²0¿ðM”Á8çã>?OìzH¿àõYdÈoø&šƒéÿ —ÿ¼ôÿ²sö?þaõÜ?s÷bŠü&ÿˆÔ‰ûŸðMP~ŸÿûÏRŸø=-V=ÍÿÜÁÇOø\_á£ÓþÈÌ_ØüWù‰ãpËíº”Wá¿ðz´ñ®äÿ‚fÏeøÉÿÞjþX¸lcþ ŽF}~3÷ž§û/üŸŠÿ2–3þÑû»E~Oÿ²KnpÿðL§'ýŸŒýæ¨[þlP2¿ðLÌœò§ã>ÿÊ5C˱©ëŘÖ*ƒ[Ÿ¼ôWàìð{*Êoø&Žßû¬¹?úg§Ÿø=bð¦øÿà˜ÌTrXüe 隟ön:×äüWù‹ëx{î~ïÑ_ƒƒþd^CÿÁ4TØ|fÏþá©ßñÿÒ3ÿó2ÿ÷ž…–ãŸØüWùëx~çï øå€«ƒ 3ïIÓ…¬FrNìÎ:]ÓBdYÎGDÏ'ð¤H5R>\Àf´Ñ ÷‘¾=K<±"a vŸúò.Œ·cö’¹Ÿ zâ±é/&2èÄgð4ä×/ÙNÍ:‡)n?ï¬ÕÈn.a2‡ 0CJ[J ±±æM"Ú@z†GèhTÛ²L\êÚ¢„ž ¾|$žYQü&Ö1‘é ÕxcŠêO2E)ón$1 ùsÅi^è–7—2=´ÚFË„Ž$ÜüNj±Òï,÷G@ã¦òO?~uœ¡UËÞÕ)BÚhW–{Æû5œ<¯&P®3ùÿ…2òÞúHšÒ7”ªs2¼ÍÈc·búÔµF9<Ž*žKë}FÔZÜʰ Æ|¸òÜzœt¬í Ý=ÜRr‹O¡VÛ@¹dýÌ1ãý—%Ƈolnš1µ~öd ±0´KyY±ÔSL’Ê)ä2΀œ†äþµ^Æ :/ÄJr”®Ù–²8ˆäJp2¨OáZ ej8kuîùU{»‚2ð³xP 5²œUÙ¯Yô†Í»2n”6Õo”¾ÅøO\Òî´-z/ ëºE£Éqd—1^èzÞ«Ù²±#`ºÓ'¸„?•.'†uÀb²ŒÍÚ…K¾Í4ÅŠŽeW«ON÷Ðñ¼?u2ùdí?1ÛÀ¨E¸E.c$¸í’ø;F™ˆ–-°±?…V¹ð>ˆPGmj‘=YwäÿÀzsÊšZqÍ"ôhñƒ¦MÚ~¢«ÉnG.½ý:W¬ëó3+™$EéJýx?s÷þÒì®^9-n Ë–‹'õÇòìk’¦](£¦ž>8{ß…0Û€3ƒøñ]]þ–ítmí4¹š2¿ë QÏ¥fÏ¢jpkaç‚OJ➦vB¼ZÜÂ0Œƒý(høXV¤úUÀÈ?…Iªï§ÝD Lü?±tdºF¬[)•dzæ‘Ëç üêÃC(\¼dqL 9À=Á¬ùli£"guûÄ{qJ³H¿ÅRyiê:O(w•˜h†\,w|ñeö¹ƒøÖDÚèVžL*òK)à ÛòÿIåF½zTΔ*|CŒå Ž]oì´§&¡„6XËíœbµàºÑµ[F¹µ²J¿qíÉúcšµ{ X_ L²?†vþYÅgÉðûIÁ’&¸ê.0þ:k•SÄÒ“QIÇæoí(M+¶™j‰tUÁ^s÷æ û4Œ\®á¸ôQÒ¤µÑîm#Á4ûPðwô$UˆrW%­”d×½¡›”bô3¥³xS|`·<î㚌+ŒƒôíZr‰ ùaƒœ¶*¤V^Rì)ßÒ³.ÅFwܬc¸§4!ºŸÒ­ uÇã´y_ü²<úŠdËSV+„écaµdÇùgúP±ÀCùP©»êDs§¬ zÕ¨íÉnjͽ¬`æD!@ì+XÐæv"U,¡üñ Ãv^,³»ñ~—{¬hö×ï4ø&Kiïû¥+º`„ã8ä‚>—ð/Çoø&ÞØ|yuû]Ùkv· -¼ÖŸu(îmäIAWYVßäu*ƒÁ5|·:-èºo™™FØpOpsŒãñ«V:,ö·g}‘:äÃnÇ;ÁÇŒ‚Hõ€¯¤©—RÆ.ZÓrôrKðv>Vž.x_z’QõIþ‡è‡ÿà°:…Å9oô-oÇÞðÕµŒQÉr:V™ð_Æ¢öí~Ïgªiž©t“à¶ò¨$†0v°/"—p(‹~h·Ÿ´¿ˆþ~Í~ ñN¡aa¬Mc¥é·–RO©Ë$m˜%|¬‰(ÚFà-´åW«ð·íw㯉þ7·±ý²>?|W×| =ŠÚx‡Gð÷‰XI{o¸†8vLâ2ªg°ÜNæbÕìßಾý”n­´Ø«ö!ð>…edn<­WÅzœú騳6ǜݠƒÈ*¦ët >B¶+§ ‡Îòw+ÍדZ^VŠù·wè—Ìæ¯ˆË³­I-ì®ßÉ/Ìñm ö øµ­k>ðŽ¿ñá÷…5ïZKq‡¼iãÓ/ìÑOîüûwC*‚Êc¶|— ´í cÇŸðL/Û?Áú’Úiÿ.<[e%ªÍoâÇ&£§\)]ØŽo-Kã”`‚+ë}Cþ ‘ûzþÖ_‡ÞýŽ|¯}¶XþÄöÞ½Ô•/m‰âÉ,Fáe@Ë3ŽõÊëß?àª?|M¦Åmû iž¶Õ®-ç×'ŸMŠÏNÕYdæÕm„áe•·>ò!W"Q…,‘”Â9¶{J¥ñ”|œ—ùܧƒË'ì#9yÛþϽ{Á·ÔntMH[k»Iš¨º'^¨Ü¬22§‘šÉºð†‡0e6ˆ¤ãæÉcødñ_jþкí=û8x_ø-¬hßô8¼c¨Éý­oá‹Kquk›æ5¸–ãýZL%¥€T_2ê’ù3OâxfÞþMFïí/.¨ÁÊä;ED­$ï&Ì&í¥Aô8<Ƹ{ü­ÿvW¿ÉÛó<ª´gKXs|×êy×Ãx$ì².r¯Ïæ+ïÀbí †Í¤@Fe%{úI?¥zoˆô­r- kw†eŠÖBÚK«è¥ÎžBÝAÛŒ…;¹¬{+ÄäK¥FÑíR¡R¹ìIcÏOʺù(TvI¢U|E>¨óKÿj«!CháGFòÈϾ1Y·^ »·Þ"=?Î+Úâû\Á¼Ý€+ £×­6M.9™ãå ?¢Ym)¿tÖ9XèÑá­á»õâ;ryëŠOøGoù".•íÿØ©Y-bÁ,…UŸÁºC(U‹¸â¡åQKFj³UÕ0ú Ò ¼øí2M"á@":õÛŸBἩ8#åã‘ùV}ïË¥¢dnpN2¥`òרÚ9•7»<¹¬n#ÿ–c§ja³qÿ,ÿZô£ðâñ‰An:ü½¿4ü,¼ “鯳þÍ«ØÕfz³Ìä³ÊbÈ=EGޱðF‡è× ï!mŸ`wlààŒ~u¨­þj- V°lã8ÛÐVO/¨Úº4Ž:’êyôVŽdqå¶IÏN? |šPÚ]S#¹½¾_0­„ŒUs¼*H¾j—*véÓlQËÿ /Ÿa¬u;îyêéDÿoZQ¤HüˆÁ¯KᨶæHâ ÇÝc?¥K¦ü%¿—_”E'ŒÊ3 æšË*7nReE}£Ë“E$á£nzpi[K+÷¢ žÄײŸ…dR[ó'6äà}+B‡^%£<Š9<ô<ÖË'“ìbóz~§†Ç¢JÌç¶5i|=zÌò’ØÀÅ{rx3ÃV±¾Í9u!œõCÚ‰ô iPmBÆ%Y#ÒbIu=89àúÓyeQæ©4‘ھѥ¶v—ÿ~*-ìp¦•öµB}ŽöÚb7g(ì²0UˆÛÁ g Øëã}Ýͤóé÷K Ì„,)/–-ð¸ÜØLœçO8íÍv¾ñm”z´‘x‹Äwè±m®˜ãÌÙ°î82.ߘ*Œýï›Ez7„>4|&ðÔr6¶Þ.Ôç–1M¦‘›Y _Þª€sÐåNzà~jüÞ¿æu—/,Rôæz±É°ôµ‹z<Fýˆ|~Ëj7×P“pC2 &gvÒØ8·Ç8“SøÃöu{K}B›Gã´0Mu¯Ù o1Û8>Z,…¿2Èía•Ük×oþ9ü Ïwªx+^¾šXÇ Õÿä á‰È“{pàõ#:Ëã—Ã}ãEŸàކC´—’Mqp7+òòLŸ˜oîÕ¶äÞm^#Í*ÕÊß%þGL2ì,]úúœû;è3hÒ^ê<3»|¯­”SA”ùa&5œŒFH(žÇeÞ9ý›õC¥[é_ü?u¤Zé¦Ú?°i.nlNàYK_1Ãdy»²É‚6’Èf¥ñFÔ¯RH<1j,æ‹ÊtµŠÚ £`NK<`¤¤2˜]§†ç-Ó¾$jÚ5Êêvö–÷z\—4›Á!†HÕFÁ3[˜ò¥2#Ø@è}yÖšFŸ"«øÀ-à0ÍóXßø_ÿýý™æ³—‹>&x³W köŠØC,E3ìùá‘Nѵ·i0­‘†õßÁ+?dKo°|Oµñ¿ˆmt$œ½Ÿö®¡Ö×vyªì‘£2L¼òÒx?ö·ýn¼Awgã/€þ=ðö•4!"o |Ešêå£ùQlœM䯒á›äU<8ŸŒ?bƒe}À«oˆþÖ¥ŽXíemRÚHö&5•ZF30Y Ìvîæ¹–aŠœ9]Wo;„òô½êm\ýø=¡M£ØÉaðãâÛë¶‚6•o4Öw¶ú`WÜE²2–Ú6ð8]¿0Íwº¾‡ñÛÆž—Àm®ø )mÖMBÓ^øz—&陇ï˜[]@ï,FQ†æÈÀZüfÐ~.üOÓ·-·õ¨^)VçÌc€‰T²¡‰rg«(nü“©'ÇïŽrè·Rß~Ð?Ȉyqx’ö1r€rY£¹Œ!x%H`¸ùp7s¬EŸ½¨èPÆ­#Qú3ôûá—ìçû/ü øÁ¨Ëâ¯^x‚úé ¾g¤,V½|âÉi$“:·˜]Ã#DÜÊrºMáìÅâ-GWÒo>øGOº{¢.gÒ|`·&FÏ™ºKv°àçî°RvŸÇÿ|Pñ'<%mcãï kzÅíµÙš?j3É+›g1!„Rè¨Ù` 2æc±#v,õ5Ú#Gð…þi«x’oi³Ýêúš\Üǯ›q’çvR¯È®r>]ÌN¿[i^:O.Ä×^ôÏÑÁ#a‰5¿ø£ZñÜ÷÷1Hò±šÖ¤$©D›SÜ Q*ÛO;ÿ®ý‚.ì3à¿ê–š¹xæŒê)¤ß[eY$RYÆ@ùåYuÜ Ãb¾)ø£ÿ_mwU‡Aøu®YiÖúM­’êªÛMsq2s4ácˆGr06»…ùžI’|öÛöƒøçr§QðÍ•â^°[©uQ©\Ùõ_ů¦‘òÝ£û6©É Ç}Gùœú¢³ªJ²þù‰·m9Á^;ŽãÜc<á§Àþ6Ó‚\jÚ…jÍ3ÂZ N)±ûÁ;á2*†$`g$dà\†¥ãýSC½ŸO×4/°”••DªdWaŽ·ÝðAÇMŠrºzÔ®¾Iþ ²Œ\¾;ú£­—Te$Gg3ŠVEÛ´’qŽH#øüé{¶wiš4ˆ´†Sœç®Ç·ã\´Ví–ŽT’X0ã<`Ž^£Ó¿i¬¯u ©›T¶œ„ ¨ êXsè§ÿ ôpù†:Sç^Vý gƒ«IÚqåfÊQuª[ê²-’[T“nñÈÈeÃ/Cƒ‘íF³¨kZ½ÚjZÄrÞÜÃÅö¹¯6•sµHL …€²£ŠDO5µin.|ìÈíB½váHÇ×3ÅPÔµ饈êIŽÇ rËÇ#€«ÕÆ8¬kû¹Î“o»³ÿ;Nøc?»CßõõùÅÕ瞌ÅÙü”2ÈŽK1ÇÍ´žXä¶ ë‘šjê÷!eµM‚B(Äd²xÃw8Ç>Üõ¬tÔ,Vo´G°X# ÈbC6AÉ<0>çŸZÛð§Œþø~èê>;Ð¥ÕåY[Kµº{PÐíbÎfØܨ¨ÜNG–Aü!Sî´‹WÔô~Ѻƒá´ð‹~XëÚ-À’;;Kö± ˆÙ#ËxÚNH3´FlaD ñãâoƒ>%ê@|ørtý2;+FªZB5§Va:‰-ʬ‰»zŒ¤k±ÁòÔ…cäz—‹ôu ›Ë[8ììçýÎ]@;Ú£“µ7aw°íã§Pjj>—h†;ï8H£ÌH·6ʬß)1Éås‘œã”&×-ËZn:‡q\Ë}¨@cŒã@ ŽCó±_ÏœœžÕ«g«¾¥p·zv^Ÿ.YUÐ’-‚¸ƒÂüØÈ<œ óuñw—t«0§`§˜ã ñµUxc8ù©Ù¦–ßKu0pA9ÊñÓ*yéëüëeF6VÜŸhœ¯Ó±Ú/ˆíì5I¡}z+X&ÃÚtÂ0RìÄ œãoLç'åãm2ûâF‰Ë‹[©.¼äG‹Éœ.Àl§%¹ü‰õäƒõ6YMÌ2ˆ‰-ÒJÒ0þêɰî'ï8õõÅoh_5‰,F¥ªYXG,¾\V¯qºãvß0’˜ÀÉÜÄ.N7VN•(­Í9¹ßºŠÉãÿE¨iS>¡’ÒHLrê¯Ëd•†\rŒ©#ðÆ–šåα¡G%ÕÜl·—3 s$`©É.ä*[vFå›Óí-åeI;D>PÑ«Ày'#޵œM¨:«©ÅZè"Þ–=-¶DÛ#eˆÝíP#mƒ ߎ8ëÖ¬Ë}·„£Ðeð ´_;}£QŠIÖQÙ6ȱ¨˜µN’Oîlþ"|FÕI,´ë =’¤iä¿•'*À+˜ãqÁÁϨ©ÇŸ4#›}Jm%"Š"ÐèÚ‘ ˜@ŒdU`@+“¸¶òÄpDœ4I&9'8ûÌóËi5™ÿâ`Þ[[ÜÎþ]Ò!…$PC‘À8câ–wyáŠ[˜æEe †:g>¾½z}jøW´Ž_’Àn‚k‰¼çç .î 9áry8&›7ƒu^jùã×ôH‹Í%æŸs$ßèñ¬e§xÕÖH”ªÕ*TPŠ¥Ê7oS7cÄúLP"™g‰ó xa’ÝòÌW·S“ÉàI8 x~Ú᲋uhÙíÙ_*WxÈ#О8«V^"Ño¤1[%ÕÅ·ï6Kol²(É'w ƒ|ƒXÓߥ¶õÑ,î,DMó”ž„Ž€8gŸ¥æ^é.¬–ÆÍ•î­iÉcªI* \+® \sÉ9çœv«íâ½~kÅŽâò€¶$&g^ õÁà ½â-;Éi3E*†ýÐ`w`pTàu?—¿k }a4FâQ*YRt8<LóÁïéž¼)Pwº*5­¹}§ðΫ¨O}âÚ\›j\-ª´Ã'ø¯=Aê¿Ç­i~¾ˆØßY¬¡.]åžX·¬ŠK(»"/$áBõšÅMfÖI‘õÝIÖ23!…uVl1þ#üDö«þ"ñ_…--šßÁ­{yÈ¢Iµ(yjFÏìÀ†Îr¾Ž*ªCáÓÐ|ðœ}á¶~øikwi5ƃe'æeY”;#¨',$Ýœa¾SòF&Æð[ÃÚž°šçƒ´Ú¤Ñ´ZpÓ#l·ï,{~rÄ7 ~Bq•ÚʸÚ>©â]p­¬qZFAó%fU@Ì6·$ƒÓ 郊ô‡ú,4ƒ}ªx»Ä€Çr‹46WËN2,Ø;–@¨¢¬mÈ«V¯5ç&ïæÙ•>KÚ)~F­àKûOFÒÍ-¬0\2Ki,“cŽIQʶá»=ŽÌgG-}áO[ê0M»»°†b“\ýŸ2O÷Ë÷>Æ1•ã, àäŠõ_h ×  ×uÍ.Ö},´Né2½ærêÞXAåònUûÈ8Á&±´oÃqi&žÓ@ÅÌQœ¸UÉÆO-·æç©=3QÓZ$_,úžpt[£+Ü-ü/¹xŸì©$ÅeP]†# È8À'~÷&³õ_ÜxÇÃ÷V#L°’ê(¿{osuŸ>0 ÎzœŠ¸ñÍ'í0îÝiß¶ö±‡öUÕE~©žËgðÒÎúxÒ bÖQ5 š "‘¥€.pwJ«´xÃ×Ðæ¢¼øekm(]6K¨VàCq< 梹$ä7mÛXõà äT÷Ò~Ϻ†cñ¯Á/iöš­Æ¥ »i)vnfX%o=å–Î5 •·*ipùXw¿ ¾!øRÍe²ñ„´ç3ÂÒê6ôµGÜ77̾\nÒp‡k §vOçMNÔöZousÇu h6â{-GJ‹QûåU» 9bB€8ò=Í2‡ ö©,íô»íÈzñ "9Á#-Á¾sé_EËsû=O«Úø®m,E¦ƒ®qêôÝ?H¿º¾Óõ½âÖòþ["ÂôÊr¼3²æ"ìÚ>pŸÒº!Åjµ3•X7cgG†\Ä..M½¼Ÿ5äÏp¥ˆÛG8-ž£ë^„ÐhšZCªxk]‚á¡€3…,¯žíó0@ÉÏñÓ§‘C¨ÜÁ [ÝF»$#r3|®£ {žã©­{_ˆÚô2Ú³/iícb¡TªŽ0ÃÔŽ”Ýö®£¡ë¾×üI=¸“AÕìJE¶8·¶L‡fXŸ”¤®xÁÔëþºÔtUÔ5/Ú´Ó6׉ rÍŒ Èô㯞-¼Wâ™îþÐmÊ"Ô¸äüÍ‚O®ê*K?êš„7qk‹ Âî®O  ð{䜞ÜV2£ÎîÄNV:ÍOAÕ„—6ÚE½ÕðÓ¡ó. µ³Kº3„WwòÔ–P°¶Ðs‘]†¿b¿Úãã5¾Ÿªü?øâFÆþDK]XèoohÞvßs7—HÁˆff Ä9?´‡Åñðò/†¾ñ4žðÆŸª.¥a¢iH°Á|¤7˜’Ò«åP†y ] )U¬»ÿ¿.Z+Y¾8x”«¸1/öåÒÆ’ˆ’=Ã27ÌQTê@Çn)Q„w&srZ¢‰zïôö? ~"ȲK¦_\¤ÐZÁ \ÚÞ,ó#,ò$¿l–èÏòò¡SކÒãP]¶-#ÅÊ«9#?ÌäàSGy&š²I<±Ì&C˜ÞṴ̂FAnq۞ƨÞ^Ëw`4k[›Ÿ²ý Oµv–Fs·†ã*{ŽMRŠOS$×Úe»ê—Zœ6ú¥µÍ…¬×‘Â/olç13HJ€¹;[1B뉵;; û7MÔ#¿Hgxíõ DaʃòÈ¡Ô6ÒFpp{г Ãáå°k nææÚú­¤±Ô-'Øw¬ƒ&cµˆ*œ¬Š ¼†'"¤‘Ûé²Ë`º¼7°CpÑ­ÔÅ#™ .2¡Àݵ¹PvžA­®‘m%fT6í×™}k2‚>aó ½G8÷ÍLÒÙÜD­o )uËv8^ êH}jm"}K[ÔWKÑ­î|–t…J! £Ë@[æ› wÓ€It½RÊ[?X²k[¸exæ‚t¼.ŽU‘”€A3ÇãI¾]n(ÍÃmˆÖâtYH›rȜáçŸÃ>øâ‹-z{HmìM벉 $Ònˆ1Î@Ü$ý}±š¦EÅ«¼‘Ü8Q†_%²ÃœàŽ2;åYÓÍ43I;f0M«Ë’@;ûTFQfr¬Ô®Ž–óÅ6v©qs dºo1R]‡r] à“ߨ`Ãåìrjµ½íÜÇGÓ%pZ6‘ŠK„“nò€Æ¤“à&xwÅ «hÒ­ÍÞ“æ²ÞXCœ4D!‘H•F™ö•fi¯SÔ¿j¿|lð |1ø™¤$7Vj³Àl´»M>áµP‹$‘Cˆ¼¥BxM…™œŸ™üÃZþ7ñ>“áÝSV‡N·¸¿÷:–¡Ì–ÒÎÇ£±Ý ERªy “´6ÏRÒþiz‡¯üFt÷ÔtëWéÚœ±:%ÊÁ QÊ<Ü:±~p@´84£ÌÙÕN§*µÏ3ƒ]Õ4gðÅΛ%½”åhçF˜Ã–VBÜ$gs‚£@œMRëAÓu©Ã¢´—D¸‰I(vá 6ðIÏÊ3ƒÐ×Sâ¸ÅµÎ®‘MÀçiœÄÃ…À8#‘ž„ž›³Ó´‹Ý:9õM"¸”.Ø!]Á£$œŒmîÈöç›nVZhjë%+´T¸:ü×lÑ®„ÑÃå»’É,a‰à3Ñ’2AÉ ‘èz-_ƾ$Ö|+äx—âtW—αÛ[$…ãµÓ2ÆEÈEFeùºsÇ–¯©Ú[³éöJbÙR`J †S¤‘ÎßzÂû;»‘·#?)ó½9Ç¿ù"´åmY½;“¬“ºÕ›——WVÂòWT¸©§Asr L76#ù8‰@%“ “ùæ½ÚÚ_…]ω—_ð†±$° ­&´Öa¼‘¶¸7Pù0µÄ¬…“h Bù‹±–¼‡Q¹»¼´OµjfÎ9®Y§ÚT$ yAUX;|ìNà ’6¬|O¬Çáȼ!dšsY VÞâk“f"¹p b¨Ò•ÜÀƒ¹•T ílŽ¢"â–§:¨­©êž&ø÷¤_èqi¶:TÚL÷‰±_3#À¬Hš-ªÛ÷Jrìì#Æk³rúLj¬á‚(ôM~_™^æ;ö¬7“´¤ðÇ*®7©«ç¢×&·k´žÖ4ùmöÅå Ÿ¶1=¼¨9Û†ÜAÎç'´twÁºU·ÛÑ ÁE4ѾFÅ—?23®pG¨7}K…G-â{3SÙ§DU•„ê6ÿ/•ò±SÇÊ9à©ñÎrOS¯xŽßÇm§xZßÂÖ·/Z$úR•[–Þ‰£±ÎKgbØ' à%Öõ rù HÌçnÙî6ÈrÀ(UÛó`ò‚I·â®éúþ¥á»[^ÉvfÜEÓFå¢l€Y8ûÀœc¨Æzò-¸¦W¶iw-êþ Õ´ //uØ“dív£UA)’I aW`ÜÌ9r;ŒýÖá.å­pc1|«3“Æ;ƒŒœŒc·µnXøÇ>#/¨hÞÖî­šÞI˜ÙérÈ›#\Ìå‘I o;€ .95‰w-‘‚ 0 ²¡Ac¸|§p'¡äd9©çŠèDÝâgÿb]™šúY™[øU9$Á9ù¿—¥h5åíÃÅ ÚÛ„‚ª|”\)ÿt ǧ$ŸÖ¬éÑÚ\Ú®.ÂÊ[ïH͵W¦“Ï<à q’jKPº˜Ãmym–†B"~ìäEvMü»XôîiÆwd+îŠ>T­'ÚXÄHUÀã€sŒøýjk“w¥Ùý®(,-òÄ® ƒs@;Ž8lŽŸ0= ¦ÙO6—ÓÛMX·\ ÿsyº48Nw½y8o˜rrµ½àÂ56³ñχ/.t‹)„úÄv‘aŒƒ)#(a€/³ŒŽ¹ÚÕ®\ZnÆr[êÅ$‡N ˆÌ™eêrrØa†;㿉£]€ v…Rý÷•"ßwŸ”ôäé»Ò­x‡ÄÞ–þX¼;§Ê–¤È.QYÊ19 7ÆOcNñU´×Ûᆖ!ˆFAÛ’vÈpøÛ¿~šOVm +Úæ¾«,7¨”º†+;ÑH§žåêsÐýE_:…¥ì'íºsÊÍQb\‘·+œ`œ‘ÏñÒ®ë>%UÔnµ¨tkHÍäq*XiªÂ8Wbä(s#m;rw9'$“Î*¸´3;[–’Mäª#ýàÉOÝ#'ÝÈ46Knöl«i3˜ÛûRÜ%ñ8aµìÇË×®q裠©£¾†+ðX†Î I¤vÃóÓœ~<ÔÖV6rK&©>¦öòÉ3a°6€OvÉÏ£w¬«»Y Á°b±Â¼r('až„uÏ#5NJ*䦖…Vc«°7—F‹Â¬ † ÓS8ä~\å«@-d™c/Ìì»Ì—oZKhL­”ºu`ͱØ¡x’ Æ7dàvÓÄRË‹›ÇlolÈìq!ù† 'é^¤ñ>Ö êeíud—0YÈ. fŠXÎRì ŽF2@ëþñÀÈÍ_×uËoí.®MºùŸñ2–"É<Á¤'gÊ‚Ly%rw–Æ1T.d³Uxö0Ü1Æxf'Çõ}giZ 0I$ŠÅƒ,…Kz<üÃ=009â âÂêÇTÓ®¢ŠÒúÝáIƒD!åçørHÀÈ$dÞÓo¥ÒõFk£ûdR©UA™T€¬­ÆG>ÿ1ç“IûªÀ­nΘé:>¨Æö;…³·ºWˆ Ëy`ܧjžG˜ óœ8»mvëBÓ¼ö ­öd.{mAgPÑ«,~gI €éŒW–AâßÙ(ŠiL»äUV(”9-¼¶0¨ù*rr¤Ž¢½ Ö÷AÕïôÝ?^¾¹Òôë”X®Œª$O´ˆÃ3Rñ’3Ï@Qcó—w(èuBI«#’½Ö&ò|©õ«‰˜Î K£F”¹ß÷qŒ ç¶uæ¯ËæÝÌÓÈ2£Js°nIÁ'óǽzgĽÀ73=×ÃÝ?SãÊŸý)¾X؈+°Û¹¶îôÚ~PFß2Ôt©ì¯^;© ¨÷JH06NÕ$*ç½@'9¬ãu"jÆmbk¦² v«ì‰<–Î9äý3Ò™ý‰k-ÀíEGžD­ †p§nHÎ~l Ó8« ¦Ü< gÚ‰)v þ5#ƒ’08õÀ|šqÓÝ ôeQ‚å·Fv°?(#ŒqÇ85W±‚…Ö§$º¨·eš1åK.B£¹GðŽIÀσøÕ3S»- w³Ê!£Wo‘\§¶9õà|ƒY«a{1Ër,7£†vfØsÎCžÔqÏÒ½ᎅà-^ÖÿMÖ>ê^*ÔÞÑž BËÇÖšu¥¤*?×4onÒ7Í€CŸá"Š8$I¥Ý y šGWVwÁÊù FÈð¨UÜòIÙXüvðå·‡®¾xoö_ðDbòÚk­BIooïIYH$†ä¢JÌ@0ŠqŒc ò÷ZuÚA§.•£ÝÝG£[ÜǬY½­º\J—GÍ3$¸o.BÅ 8ɈîWÊ[R÷l\ôeMHº[Yük¡À=&xîn®#¼º@Å£ò’MÌ¿,{þTfÇ®¥çµ/xLxOû^é¬ÒhneŠËx³‚ÊIq:]Ü´„?0 å®ãÑ'f–ÓL´Ð(’)–tgƒUÂ8eë».¥¾C¬·í5]BÁŦ•qÒX5½ÃÇvØhähGÎCF„_x‚¨£±]H¤+¸GsZ×YŠå¹ðÓÚÝÞÆÑÝYéW9¸`"™Hp‰æ<*®IÚ¥iþ"ø“âß+ÜxŸTmFçìðÃÄä4‘ƘCgŸâÎàr‡â¹v´$­ä7ÃärŒyg\cè}OÓš’gžp™Ã¾[b¾;sŒuíôÅG5Ù›«)=KÚ¤Wú’}¦ÕÜ3»‘C1@£Œœçp¾MlZxƒÂ—VÑëûý”Hû4ûÙ6ߺ—®á¤*_zäÂÈ€µC/8†o!ážîv™Ã]À 0rÀäŒ:¸ã9XIei«ÛÝê1 ‹håâÚÞ@  ![€{sø¯jö%M­N£Ã~&øzÿt8¼CáY#Ò¢¸Œj ce$òÝfE!º‰ òS÷rCÃgpíÞk¿>xÇ>-ð¯ÇM#Äš-–­ ézÇ,e¸u·xîYYdcmö–X’7ùeåpÈ$G¸Æ>Öî'> ð5¶‘4êâÞîæö–Ủ˜ª€c`ÌÄ’MÏü;øñ=®­4Ña¨ËqxÉ*ê:—/™;’XÔ<Œ™#t“"᱆';N‘“ÙjtÓ®©­Œ;}~F¹µ²Ô’ OLÓ.ÞX´Yç¸Ì¨fÄo‘ïXb ÈÈìwg—pŠ®YB˜ÕŠ9ÊË»©ÃgŒ“Œ“…÷5_]¶¼Ò'ž'Ó¥†[xÙgXI†NÜ1À©Šîöi}E6ó°èåKŒœ“Áë׿={óW4Ño§-¦¥i=´-+º%´w Ê6°ÏÝ9Ú7c#$™£5­¸%’7b¹ÞCdÎ0xÇ^§Ö¨iÖ¤š25Þ ‘ËüÁo0r,ƒn;g<ñZûYrŽ5n®Ž–KÛù½¾³æ30dÚ…[zŒƒÆÀê8À銗—W×["e—#s¸Œ<1$ñœuǰI.Œ›ü»™U€U ÷ÚI9ÓÔ8«ÎZ6˜9cåFò@ãl|Ý}ºTJShÉÊMÝ6rÙ¢E¦Oo3Ý6$»G²LU‹ª"ýxàuÆ3J{Ø Ì3yYŒŒýž@ëŸ÷#òúS§h¬£;,Ù[€¸8Î@ª2Ëp¨­ 1«d¬¼mÏ?ýj„¥"´“W'Žõf,±MŒÊeOOÆ‘WÉÍ­ÄOçÄm§ƒðóÝéwp4lÞdlG›oƒ‡^Ýûwí϶Œi–¶v÷6×)¿Ï”1!p¼ƒžÜ—=9­$bše}/ÃÖ:¬ñÙi‹6ý½’$fùØ…'¤Ù s€lGq¬­›i¶º¡û¤òIÀ‰˜°ä ÚÅ•T¹%Tv¦A¨B"+ e›Ì*­Ÿö~™üþ”ÔyÊ67‡€Àîn¹€=Iæ·Œ\R·ätF|©8èÇ][½êKª¥³BÖ±âIT3fã€Hù±œ°éŒž„šM×ìoå»ñŸ}(*%–}¡X¡yPLÊPùŠÌ¬7| zœŠ»ywq&6«¨]X^Nó´AY™A8J¦Ò§ĂÅÍT·ñî5›BÎñØ^ÎÖú%ž8ZEÚì#‚¦H^vŒçÕ݇)G—Bm+Ű¥¸³·Ó·$A"G1à•Ïä`´±Çbr66·±¾™t½6IM°…ä†7-•RDŒ Km•q€IÓUÒµûë+X²Õ&·¸…äÓãá]š›ÂªÒ¶"¡2);ÒªF $âýŠ`ܺnˆyj‹!Ì|’vÓœðëïIR’Õ N¤b­¹ÖOñ*öÒÍÒûÍóŸí­*r # ÜäaOÓRÇűë¬ó^YZÈê’‡š8"%™Wl® üåGÈĨ,ýurz¯„”+ß±˜ÍÍœA£šM¬@_õŽAÀ}ñÈõÈ»¶°ž`Ö&lžv¼{J1'¯#ç×ëÎiòËP•jÑz3ØåÓþÝ]i÷cÆBþòÞ%ÕšÛ4+Rë/ÎøB{@Úå¤%¶»œË½sGÒ´¸MÎqmÐËqcuxÇʸ‡; RW,…—ŒŸº(«ÌLwHÉÕè…ðLŠ@áq€NyõãØRGuåI¾ÕpÇÈØó7Óonr~¤àŽ•.Z»¢¾µ>±9kv‚{³xLfR˜ÜoÝzè3ÜçÖ¯,ÆbX6@êØ ÙëÈ#؃ùŠ¥Ò[Îßd·ÑÒXCì= Ëòœñ\N‚쬂_(ʃ§~3øÖ NÚnsoênê%šêÒÛJÓô;¢*Ý–%Ã)JÎ †mÅŽ1…,s’7VaÔõI¢¿ñ¦÷7%Œ›Áæ§•:$ŠVÚ·C¡ÌŒžpxÊŽ 8äôïÆk>ÒEʉZA@]™òO®pA9ç84’\l‘ž1Éü ¸;~œÿZ½Ñ¤mË© ÒÉ2spQÀ!WÉÁÎq‚1ùçךm½Ý§˜‘#¢äî2<ÃîGC÷sYâuœ22só+³g¿€ë¢ø}ðÛÄßµIto ˆä¨’ÞÍ-ä1$q¼‰%¥‘K8°É qšJz!/#:kÆšVYxY Û È<çô©­P̓’wÛ¹c’‰‘†çk{ Q&„‡r#r[ý^?„ŒçŽGà} ­;W¸ðûxnÎÖ|›µ}±íRIQvòÕ™w<ì@då'æ¨F÷¹*2oA¯©}¶V/ ²íR72r=ÇÚ‰–k{‰6$£z ± Œù#Œ’:Ã9 °ð†µ K笑‹gTvå² å’:Ž äà8¿³QÑô—š÷@í%!Rõí™7 Y±' ÈúRåW³Ð|íÊðÛÌÖð•YaU’hƒl ŽÜŸOZ[tÔo&šá4ÆÞà"—‘±Vfç*3ŸºF›úoïø£ÀšïÄ-OÔ.4Ýx"¼{m2iÄ/)leSK„oõ¬€ã<á±Í­hVfÞÂÙá1J$7ÖдLƒ†ÞPørkEu$Ó\²¿C:«Ë2<èYC)hŠJàôÀ=H9õéZ)u)3=ºF±ò–êxÉ8¬•·¶šÖU¥˜ãåòÆâÀ÷²sš±ol’Q )*JžsÔdÏ·ãÖ©sKa©ÊÄÿÚ–¶³Ä·Wd ¢É©R­ËÀûpyô©5_Y^ê~`Ó¼µfB“«F;‘œ ãc#·MQ»Ñå‡7n›Y†NyÇl½ý=ê-=`Žirî r1ÁÏcß>¾ØªQ©k^´“½õ/[\£Ý‹«(Þ†Fh_í ¾^àŽrNH\¯«r½–+»8öÍ «Ý22€³ãnG Ÿž‡ sÈ f¡·¹ò¤ÙÂYó‚àr ?çÒº(™ä•Zl)1` ‘€9#‘ÁúàUO™FÅÊRKBHõMJç÷’(cd¶Ò¤Œò:`dýÒ ŽþgŠ)­ä’6ŽUcªª¡n‹æÇBHéŸz»bZæ52iꨧå8Êœõ Ó?þª­©Ê÷1$ºÅÕÃÄQYæ%•UGÊ£ qŽ;v¬dÙóÕÃ~mÎót ®XJÎpǑԓÓÓžÇÔÙµµ[É?ÒnÎIÎZBr3’K×<ÿN+ÅD»Ø¬Ä*7$ñÀ9éÇ­)»i®D ã,aæpN6œúóéÓÒ‡Ë{‰®­–¼ ñCSðH¹Ž_øoZk«±$‡]±’EhÂH¦±Hª‹‰ õdÆWФMwR’þÃA³Ó‘¥wû‘’0Yˆ %bÇ‚©!S'’ÄÐ{%’Ê+ëíîQÊà*98®°â‡Ôâ+’Úï7’× )]ÉÕP#`rH ƒÒ¹ý«kRbå{’XkÚþŸ¦\ørßSºŠÆîE’êÖ)G#«îÔ`)=‡½'Ê“©u>NÑ#” 36 Qê22:u^qƒZ­á¯ÜiמðíüöV6«>«sc iÉß&Ð@UÊ’Ù~µJ &’ÐZÚ´ÛÌKÝGaÕ\íÈ „ŒpŠxÉÇpUß«-6÷öI¥ŽKÙmŸçÎdU$nÆ@ééžÇ“ô©fµ¶ŠhôÛ‡™Ð”ÈÁBž =OLô§ ôåy­í–‘ Æí-’2A zu8ROÉG7š…6…2°ƒÁçž=ñ×ò•¦†w³*j7—3Z[Ç)”¹-±%làü=qÜ㎣¦9Šóc )U*Àlcóõý(i£VÅäHŒÜ\…üü°Iô¤EÎÀ·R Ÿ1 ÇPrzÕ= WQеmc5áßn©b œœôúwëëZ:GŠügàäº>ñ£§<ÖO –²Df…Âî…ö2ïVÚ¹^øÍgVQnÖÇn%Ù&A,ÙùIPy¯Óž*żºyÅ­àEÜÅ–fPp¬AÇRÊ;ôlm>¤RII];®å¡_G+£ú‹F#…L ‘ŽXŒÊà•É8;³‘Ô€F¦¹â¹µm¬m,mm∣¬––KÈÊ YOÍ»©é‚K8Q…®4=,]Mâ?Kª[þíl“íRà Iæ+’æI4bDº9l‚)Ö:­¾‘¬Ûëú-…½¤ö·"xc@Ó,x}ê13?˜ m_Ÿvì|ÙÉ&“¶ŒÑT²å!ººžÞge}±rVc ˜%[–ŒàŒÓßÕþÖµê/yáØ÷ܼMÆöÜ#£RUqÁä¤3ÁÔž-ñW‰ÂG™ÀãhFòäÝåtÍÞÏäYK p!snÊÉçÌJ·¹öä⯑·vΉQqzêgéqCi#6îE. i½Ôf0†Épx*tz.§=„šMÌ–³FŽ{–êåóÁE=@F2®Mý›üsw×zg‡Þ$kwhd*ì$]عf'Ëá@?9;@LSü3ðmu-îÚîßP]Z80Ç`Â+u,Xà–Ábª2%ø'³ç¬UꨜƒËu©Ý‰’È<¸ Š ùcù¹ÆÐ0óôÍhxƒáÿˆü3¥Úx’·¸³•ã æ6ey bÃ~ï^@ž@¹Ñþ üAðÍ¢ê~Öm5Y•—O¶?;‡ÈèÃi'+žpÊO8¯gñ§Áýþ[O|dñŽŸc'…溵Ôt½LXiÈV¶3£bÌpÈÌ #˜òÔÌcϪ{9ê|½à‰¼ ¨k ¾ kšú(Òóþfk¸’«ˆ] ˜;ŽÐ^x«ø«ÆÿücfÆúåΦ`˜Ê/¯åK#r ˜ÞÀ³?1’Iã#´¿ðç…|_¯ð„ï nw}²xÛɉG-¢»J—Âä)*ì ß‹rü0Ð`Óη¦Ïes¹+c³Ï ÃJÂWrò9òÄn$ë#±ó‘NЄN1vêW"ä³m~G‡{Ja k$ò\ŽÜŸÛœ7èxÎ@Ï'Ÿg³ÙÊ&F)›$Mƒ !·† ш?LŠëtoëŸâ_}Š¢-ÄI3d2ŒÅ/yˆ¯Œa[9<Ó×´­gÄ÷‰áïO¨Z9'¸¼HÚ?6U‰'˜,V†Dª¹ ±JÀÂÖÑqÝ)s]®‡ ×Bâ5vLñµœòqޏ>¹«’èÀ3I˜¨¥!VÞá˜dÏ¡ç#¾kwZð÷ŽþêƒÂÞ9ðÆ«¤O3ºýŽú6‡ÍتÒÚü²äƒÇC‚#Õ5o]ÔþÛ ÃO¨]:D’If| ¨ ¼g?0÷õÉË’‹Õ‡³ŠÞç=smyi7‘2\».xÀåZzw† 3Y)¹Þ~G9È8 ÈÛœI=/hÚ~‘q|á"ñÍ”~[4/§iKtìû²£iš£’7'#¡§]iGìký4ÒÆäyvÛ!ð@È8Éù{sßwU{«;ËkSq%À „ó‘†ÂËAã†ÃrÓéDbÛò!ÆNWCÚÝ—Pg–¡œ–†Sʦ7`°'§n}h[yî$Y. –b8œœ1ƒžÞƒß­=dŠeVÑdoœH¬X†Ê¹Á†9êyç&®Úi÷ÆKéZ!Dùf%RXç  °$rFBòØn†ýÖ &ô.øÄVž ·Õ þƇP–öÔ[[I7˜l<Å22”u!˜.Üäàg$Ñüjø›¡x3ÃZÄ ßiºc]é±®•¦i6 âRña]Ý‹œy¤<’4Ž  á/µ²[ ËÆ)ík¹£ÀÎ ×Ôž?åz÷ˆ¼Mñ£Æº_†´½>þêÆ š8 ˆ³:†gf8\Ž àç ½uáhJ¬í'î­_ùz¸JR”›¶‡Ùÿü#ñkÄ¿eý¡$ðG„µ›+íGÑ´írþg¹š;_³Épße³-æ9E DårŠÎXùqã—ÏįkšF›yx$´·òã´¾ÑÓ{*(m¤PÊ@·L±1Ùø©ü à]#CF»s[Åiüª¨ÍIÑ|·œ&çÎvv0Ë-׆¬dÒZ_&HncgÒ&<Ÿb¡F2Ë…¢²QU㡵IFI-O®~~ֳς|!c¯Aq&ºoM¦©¬øŽx‚(8Fb±°wòÄ ÆXü“9•f’Hà Qñ¦ÙßÇ:…ƳðÄ^2Õ'û ¨}¦È*lÆ-Ìc…•¾ê4žP\0aó×iÚö¥âéÞÓno/ÎK›k{0¤©/c>FÐù²2)¯¹6´ºT6WÓj_";hco´4€ù{( !Ú<ñÎETåÍ¥ŒHEr“>«©[xˆÞÚk²ÂAy‘í•#\ÎHUS#?*íǰÈ==ÿÄOøÂè;jYû£¸]jùSiYÿsæ>Kn'÷q°%˜ƒýêâ®,õm:æ[J)£¹0™.cÛ,2´£ªÁÏ‚>ÓkŸÙzDÓØ@¶:´“ØÂ³O-³4V¥—/å³1ùú¦ …;F@ ´sÛÞÔŠrp{ž‡ñ_³ðôš‡öìktбÇg:«Ã=——"(1àî!QJ9É]ÎB½cjüCâ©dµ¿Ñฅ!R$’Ä£QµK Ú;JàïnbXóZŽŸhñ\j.bKx×hO fF 0æ%,Aùº° 8'ÒyÖ=ÑÛÀXÜB<Êß4»Žì9qêOQÀÁ¦ÜJ­]µcCR¿—P—6æD’_-`HßË êx< cŽqÓ'œç®ð^«ñ ²AâüP½Óïü³ipúuýÄ3i¹–8DrÊËWˆd· İP<^•wa5ôRëzÜZ™¼³K‘ Œ§'P·;qЃŠÓð׎¼aà¿|>ñ]î}ÅãžÞø‰WåqóH™×ubW ½†}µšvwlŠuc Y»ñ3Ä¿ô;»Ÿ|Y}zÖ{‚·wöšÔN'œ:©I H¾c+*¡RÒ6°õ®> …°¹:…”N®¼¡fÎ8'—^yà~ô«~*×%|ÕµcRøØ|@¦ãI’çÀ’ZYì¹òÙPϱídfb\©¾S¸Ïø¹¤|+ðÅÝ…—Ã/xº ­c¹»ŽãD¸°šÊr¿½’PÊd2olÆÌ >ÒÌP»pÛtBë7Q©ØQBu+œ¼G>ÝO52Xk:n¿‹£CÅÕıýžÞÝÖFwb  Çq Ž#8àñO™%©^ÓÝI£jÆ5¹· ·‰d"%a÷Iá¡ù›yÆFyeÆŸb?ZX^ V[¯.ÊͼÇbÙ ¼0ù‹1d `ƒê>Zͽ—XÑçGS5”Ñ\DíY„Âü:î)÷ÍÁ<òsÐçOÒµ½mͦ’'¿dVfDSˆ#?0ü£ksþ÷<&R‹Ð¨ÔNV[ž/íg§øBÓÖžŠîæÓjEw{2©ò”m1–ÀRC1!p3ÎB×­øÓÄ>8Ö-µðí––÷VÞòsöXçÞåUÙ¤!Bàà–8\Èä×¥ø¯Â¿¼7ªE¬xƒÇ¶è’iqïM9g1ª¸)O6â«„çoíKៃú/Í÷ˆ­¼¯=¤ ."¿^hæQKÞ¸Ÿ¼H!XÖVîìhá[“’÷8Máœ7:ö§¥üDñn—kx43y ͽâÝZYJ˜æ–0âVû`ÜId –ùF^£àïÙ^B&¶ƒRŠÝ¥][Û-Õ¼øi!.¸Ê€yà˜Az-·ÃÛê)wâß„þ'ŠÂYÂ5¼whôW?0 {Nr¹2œŽM/Å[‡ú–¢–ú‚oô-fÙ–7Ñ’5‡` TM­¿s(é;Ž 'œ¾DüĨÞ5Ò·©æ>ñn¥à›ÆÔ4´€‰ö ˆš!Ô¡HÀÁÁo˜a€cƒÐÕ«ë:ß…†›¬ZEsibäÔ$#Ûg°BFó„#’>QŒæ²…Õôx–òÆWT‚]E9#çá·yl0Á¸ çÜtþ ðØÖ/ãD6–²]Jæ59Õe“  òØ©;€ 8À-òìä´b­c:nRj7ÐÔÔ¼ £øoFóõ‡Žk–ònû Œ*lË© #9Vp¹R»HÊ»ðg†¯mMî“=œJË)Ým`LªL¿~@θ8ÞÁA0Ù»X5_ZËcàÝ=­µˆ,¼ÕÒSOœ 2J±l$‡÷nêμ)Ü”ŒÖ.¹ñoPÑ~.Kà™>iºE¦Œ©{}qm>¢n>ÒÂ3NÒÝ2³ aO#æe¥*u&›]5g[¥¶­k=¼ºÏ„ï6x‡M¹‚ˆ«4±•%waAb§oI^ÙLõPtF­c«¾Óeš;•‰iÝ6\6ÊyÉ?{韼µÒx§â†½âin.ÓÄ–öHdM¶öÚ4*Ål/´HøÈ$ž ô|W{á»;©ûOÕ­-îœÉæÍnB‚@®Ûs¸—p'žKTqÔ¥ìþ ÷ÐN¶iõ¥º‚fe0Ú¢œˆÏ÷ƒWÇ<Œs“WQñF‘x£FÒl/5 ,C™4ýÙ®.€gp0 ’Èðæ¹û_…þ<ñ>¢ˆþ,¹˜\\û5„j €óÛv1»œqÖ»ïþÌ~"ðfŽ÷Ú­äö6÷^dÍKþ‘zªŠ«Ù× –?ÅWL$›nï¢_æË¡I'wïy›âÛ°H-Ó¿J–CHPºõÞ¶@–uF°·c,­I'fð0F—¯ÝäÍËÝÑ™)FþëuáËȧ‚ùus1‚%vž<¨¶xÇ ¬~öÐT8 Ga¨êÞ ñz¶ãíµ2ËÐL{ÐÛ7”ÌÌ… ã_ø}i3è~¶h¬Å<éQb߀ʦf K)åv’¡p+‰ñ‰ão k×¾×ôÙlõ :þK{Ó$±µÔ2$žT v«©PÑä1$ŒäRKZM:R¢îÑÄ¿éñ¶§àÝ5Þxí%>EôZ•øxöŒI¾Òi¡ùÎXªJÁ7mŠî<άn¬ï¨›Í*HÝ ƒgSó!> ž½kZ=k£-­¶Žö‰‘ûÖYKIÎÓ—-øŽ8'‹~4ð‡†|¥ø•¼c¥ÝÞêW×Q]é–·^mÅ¢D "I]’y­´‡È18ØqS&ç±Ë:ri´¬`ÛÛÆ-’òâl†?4J[p9’8ñÈo§wÁ}kiû´²m‡©fÚNûC>½½±U­æEŒ0%YJ‘ƒŒã¿áW—N²ŽáÄ ñ±Sìò÷1Æà@-ެÝÏäàXÔ´(,/ÙæiùÂÌ[iÿ"¢ü¯rZq÷®a¼K,5VRd1®õÁàžAãÔÍ3Pñ?‡uCâ òâÎá#t†âÒIeˆ€ nŒƒƒž€žã¡©u-Ûq9!†]‘ÁÛÇ9éùÕ)fJ“O€¸! “åg'‚¿w$W$Ó"®/ŸV]9¹«šOàÿêú«7‰,oD÷P¤×÷r‘˜E"“òG´½¾UÆŠÖѼ%ã}H¾:uÄa™{¨ìníæY¼Ü"«˜dm m•”.#°'ŸŽYຸ–ÃTš;JDME…Ñ q¹ñûXœrs…&®jº•¼æÎËX·Öî­ãfae„€è¬È¦AµA%K) v¿P-û«c¥8ÇU¹öGÄ߆ھ¿2kšö­^ùw6Ö7ë1ÝÅ ´™&’Õã¹”xql).¤1$ðõÿƒ—Å\ø"ûU×4Ý[JÔvXê ’8ÍÔq‰¶ÖtYÑÔœ€ãý^Fz7ÃOëÚˆ`›_ñ•ym¨Gµ¾AqÖëŒFÑæ §£>qHùrßüDÒ<ã ©¦‹Å׆ål´XM}öGb$ØÝ6Cß*n-³:2§…õºô§¦ëUýy`°¸z´õvOGÃæaøV„Ÿ³ÿÃ{_ƒIð³Q0ZySÏ­xN[›BUÞ Á¾éQ¸Œ›Ï¼}⟂Þ&—þ[ õ=NBY’ÚØiϸ«î7Æ€>Ü"1rAƒŸ§>|)ýœ|Eá-KÅ_¼ ¬næÑõø4m~Íå«Fd&8~C!2˜‡ Ur‚ŒY~ü?ÖVK¯x—HGµMͧj1¼s¨ØÄ“Ë1äÊÉ¿Ž Œ5r¬Ç O&¹¯»õßÌÝ`k{òÛ§¡ò—ü+j77.Ÿñ+DÔ4æ@fÓnJE4PÆ\e·.·|¹‹2ó£gkðÊ=u/u-Ñ6Á Ö㔡ø-$XÞ¡6>bB1Q´Šúkâ‡Ã ËÂÚ”—$µÔ0Ê-,â7Kyò+,K2+;¤••Ñ“ä.>xjÂÒÛÂÖ±ê³Þ2=ôšn·t‘;»Â,ŠØPp%æûÍ^æ,E¥oäy•ð§/{¡oÁ? <>³®¥ñ>6[á"ånEÔÇCòÐp +o\+7Êp1\ï‰þYjž"Õ"øonºŒ.älmžð"„%Á]åøòàuéÈÔðÆ»áý/Ãiÿ…uâ+Áb³²ÕoH´b0ÎB²>‹(UtØ7n%jïˆ|iã¿Û4vöíe¦^y:|–rM;¼H&hÉs.ðŒ¡”áþPà …À6ù”Û9êÂI?ÃüÏ#¸ø¯hú¥¥–¾&†)fýâÌÛ1Ÿ0`¿È·#sÖ±|EàýfÆþ]ÖœZÜ•Žà* lã®Gޤë^ááÿ išô—:ØjÚÊÆ6ÖbW–1l‘¢¬’ñû¶a&ÕCެ~Prs,þéÇ|ºU…ì¥îß`˜ýØÙˆPê9Üq´à¥zàäÒ©¹ÁSê;Åaá3Q¶–O’îDfr¶K“‚IŽ6ªäu÷ÏÓ¾ñ=—ü#¾²Õí|C§ÜÜÞ»?üL.åíŒ $H…IÃp§ *ÛúÇ„µÏ ½[Å?˜X›<òðäc€@ÇW%ã }VóMkÍKG™¢’Q%ð}¿g±•YpJ Æ ‘Õ³ƒ‹Mor©ÑžMjÏ6ø‹â½'[d·º¶¸7,š -FQn$BK\ìppX‘÷H’G¥bÛjšäâÖKT6à7ú2ÚDã#æ$|ǯSŸç›÷Z&© Â][Ùì%¶ˆ÷)Éç€FyÈÈÖì·íèÌr ft—lj„•îo»zãCÐtM=íôË+‹[7O%eŠF’VEu΂Êc6“Ò¹%^<Ö[žõ /-4Ú'ñ$>¿HüAáoj¥½º[8»Ô„îfÆÃ0‘cn •‹¥Âî#mrwŸ‡Ø¬–—nIöxmI!o3b#,díÀ „©yè;}'Emzé#H/¯LÀ•ÓUK<ˆåÚ¾Rü™m܇>‡ãÔ®¬@©fbr[ÇŸ¼@8å¾8ñe¢GÑî7üŒðƒ×1Oz8ÉsÙÜ<¬o*Ðáo-©mæIQ£C#D‘’@ä €ANÇ'ÓïRXK;L7 FÆGÛ’Ë)çp=OSÓ!—w1Kûéîb2\È’+ÀÏBòFÃ+¸àŒŽN`·Eá?jc_j†`Ö¶¦KeJ€9º¹ãß=¸µïY3ÍŒ%6”V¢ÙiEmHÑ r û0ÎPŸ¾pH<œç çñ—SÒ.­t󩸀"\, ¼A fW< ù™@FÀÚ 9eΔÖŧ.µ©Û$Æ)W†M¤ä“ó`úà#Tš{O ñ÷$Ø þ½:ô=? ÑR‹V5©¬˜ÿB˰ɧÉ8󔯹*ŠÁ†[9œ‰u«WbC,Ÿd“vTv¦äúðÓž˜ëX>-¸»…£ƒNaxYÆ>}ØÁ'Ž?ozý×õ'㺞âf òï$’}OJets¾^^Fµ/øŽØ@­$va-ÙAy<–瀧R9çoZÆ·ŽÏÊ[Ø®JØoŒã-ÜG>p+bÃ\´¸´]7^œH»dû<¨·›µB«Ã÷x_RFÓŽù§¤X\ÝܼÑIÙ¥o>À9Tàóc ÕsX/q;ô9'ËN7èS»:eÝÒGöÁ²\–]Ê çåäàñž1Znµ­¼ñøoKiÎè(Ë÷·—qÁÛŽg«7ÕŸDÕ_I“ÃãQ‘l.9³K‡He);ü¾XûÊ:ל² åŽI$j¡2FóÇ_»’Ç“ÀϯJq¬’Шղ÷Oª<5¨½·…ÿ²uÛh,¯-à„$K§µ´²ú*‘Vd¼aâO„VW~“â=ükªé‹q©h·ÝÁ.¥<»å…¢K¸%]£•”ª¯ Õßêþ4øgaî±àÛÉmg»µžXÛ|„30- gà•ÆG¨ó¡àÿh>Gñ˨ Šv²e¸ûtöÑ3†YSç ñƒæ8ŒÌóŨê:o‡#›UÑ,ôǾ½xmu9šòF·pêŽ4®±ÀÌÏÈŠÀ#Ž+έ‡Ãb'Ïü´;¨Ô«J<¬ÒñnŸðÏâ÷„n®<u-æ¯u1þÕ¸’ÔG#m1¬p4jì0Å·ƒÎÝŸ+WŸøáαáxl4í8ÝÿhýªæûiÐÄFQ½g³ ¡e.±±c€0ÛŽËRñµµ†¸ºŽ¥äÜÊêâÛC†Úòh·!”ÍϨÝå³.\°GaŒ“W| âÍSÄÖ÷Oñ.ÏVX¬\MmcmwrLFF‘Ë–Nx‘Jê6²‚FªS¯„¦Õ7uæõ•T—:³<[øY¨O{‰îa·šyd2ITÉçQÄMòFF7)*£@<‡<q j7‡[Ox,aó5hÌFÚÞ?3y1…£šmÌJŸ(6ƒ¹²sõ†§üñ¿Šeðw‹,õ« ´´{ëmf="[Km…ÌygEÔ–;2JŒ«Px‡öOƒÆ¶&ãóÛjfHßdÌÒ<ɘÙZMë• Ôœ Œe«ª–jáUNÇl¹NVƒ>Uð¯î´}z_ êšjßjóLjQϘ¨Uƒ©­’X1ÇÊé^…áßøm4»M÷Rh‹ÜÇ5ž¯e°©¹¿*®ögS–Qå°(ÎVºÝgö\Ó<5ª_x6}P{ÙeŠ :Öí„?h‘Œ»ï%÷¼Û»’-ÖZ| Õü%¦7Ç^H ’#6Ÿ¨ÜB’¢¤‡2þ­Ì’AËbª®3V)Ãó -z¹ãñË{5Æ«qrQI00ºˆ¤Îw±ó6;m™‰‹¸'§ªŠÆÖt=xݬ>Õ¬— Ü]^nŠEa“º@åV<žRc$ó“èòøcI½¸²×5;y$>j;\ƒ…–=À:( XŸºrè uzGÂøe»žûO¿2Hò6!1^/CË’=O¸¢8Ûj¥ƒRµÏ _…ðiòÌ×:L·Zœ®×–âe+‰7¢± 0$€~\çnÇᆟâ½~{‹v†F¹Œ-º^,VâÞuf Ac“ó0`GC^—¨xì(ñÇjÎö×G´…WÉR«ºAÁ£6ñdàæ¤»ðŸ‰eûTPZ¬Km剮–¹› ÉÛ#æÎ2FsÀcGöžšè'•Ò{jyƒhºežž¿`¸ŠKëW>j=§î•y ‘€¿ÄÐYNघtÏ øóSÍݵ¼¨Ñ°–k±§Èc‘‘Y˜+•*Çû¸òFÓ»äú¢øK¥†+}6;•ŠζDŒ1ãî°Êa´î#¶ [²K»{k¥K0,ñYÏ#Çl…T Hp3ÖO›vpÁ@Æ0hû¯BVT¾Óý$Ò<+¯Þj‰ Ýjq,J¶³éé$«tIl"…_‘ŠœÃr“€24WIžÆµºšþõ’R¤Ih¬Ï »qØ€žw O qÕøÏÁ>*Ô£½½ÓuÕ¼¶†c$óYî0 „iAÈÔ«¨-†Û·||®ãÅÔnt&æëÎ|ÈÒY–wFÉ`Rªø%”ñ‚sÇVô$ñ 鯪Ea´¶žgy¥^ëI§Ám|.­Fù!´´€2º)#tr4N2«òýü`··÷Ž4Û}BÙå“U²3[–ºŽ?· äG µ¥>Caˆù…ûà ‚°éwíóÜ\k7—eòŒ‘µÓ´)>ü–#‚KqÀp0ÙÆ_¤øRÑôu×ü5¥iðFwÛÿhßÄcæyI?ÎäÏFÁmõ­8ÅJíêcV§<,–‡™x‹[·ÑRêÓIñ]ÝÂLL’«©XÚ^§åËyŸ60Aäó“Ðy.±¦kZ®£æ¥µÛÛçd~R†!Ù~U#ùàæ¾€ñ‚Ú}3Sº’Ý­‘ÒÞ yÌ 1„ùò㌌(!˜qóÚ[/¥KÚ*ÜÊ §,wP` ëÉØOaAM7sç±TIjô8Ÿ x&þò#nñ$’„D{i (È cn€€2ÌפÃäè²XÚKe9uòím¡²¸Úwn,–E(Agc€A$€U°K¼1£ê·:¨Ô5;{tŽÚÈÍoå-²ó¸³óaYÀa6ƒß5ëþÐü)ã[‘c{áfëQ°º"ÚÞ;XC9R¨ZBÜ…$FÃvq‡ùZ—;ètÒ§t¼ÙåzçÂR÷ImkOФM.¾ÍÄ÷,×üÁAùÂwËœç`Æå!x-cH‹H¼{yãtyd•†W88l €AúÝû{5†§Ã-6|TÔ55M>|NË5™ŠA+ɪ€ ¶$På ÆH>sã­VÏZIm¦k9o$Ô´Æ4‰!„å’!PAÃOÉ€¼g95AÍHç¯J sGCÖ4èDPF_tBBc?3ÿ!ŒsôÊÊ×VzŒÖRO‰äùŠá·®OB@Ï=‡ö¯XÐüAð÷LÐæðæ´Âü^—†Gw&MÊsHþ%ÆAm™ç$3Å~ð÷‚Y5{›i­çKÏ0iš„ñ´â"NÃ*pWxR@ äv5s¨äÎLNQ¦ªA§ßËÖ×/xá Ú®ý¿«´v0ÜÊñé){p?y"vÒJ®ÒF÷{–Ôö7ñK§AåÔV1/™mme.v†Œ’€Ô•ïŠd¾*Óük¡ZÒ¢º¸·c»[+1G«:Œ—ÝÐãr€F*h:ÔºˆÓíã‘d[ŒAoy½¶UÄŒó€sØß$’Z™×†.1¦®¬µïry5 OÓçÔn¢6‚Þ5Eòáó:àÙÉäã’xÎë~;¹±±´·°ºFûÅd–ÛiNà¬sÔçwÊÝ'Œ£Ä_õ·a‹¬dK–”Ìmb¢…UÁl…bXð0“×€|ÿZŸO{9"ŽÝãn4ÀYpVÊ•8ÊžØü†)¶¦ÒG5VÚå?ÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ýü¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ü¾¤ãþ£ø\Ÿýç§/ü²§üTáäÿï=w¬¯þÇâ¿Ìæúæ}£÷vŠü(_ø=<¶?ãZéÏL|eÏþáêDÿƒÑY†[þ ³§Æ,ÿî"´Y>bþÇâ¿Ì—ŽÂ¯´~éÑ_†iÿJíÇü`à÷ÿ…ÃÿÞŠ”Áæ“1Àÿ‚n7ãñÿ½_Ø™£ZSüWùóvrüù¸ôWâ §ü?yxqüt’Oø½Ÿç¤UØ?àñ ¾ÿ‚zÉ @ø©¼þš]kÎ$®©~1ÿ2^kŽóüù¶4W╟ü—÷(àò¢ “üWTÝø/5 àîrH¿ðOÕ ôÇÅoþõUG†³¹+ª_ù4ÌÍçYlwŸàÿÈý¢¿üæï?‘üä7<°ø±ÀÿÊU.§ÿ{Yép,¯ÿû–Voà‹â#>™þËÿëPøk;Jî—þMóβÖÒSüù´TWâ\ßðx…Ú¦ë_ø'¬OE‹AOä4£L?ðxn½µXÁ5'’âñ~?Øõêþqÿ>ŸÞ¿ÌÓû[/kãüÿÈý·¢¿GüpÙÿàjŒ$‹½?ò“Ußþ&ÒÒ&?ðO°æ%,ËÅ Oá»Jü(|=œ­éäÑÿ0Y®½'ø?ò?n²CE~]Áè®.ißðM)f„ŸšWø¿å‘ÿ:Aþt±Áè &KÁ6¶óÆ~0ÿ÷ž±þÇÌ›·³üWùšý kó~gî…ød?àó¼õÿ‚oÿu‡ÿ½ñÿœ«>Ôÿ‚pgŒçþñÿå=Wö.fÿåßâ¿Ì—˜áòüù¹TWáŸüFzàìoø&ÙÊ=1I<ãõ©í¢’gP!-诧„]ì2M%©,Êÿ6ÈÀúV¥„×,  $Ÿùè%”W¶¾”J±áš<îüë§Ò­õ‡í—(UÊÂaä>€žâk×Ãaù÷gŸ^²ŠºDžÕ%f Ž1ó*µ„uÛSMŸ'œ˜±Çã]†“ …²)·»ÜûrÌP ÃŒþy§jöV,’K®Ivnlþ,kÙŽ”avÏ&XÊ®vHÃÓüÚ˜x}åûVÌûpjåׇ,ÖÙ`ЭíPnËMpĶÜu3ÌT÷Úýºº}Ç©Vnxüfj:”“»4vî™\yIúúÕ5F1²Wfqu¤îô6týÃÚu²b[9 }ï5Ç_LcOÄÞ)ðæŸn›a§»²”uRç9ÆHéÞ¹ógc‘æÁùbÊ}ùÍ×GÓ#Ý8ûÅŒJ™Vš¢’üËŽ.\Óm–WÅšªEå¥Å¼HFAµ²$Ÿp[§åQÚY[ÈÞeäs\™_q{¹7óìO£{”HÀµ€nHÈJE»‘vqê¬9“’rw7äI{ªÇEÐô¨~ÕªO´/DUê}rž'øƒ¯kº„š„­šÞÈF]ȤçÓ1Þ¨FÚ¢o¥ýÒœìŽ1œú䊆+8‘E¼CäRO=I=þ´«Ô©V*v^[…p„¹¤®üöE];D¹g©js\¹8ù˜¨ÏÓ<šÙÕ<7a¤é‡Q¼ˆ” nlàwàÒiæ: ‹€JÖ‡‰µj3KFMÔ·3í,ž9 Ëy,Ä’Iv$~C´¢†Þ5ȹ‘ÂùdšEÓ@±êhK0Ï• £?ΈC‘l9JïqïåC·d¤Ÿ¼ÈçÛš·a2îVdw¶v55¶•qr7\Ü[D¸þT飴³‹ÌûbÌÊ@1Ç þUÑ´îÙƒ’dÐêV[š%·ŒMÖ[é€ ®Z1ÃA/Êx ­Š«öÕ2ºÁ,ñ…?J_´a·TãÛŠÓžIîgÈ–èàc³$àŒ{“Š»i¤° «(î3ZÖqés$GpþѱO³‡žž¯ÿׯ.ŽZ£Ð©‰’[1úž¤ª¢%.«ÐÌ?ŸÐYé7·ó(þÍgeç$þtí7RÒtðÌBH¼þ9Íi¾¸¢Ùï4Ùºǹ|ÅF-ôÈ&½º4iÂ7lòkV©)h‹º^ŸvÚAdcr„>§¯½`ø‡I·Òo#‰îLÏ1ÕäÎzð@aýzV¼:æªñG:ÝÊÎ÷Œ@?(;y?¥l ì`æ›Ôä ðæ Û ¦UþéóôëZV>ÕÖu·6Œ­Œã?Ãë^°÷þÓDÙñÄ¥Õ}£íAÓsÊ=FjàÔt±9‚œ!É ¬qž #ôZΕ,¹Ï‘UMùTÇbR¿%‘çö? ¼Bð‹¥‹ì3mãZÙ°øiu¿ssËŽ9àúµ×¤†x„«!dq•cц)k×§† •Ö§Np?¥=|/¤«b$áb0*Ó¤ ž‡rC°Z©ZL·9ŠÊ {e6MMšQ3ÙŸ #N*Ú®ÞôÑïUËÂæ—s6ãÃzTÑÖÙPw*#ñÍE'ƒ´¥lp ãåÜük\©=Wô :ãó©ötûªÔ]L&ðF–-Ù!-æ·>s€ÛIî3þ )>`î_]²3ëþ½o¼d gŠR=Ö—±¥Ø¥^²êr÷?l°|†%ˆçqàŸËŠ­?Ãx× 2@#îãéëúWa†î¦ô¨xj/¡KYu8K¯†÷_îw\0ÉõíÒ©MàèÓ>I^p2MzA¦´`ãÈVRÁRf°ÇV[ž]/ƒïrB½ ïPIá}F&ÚÉÛ#+Ú½Oû>$:äc4É4«K…+$@穬žcU˜4yDšEÔ_yåQ5•Â4x¯V¹Ðô»ûÍ>3…Æx¨äðæŒTƒ¦DIõÏøÖo×SE]QåF'¦Ûòz…ç†t‘ò4˜ ÇM¿Ê©Máˆ1Æ—ôzVo+îh±Ð}=–'™QfÝ Œ“cŸANŽÙòà{ íäðµcºÌ(>‰Ufðäht„óÊñÀ¨ú¤Ó¹¯Ö£+#Ú(veáì’½*ü lªáƒô#½^,C¸§&Žd2ç¶kXRœLåV-Y•îdY"h¬mÀ‘É– ¿ž3RZÛÜ4j¬¨XÆ?ëÖ¤m&`Ùçý iV lÖî@=Çô5\Ž÷hÏ™t:??‹´»[ÂúÆŽ&Ó”+iÒßmšä|Å–<îä†=N÷eO‹¼9}âÍm¥ÚØ]à õψ.Ô´r0$à*Ò6ejîÚNãƒÄx+XW—Z”7zöw%«ÃæØj&^FÝÁΫŒ•Ü3ØŽÕ´­VÿIÖ†©áïêÝÌž\òÙê :– µ¥]¤ÀIÉ95òX¬¿‰¿±šŠ{&¹mégúq¯JšI«þ?yõ.‘ÿÿñ¬Âß_½øÉ¦,°Ê…ím|1%Í«»Œ×—Ü –]xÆ0|¯âÃø_âýÏÃgû>£¨ÜjÉŸ§y~zÈH‰D*\ÆÅBŠXnr;I®NÓâ¯Åíð;â_‰b[vyüMäØÄ€8.Ù-Ààqõ®vÇÇÞ$ÿ„¥±øÿåñŸ4èuMÅRhWZIÿAá»ûÛ•š0r\[Äû"fQµÛi9S¹sâ6øk­ø+Å÷~»Ö4æÔ¬§•n­î;ÄS…ÞÀ¤n€Áq_ÿþ2Oy5݇íwmöuBè›úÛߨYæ„:‘"˜sŒÜ*sÐ)ω³ù(â”åÑ(¥ü©exhÇšTÚ]u½¾ã¾³ÑM¥xƒÅ¿ 5M$Ï1“NYÒÐ¥Ù@7¯—2°‘znãpÍsVž0Ô,tøllµ+H,ìÀÃCl¤byÎÀÆ Îsù²iè×zTÞðåýõëÉ7öÞ©a#Ü)c’¹oÝ/³(S’~cÁ¯V¦{œÐ¦“9·Òêþ–ü49!ƒËª=T—än]øœk‚Mmàˆ€Á$k;†0Á cljª[ òj¤¾#Ó æy(ÁvPÕ= ÏqôÏ5SÃu­@“D³Ò´ëq3‘tÑéVX‹†òXGÆÒyÈÃõç‘Shþ-ñ‚<³ÛèÚHî‘å Wyf >ñoNØ®ŠYÿM¥ãþlÎxMª¿y=Ÿ‰<1q <ÚÀŽ\/“ÕÃØ`X°Ûòä‚dàqÎ.–€Û,ñ]Å!eÝåÆù!{ØgŸ~¶y]CÂWW÷|ð[@“àùQK#ìB¨Ë8Ï>¾˜žÑô—ŠMCTš6fÚdŒ\òCdœ õ0™Ž|Ó–#¢¼åÿrÔÃàù­Nmü޾š±D™Ù®ã–Àë\àòí Ë¥k·rBŠK¢Ý«^˜ÃœõÀÀ¿£K-À ú´×!XŒ˜Q‘Ûg¡M{T1U*K–p³òw_§äsN‚Œy“ü Pé@@:óTÞîådhVÇ ²8'¡#‚ªmªkv»…Ì>iÁ#È´c°gŒ±8<{ñÚ¦&4Ö©ýÆp¦æôfÀtlQÛõ¬Ý#Ävšœ~l‘˜SyQ¹Ô±Áì ÿ“ÇjÒVVàGQUCOxmæ­ùŠp•7in&ÕiàÓò3Š+bŒdã­ýäÏÖ¤ ¢Ÿin÷WqÛ <ÇÚ^Yû’ÄIµv 6ìW1(#þ´Ï%¦F+gZðôºN¢4øu [àbWÙK½7vdÈïŒêG5¥¡kšëˆt[ÛûLmuhé¹I °ÈqëY,E¾$[ŒÓÔËû*㚬4Åž?¶Iå#Hœ.N $dûdgÖ´â³µu‘¤¾"S…s“Ó Fzw¤¹ðTj¡gf³Êˆd‘à .@eÁ-É9ɶ9®\V7‡qSi]õ5¥J­Kò§ò1ïtm:í ·–¬ªddÛ‚{pr=ª½§†.u[²è°Iq1m« JIcÎB€9 DZ®’û§H¸³×ŸÓŒíB¤-¶·oä“_yéQÂ5ÕOåÿ ÎêÊêÚñ¬ ”í,c÷¨>vÁ°F[­WIa3•eHÀiH™Bë‘ú×Q¯i $†ÒÆÊÛE&'ŠQ¬¤Ê.ÉáÒ#ƒ• rÀœŽ@Ÿâ iöZ?ÛôýRéî ¨[#ª¸\±mïœÇ‚$uó¬ã™f­ÉW•ÁùÜèö8GÂì˿ִËhÒV3mÎLŒ1õ {zñDZçÖ´Äž9öZZž Hªd±ˆíÿë­ïøC‡&£Öî"Ón%‚ME%– 3Ån¼7ÙÄÂ6b + ‚2¤üªYŠƒóQÄã¤ïÎþóÒ…:2VåG/â‚–:Q|9|9îùÓˆî;U¶A–nIÝœuRé‡Â[ûˆ„ö¾3Ò’yIPÓü’‘*!ÁUƒ˨ ùYÎ -n\j·7O§K~¯w½ÒPQ¼Íœ.AdàÐ~ð @<ʨ·)ZÞ»uuk— ^uÈxÖ=ÁÌdöÛ<ËzôέlÁÇ•Jé¸ÒÁ}¨Ù®§)©|ñJoá½ZÎîÊdfGFÂÌ:¶w& Œ†íž)ßü*ø‹§éRMsáOÝ$ê­$W1H+2ýÈØ¹9Î{篨Í;MÓRSm T äG '÷ ¡ùXuç ÁÁ9'?[ÕnžÜ?QhœÌëë+a[çm¤‘¸«‚0Npx5U£WÚÃÝ{iÓï¹”¡FQäÝi«øgĶÖÒÛ[éo@[Î?:º•¶@IÈÏcÒ²£ñ>­¤Šg’kp®ÊAîs€?z×¥_X¾¥s,w·÷S#ÆC4×a‹¥ÞQ€)$r>µƒ¬x¤MgegtŽÊƒÊ˜ù„Ôp6ç'=øâºhgA¨§ 7æ—àˆž]—W…¶c´r ûvÜÂØ_¼„à½Hëû‹+«cjnã4‘åïQ¿ŽÙüëƒ×<7®èš…Ä6–3f$±Š¯aØn•Ñ|7ø}ñ£â…÷Ù¼á-SX¸B<ß²Åþ« vb¨,>fÂŒäšý/ãœ."‚X˜ò·÷3ç+ä5©Mºn楖›i§¢yó®v4s°|tÉéøÕxB­9ž9ÁF@» ýº-öý¶µøe¹ð·À_B›Œ“éšcÜëfH·"àƒ’[ZæÛàí=7‰&ð®ƒàS¼°³ûMŶŸ¡Ý]4qwÝÂr¼uæ»hñ¦N“‹‹VìŒg’c¥¯æ:y¯ö±‚ÝccçaÏëY×\Eê3¨O—"le²}WU9>¤?¯Z± ½½¹ÙM,Ù9E§·Óô®¤ê?C©­÷/JÒIòÅ2©ïžÃ×Ûüô¬a⤷™ ‰¤»]ÙŽâ%y,ð¼c_sW.äÔÀg¶–(¾–YŸ§^دçY¦­¯ y¬­¥ß<`9–(0»AùHÏ'#=8ã©gër?fÚ~]~OOëKXSnÓ³þ¾ÿ¸×мMæ‹FM`ZÜÃ36è—÷ûö’xle¾ð# Ž7Ußxá’ {»8µ¢ ³¼þbÇ$§ço”F¸e¯ÌœwçÅ–•­Kkw†̱f9$œŒs»Ÿ^™éSê£ÄWi»Ó ÓA ¤äeq»ø†ÜIƒžq“_/,ŸæëU»}Þ/ä¿SÕŽ&„}Ø5þe»¿Š¶7oöË/ ¤Æ@¾SI•HBJžŸ2猜ç­ã½ÌÞ6SܱÉÏ,JXJãËEl€qËØ9RqŽJê×Sž5ƒTÔ Ie…rÏ&ÖCÇñû`u÷¬Yü'{o!¹‚ÛÎU”“åÍóéùtçšÇ’T«QIÞkÍ»ÿÀû©bé(YZ/Én¥¨x—Ä$¹1Èöñ´ïolp3°•MìÙœI·5™ˆõïÛûWD%JCn$x¶Á@ –ã?\ɪ6ºÆ¹, ^­ÌžBˆËM;; ŒñŒ`2OZÓº³¥âÜÝaS´¡Þp9É~CÚ«,ÈëQÄʧ5âújšü—àN' AFÖk®„ŸiÓ´;K{?’CÝ+ ä0ã*9ãFHÇqV Õ4«d¶1¤‘£íi# ‚ǧÊÉàsƒÔgÖªYiºËÈ<½YÜ7%Yêòµ©cð¦óTDÔí5Í=­üÛušáyò!F#%”¡*êü.XzØì~'ÃÆuZEuy5åk·÷˜|5L}f ›êìì¿DŽá®|%yk,ð^—gWšf’8ÀhÝ3‚G̹V1å1‚7eºW€ÅÑ’;´ÂD­ÈF\Œûw äƒÁ e[Ä×–vöº\·/2.éU¦ÎªóŸ¦}ÏJèô]cÄ:43&§4„.Ù>ĪªC ³# 2“÷œ×ã–ŠI£è^enäÞø9ãÏ]ߟèw7š}©½ûdAÂ-·Ü yL99mªJàÅAõþÏ?áE†¯«üDøq©Yô×V–ÄbDÜé#ÎÝ\Ø2퉥 åŒ{øj缯]\XM¨ë:SÞØXê"þÊ[7Û{nYÜ2³hž8¥ ø>QXå’\™~kÿmnn¼>¾Mžææ0Öe“Êffy­!‰EÙ”_ÕÖ¢Z-Þ¿#®” Ÿ,–¾¤þ.ý|S£[CªéÞ4ðv± —r@²&·³1e2›Á (ë$lw J ß-rQ¯Œ¼×ÞÓo°²ìŽò; °ð8· ÝRP„grrNxµË/6”ú~­¨Ü_iéqByû½[öÚ…ó™„› ‰9N9'##?^@ªŠ²VêÂ^æ¶µ¬ø›VÓá‡Vž3emÛ[,İĬY‘ ÆËa†# ¨ª´.µ>—;Hœ‰ u)ž­Æ>¤{×$±ùÛ€:HçŒôª²xrÖÃÎŽ[ƒqó¯š*0y9ç# t®RûÄ*óKÝRâ4iÎÒnxßœ€À1$c=ˆ¬ûK»ë½X%ýѸŠÉws‚˜$ $çÇ ûÙÈÃáûBuŽºÚ=éV×SÎ EkÕ˜œ1ÙרéœSÛûJÂ_í 3Uhf‹ðNC£`ƒ¸`nPA‚2=+–ˆ ÜŠGï&rO …,T\v9ç4‘Ý=µÈQv9CµÉfažq‘œ8àqÔÓWÝÚInÎîÿÆŸ~&G¿‹¼iâ F:ÝÌ’êÚÕäzu»I±œŸœ¬eŸ Œd¹Ø9—ZN·okÛ*\[ÝÀ’Å-µÔRÄèÄ™‰È¤ ÈÄ2îQ\öÞ§ Œ³<¿+̲(ªåÞ8êHÊðxéZÞ2ñ>­¦Zxs\Ô®›OÓæWµig’U´ù‰o.=ê ä’@#9#'i¦Üy¬kLmfËıi×B }9¨Ý6Ë– î*À‚ àÏ8=ªçŠuW7÷0Þ]ÎU-­!o3i(ùˆ#'#?JÈÕo`¾ÍóX¼*–‚&…&qÁ,ý²[.~`Ü”*ŒMnÂ]CË[h¡vQ—Ü¥—î€c8';võ#¯Sz1­O—¸á‰Q—3fN¯a©i×Qx—G¶h¾Í9[WŽÝüȧ2á‡Ü`rA=ÿ!“eaã IZác¿¸áüöû+$Ç͸ŒsósßžÙ®ÖYã[{5ÿU»Ã ]ßuB‚9~ÿ#¢Ñõ&ÀÈÂAż |ÅÇ$m<}9ç¦: ¼­ÕÊêsEózÝ~LŒUj8˜ò¥cŒÑ¼5ñVÖbд¿ j—w· RÞÎÓN’Ieb2 ˜à´gÒ¥´ÕîŒBY¬f[cºDXddà8àgÚ»+Mz`Æ[†Iü°Û7¦v1àÃ<zé5ü um£'†SþÔŽÁ#Õ&¾‚8·\–v>HFo.5X¶7›¶/Ûa8ÇA~ò _;~ižLòªUvv<×íö÷*¸ì$€¾Qõ#ñ?ýjÑð·…´ßxŽÛÂ÷ž'²ÑMäÖóêë"[ÈÁ7…&8ØŒ¨'‘íÜ èu ÛÞÝË«j1%ÅÔ ¿Ú'mÏ"¾pÄœ±ÝÇ=8ö"«Ýø.Ö •Žêñ;Çå®è pzŒúžF tâ8ãU(ӥɮ¯â²òZ~fpÉcM7'-¿çNº°»{IÚÊáQ",ö.YNõÈ8Rp\csŒâž|<ú–œL|é~E¶äŽFÑשãçµ]o ÜÇ4pYG"îBJ„38à ¤ sÇ>¾Ü¯†-îìõ$spgÞä¤ygÜq¸`8ŽG ç·ŰþË„°õÓ«Õ85~ýZ_yÉG.›ÅZpj>¦5¯ÂÉ,g2Ø[3JQ¢ŽYg” •?3mۃǠX<'ªÉåÏoo4¡²ÄgTØî…ÁÇÐãŒã5Úiv¯ªOznŸµ$¹HÄŽ¥B±+ÀéÈÎOù{…®Žïᆯ£-½åÖ¡§yw vïT鬂 !EÁÁÁÆzñÇ=GŒs1´!¹þŒõ'•ѪïyE7‡uw¹tºÓ%Y|°ÙeÀÚ:aÊNz ÔV:^¡=¢OqkpžiÚ†XYO@3Ïç^£a£è–×ðÚøªþT³0Ç#.dÃ0%Tº²î“žŸWñ¥¨Úê‡Ãš|š~—©³²E sÙÛ†td"U)†ÞÛ£Là  wSã|Â2R•8Û²ºýIy-)GI3ÂÌQ˜1<•Ú#óâ§‚T‰Å¶$8Ú>÷g¥{†³ðf×þâ‹¶P^-µýö#úl¤–rß¼@Ør «‚ †W †ÿµ/Ow¡\ºÓÝ­áµðä"i„Þ%0 4A?˜c# £2°!=l7ájÍ{Z-y¦Ÿùµr:ñO–WûÑÈê–ú…½ýÆŸe~fa"6ø@`ž§ÐtÇϯ9¥µÔ¯ôØ#Õ¤ÓD±Å·ÍrÞbK8ÀûÇ9Á€ú r‹ Bæ]:÷T•a ‘ÃÛ(Æaœzr7ºO¥^Ðç½±Ô–+x"žÜ¹ÞŸeó6±^:!'’ƒ¯Ï?™KW{Yv=(Æ\×¹ì¿üI¡ÙÙ][΋ö[†HÂIA[€ï€%s…L19èG<’+£ø¥û6Oià üÔõ›( $oj–Ŧ²hÄ’ÈPDZeVnQ‡Ê±òoøŽ GF¶Ö¢Ò£‚á”ÞÜÛ³ |Y”á‰@KpƒæÊàsó{Ãωº-ô²èþ"ñ~©{Ô&(ßB’SªªÌ›íäB³(‘S÷@Æ3ТҲ:\ÞçÌSëº~¡%ˆr·r¿Ÿ! ùß*¬C`‘‘‘Œ†$€ËmAÖ5•±»¸·°@ØËÊ9äˆ×q÷Ú #³b½Ëâ/‡Ž¶Öú.› ¹¼)>¡6•od± à3ÊÓ•Ì+´DÏq>"øm ëþŽëÁv‹§§F_Yšoi·Pάò"-€I•±3ÓcrŸ:æ¹$ÕìCŒ”nˆ®dßßø.÷ÇÞÖü=ªØéÒ0ºxõ¨–x‚`ù¾S²ÈP‡]¬·6à>`V¼ûTð¿‰t ùlµ¨gŠ@8DãÌo9,¸#? ë³°Òh¹‘šhK³FIà›æsž3]Í׈¾<ø¢(,/¼gªE$žtwvdy×)ò+Ä»/ ó2Œ†?1R¹ ö¹/ÞÑhxUÜfhMÐ-nŠ@Á8à@޽:V²^øA¬R*ĉ‡™Ñó<ÞåØT(QÆ3–랢º;Ù|3ñQ:fáè,õÙ¯.Wæ8åV;‚$Pâ3·qÏ@Öˆ¾ëKª+Meû<,¾z12‡U;Õ±ƒÌ0xÝŒq¿å4‹Fn ;£6ÖÞ8­‰²P¬¥WjÄ Ï;GLƒÉÇ ô¬íBÊÊÙ„:±ûEÊÌH!—pÝÔò“†þé<`æmGL¿ðåÔºn¡‘4/’`èÑ•Èù[ïŒàò)-®ä¶2h—Z|0ìò„7jÌÑ0*åãuÚñ³2ಟ™p8ä’Nú´B“½ÙoÀ½ñߌt¿èºEÁÔ5«ÈmíËÊÌá±vaœr‹œƒÆF·Å¯…–ÞøÁ}ð¿Ã¾"²ñ šd¾UΣ¦])å&@‡wÌŠCsžBŒf¨øU×| ¯Câx–ãE»ÿ£j}Ù¶šÉËíߪÛàãváŽyëRéÒMk­Mâ î/eI]¾Úÿia$ÊäVg˜:œóÏ¥oMSi­{•ÊRºzv1-|/¥iZÀMzÝ„ "=ÚZíÀ2 ç£{ç]ð×ûx­ÿ°.µ6[Îé¹ÁUSÛAvÍ:ëLð”ÓK¨éº|ñABk{HœLˆ¤äy›“e£çzQâ/Ûh&æëûbÒio‘&‚ÞÞé$6ͼgs!*ó…Ü'ƒÇ:§¡.-Êé™¶: ¼³Õ’p‡Q½ÕÚd›|Ûä3‘˜›k:¬„¶~R„—é¾ð.¥âª›b ÑËàe*JùŠ@äŒîK`95½]Anñ[$¥wù{²Þ*ð]€'oaЂfŸ[ƒO9ÒﮦܸÔì.¤|ᔳ|§ï •ÇȬ®å%¥Æª§ñY¨Ðo¼+ª6­`ÖPE1Çmq.£µä…Ñ3Ȥüì¹ep‡rB1©â_Šš½Þ†¾[Híñ®®-ÀQö©‚4I$ÓdˆÙ•UÉî;F]‹rž ñú‡™g,ì±´Î÷q €¾ô_”€,F#'$sß(¬Z´‘C ŒÀ°—‡em#‘ÓØfÕÝ´DºÍ»%¡Ôè~$Ò~×öê»ÑÙ®-IIr@$às»9;q€yù‰ê‡‰ü? òK«éÖÖɳ͵‘m’!vNSh+Û &0 âµ_iÖ ­–hèI™§]»•@ê˜ÆÃƒÓ=ùàU ½WÂzg‡'º½û\Z¤—ˆèTX E,ÌåÉ%™Ý@R *©ÎâÃaËÍ©¤jÙž©¢üfÒ$„ŸhÚ}Οª\Héê;Æ’ŽEvYù„mýs0ûß(ÜHâ5=[Úýõ;£—*šX]BA”~aØ©åF/ÜaÆìEÉbs¼ãOBÕŽ«©iò^Ù´F9lÞP7 ÎTcœ/Ô.:pz7âÞ£¢\Üx†_iKcp=´¶€2©…“ž7ø=ñ~ÚÖÀ;À`×®ÝåûHxÎõ|Q¬ø+N[ã<’YZAquy‚®ñ”¸,±Èà:}§c̤ƒó…*Ùz§Á_ˆß> ÝøáOÃísT¶š}š}¤ö·>| ¶é ‘Ë(ß•$î‘V5*Oî÷¦ï,ñ>‘ãkC©j×6Y Û¶KóFÀcøIÈ<ŽÙ"÷…¾(øßAÑ/<áïÜÛØ ‡”h·GyŒ›¤mŒÄ¬˜M¥—%f<˜Në]Eí#-äÿ>øçÁ••Ϭ%_Y‹‹™?³RÏ–Š“"Ÿ%d17¡P¤3n yÔN©ªkèz*ÈóN€ˤaÕ¸ä‚ç‘ÉØc­ñ·ãÝ7Åv¾¼Šáõ)Õ.Ä1jIxnüÅÛæð_Ì †NyùyÉ—o®xÆÕnt{ö‹÷²´A:)ÅT W ¢Žxü¥nmQŒ Û3´ ë7S"Ùi²°ŠèÛ¬1mv, ¿¡Î9ÉÉ$§ªY}’îâ% kxS,K*26îCn^%¶çž˜ç5<©ÙÞ‰nÏ™¾V K:9ÇmçA F¸ÌW7CPÔ¢ôø-Ü'îü“Àè}rG~½éÇ]„(Í>ÂYèP=³^êz}̱¬k¶U”$DòáwmÚ§“‘Ó8Á­}@´YeÕ|'¡jði:+›ˆt…Ùså}¢,‰rB§•È5<Þ›QÑmüA“E­ÒÚjNçËk–Š%òÔ–hËg 8ÉÆFA=G> |WÕ‹Äm$ZkI,Î"‚Xó”(;¾R0y?xä“qåQ÷¿Cg(Íe¶e¢¹?éB`Ù‹G‘‚‘ìg¡ ñœÞ:ªXKd—PṴ̀´—3:e œcvpOL Ø®ïZ𠇂õ®ôÁ%ªÜ aé"©! ù¯#p~SŽWÄ·úŠöú߇¯#¼ÓÛwÛôÇ>X+·NN@—f;ŽG É6®¥RŒ}ÓŸÓô]æ÷ìP·ÚYQñ)l)'hÎ88!sßž ­Ë;ï9%Ò.íÐìO%!|7É· AÉa´ðžêòøš;+ýóYÇmèñ—Œ¤ï#o-ÇSÁqÖ­ÜxÓÇ:$ ÓiV’Çå"%äöÙhðܶIÜNÒ 8#€8É5•›‘œmxņ.àºÓ´ÌF«$‘í167Ü{¾wsÀ=H5º®±¤…µÒ,K,‘HVD²Ë£låq’H@Ü2pyk QøŸ­x›ÃY=´×om*Ù[ÜÜÌpïwe.w^Y‚…ÜxŠìþ üFðÇ„‰ã¶ø9câËËo¾+ñªèÍ [MWÄf8¤µaæÉÅ!󅌕e8’Gr3½¤X·ÄoÜi°x¦ïU¶´y®§ƒ2]ů·ÌÄŒd´Q’ç•\°ÅK©쎉F­%v×CÉ<1i ÜÙé£Ó­Ö]Ó›uRb’J—!F2@Ürzgš‹Ä>¶].ç\Ó¼M`.âºd[kKŸ2@‹)\–Ú±°Ã6}ÈÆtž8ð¢Ü ð›j`HÒ]B# É"‚Ù ²œ`s·døsñ ]½ˆI§;ÀJ"O4í´nRꥉëœd`ݳºG4Rzu:ü[Ó~ø]Oð­‹jÓÌóVi®íÀL’®@ldóœŒð9ßiVÿþ$ÉŠþ'hÓ#§žãZ·‘!™a–3­Ä‹!I)Ç÷€¶¹aiáß^ØÜµ¥¡·r–ö²m“™%·ÈI dnÉÎÞ>jÒÖ~#øÃÃBßÃzW×óZ¹€\ô{yI-±‘‘XØ ‚ØíÆ}l>3Ç%ìéJk¦–_~ÆXÃá¤Ü¤“ñ›À øszOÂ?ÚGÃ2¦bÑYh:œI2Aß}ooС”1ž¿)á.ÅQYˆ®–õc…Rgi@@…c r¨À) •ÜÙÚ1=í âßk’êZN¡¹¤XÚo2pñ2*a+6`‘“ޏÚ1…òøbÒ4Û1ªøj]BX[ts5îžc…ß*FÂÑ䪆 Ù;±óÊç/ü#z¶œ—Öš·•zS7Ílî¨ûOÈiì¹Ú¸É W²¾¡:“¥dÞ¿÷¯ÀŸø)†«áמöóN¼¼xÇ•`öé¾80Ñ®þ 1!9ÁÄ¿xdÀüký¾üã?ÛêÚW‡%k‹P#–[Œ¨“¤|¿3È ÃGÉòvâ ï ÚÈ`Ó­å†óMšÍ–êÕ_Ê´ù¶ï R¥GbÉÙSêw–›£i‘¡0ý¦)ËшÉ€œò0¹r <ûœ¶¦žçЧ§èÓ-•'”FÊ$Éá‡É¸¸ÁÜxV'<­sšoí¯ßêš¡xKO’KK‘%Ì66on×?1cm‘šQ´àÈAoâmÄ–¾;øñ Bñµ½åüwQL'³¿Ù,n àŒ”VR8 ÅeBjµck·mÒܩք[Kmünø‰ð럳×왡kž%ÔìïQñ£ZÛD²OªmÚ1æááDÃ`LeÕ·6Wg†üMøÙªøšñ¬|%}}¦é{J¤);ÄvóFQaŒ¬RF¶¹o[Öõ.ß\Ô®¦åÌQ]LäB_imªÄíݵ À€\ç³Fcœà‚sÖ¿UÈxG ‚’ÄbZ©.‹x¯ó~qóØÜέr:Gñ.>¡¨IoöY/¦’,ÆÒ’¼ŒÒZ¯žßÙ²É Š|*=Ä»cåç'üçÖ0Á8Ç­2 n qr—M£â?2ûŽùÿ úÌVl4©$•ï­–ºóG›N¤£5.ǨCñŽãáö’t­éÆáŒ‘µ­¼Ee¶c ÅðòGl ý“uïiöz—‰u?ÃZ%´Ù¼Ö%Ñîî4ÚAvŽÞ)%“;‰¡˜… Ä~cZ|;ÃË’XŠÏvÞ‹ó_¯vjœq¹‹V¼b"ðÖ‘tRKë©‘—dVÏÞ­‘óœŒ`ŒƒŒœŒqÈ:'M³ƒOò¸ÚT¨˜Dä;˜†a»+Œòyû£#§±ñoÁ=Ã:ÿ…ñÖ¿yñ"ÓA½¹–8£þÓÖÞ%`?{,ÃäE}ÒOy# nøÏà‹¼%âVðö—ªi^/.¦ŽÓWðUÄV·˜,¬Ñ²“+‘SÊFwÅyïÆᗇ͚<0ÞË4²É Í1RÌq°8'',ÎH=s\-÷í+«ê· <¶7òʻӽº}à œc=÷â?åýHÇ}5oÖÝ/穪ÄsÆô ßì¿éo|7ñwÂ_ü7ø‘á{ý[´ÓÅÔpjw)$°DÖÿiÝboÜ3&Ö:‡†ð½—áF |;áƒj²êVW×ÚŒXjo0ivÑeVS<îþm²«UÊå›yQó¯¾5Y&­euyá²eµK¬ÆÝ±žOAùâ¬þÐ?¼iªyš^5Å”r2Jëiƒ…A¼°s´r8qTø?í´štÒ¿5÷ÚÛßÏkSÅ¥% Yö¿ãéŸ]|Lý§>xCDŸJ½ñjîÖ)5­æƒrð*]M’\ Œ6TðŠøÈVÌióo‹>1ßxƒËÔµ¿$©û5­¡@ª „Le‰<»e$ó_<_jº½ÔjºÍô·X0Í´ãÏ8þµORÔîµ)V[»™$dŒ“÷xÇôùv+ÊãxÒæŸyjþí—Èʽ*›Ù„6÷Ìq€NsŒút®|:®GsQ ±,{סS3ÄJ<ªÉy–]‡¦ù·=WÃ_P¶ÍJÅÄH€o#sc׌“]ž›âmRhÌWaZE "b7mÎ7`@÷¯ŸíukÛe+ öêkkEñDÑÈ$º¾W|I!ñÜúžÙ=€ô®¼6h×»-N\FYïD÷ Ü…’;L.Pó$jO¨Œcÿ×Ò¬\Ýé÷B¶–ëqÁåÈPœŸ™†zžXœñ»²n7‚d»òu¹H,®-‘Ö`ÒZº8pÅTåcfÎåT †bW—é¾ÕÛY:GŠÔùcÍ|Ú»4OŒœ+† 8;Á$±P;05ø›ŠzØô)îÝ*ËY½¾dÓ4Á¿‹kyMÓ¸éÀôê1ž§fÚÛMÑûÄÄ_éÌìÒhÂá‚Í6Ð…÷&[#;éòmÏZA©é-´Ï{\ÝÝH²3@ÛP3!9PÌÍ…%”†(À‚;†z÷ˆ&Öõ95mÖØ0*©ÐBÛ†*«»Œóܜ׳”ðæe›ÙÂ6‡ó=˹…|n =dRÔ4ÿ Ìé´ŠXR–å\ú99  €£îñ·ïT)moï.Þ4 ÆT@\Ÿ—ÓÛ¥KM2arËŽ;šýk*áü³(§jq¼žíêÿà|žÄckâ_¼ôìð\猎”E#àºml®ÓúŠQ“Í-{.•)E§Ó9SiÜdQG áQF Œ1øP#uuŽ1´‚ Æ;;=©ÄÔõ¤(ëIѤ÷ŠûsIlÄ–B¹9ÇçüÏZ›NÕ¯4Dêvh­*óöqå>rv°!†n½y¨Y0A šŽWe˜{Vuðô«Rp¨®™¤*J2æ[–ìuËÝ*âæîÐ({…ÚJƒ¹ìü­œþdÿ,V»¿»¾%¯nä‘™‹;¸RÍŸ|gðéT.ï$E%Aü)ÚrMwûÇùp»ˆ'¶kŠ–U–S¼aF=öF®µk]Éýå§k™ÆÖšF|œ±ûçüšv|¿n„Šr«) ¹éÑFsV ¶€‰ñ™$ܨcx™Z1’9Çò¬ó<Ó’a9ê[M¢­wè…JLLì¾ò½”o¬ÌÖ¶q†‘x*Ìõ$_Ê´fÑ›O´¹\Gp§ Ȫ̱ÝGÍ“òîàc‘ÜWQ‹HvYÐXŽT`õÆXôàô šô/ÙÿÂÞÔõ)|{ñ5µ½'ÂÖ1¤·ºn—_kº-•·Ý,±E¼¤r0Dd|¼ºþYžq†;2¤èR^Î}u>ÞG£K¡S¿¯CèÙÚÏáŸÂÏ‚ñcö€Ó%}H@²xFMÛdú–û”ˆyo‘£bLd?šÛ–¼Cö•øñŽ|I2x'H¼Ò´{ÛXm5 B®£Ìa$ÚÙ"n_‘YT„ ò&v×MãoŒ6|E«_øCÁ2[øoÃY·´'=.#¾8\˜LI¸ª¨“‚¥·Ë±™Auñ»ÁZ¿4ÙjðeQɶÏfQаù%Ü1¶š #:6? Z‹²–H$ óÒ–›7Ím늕ϰo¼7«ü(ñUÇ…üy ×Z6íSJ·|´!HÜ­…e°'’ @5[Ä~$Ñom$Ñü-a2Z¼¥ZîýɸxDŒè…>âã*wíÞIa¸ŒW §ë¶ºÑ’Þò ™Kï’Yš9\à`üÊ✼q“ƒ›Ðëwȶš­ì,-äòãk{uBÀüÃqA–l·W$ã<_1‘ar*¾õfç4¯ÊýØöJúÞí¥ÓÐññØŒM%jvQûÙ ‹¼–V,IÀdòxrxÇ_¥0ûÄŽÕÚ•`?=Åݺç'ÉÚ;`ŒâŸ$æ)¼Éµ—®æq’8$WêÌ2úŽÎ1ž‹–ëO#Àö5gt›]Ç‚J‚g•2U;qÆp~•d´JNëšÎ¶×’mYô™l¤‰¼Ÿ6)I$L¨ÈÇ›§ÿZ»jÖ§O•IÛ™Ùz“N“ºW°¢úH#-q€©÷Ýœ£ß4ä¿`¼1Âã&±|M(ŽüÛ£‘ /ʈ8#>¼Ž‡×=pj„—wR_+œí5›¬âìo*Qæ:†Ô"WòÄ ¶#Òoz[9aÉâ¹Ý>éOÍ,˜ ð[·Ô¢Wǘ88ëTª'¹2¥cpÌ[¡íPÈ ©@3 Ç­J“U5i¦G,“ÔH;ˆëÖ¬XRb\`ŽH•àãõïSYƆRI/qT´Oá4ôµ+|—ÎÑI ’7ÚÊã•ÇãéƒïÖ¯I¦Ë<ùö;¹-4ÀÅ‹=³“õ5’­7Ú#{dvo1@T\–$ôâ½KீüC¬ø§I½×¼oôI$&g¼’X­á]Çs™#+´(Rßx )ëÒ¿ãõˆþÚ‹—Ââ­úþ'«—EJŠõÔ¥'48¸¸ñΩ¥“ù‘MoºKvuܬ¢;€žzd¦¡Ý†*¸Ã×9qñkX×t!áK}~eÒ“P7+£´"%¹+¹|Ó(Vm§€I-¼ùêþ*ØMyt%Ð¥ìË?2 +ˆF° g5îÁ·¶OÌ9`Äœ×lÚkëPx›ÅZt«muqç\G4Že¾…œù¿2°i2ÝÛºƒÎyF1(&ÛvHô¥$•¶ŠüOPñN£§xE³ø™ðoƾ%ð%†«¤ªj¶wÞ#1Éqp­#ãò<ÄS±d\a¹ |ããoÚÛUðÇŠtøuÿµêöÖñŒ©ÌqÈ¥YW8?¼`9pÙéœ~ø…ÿýˆ¼ý¹ð÷Dý˜~ x›Ãòè·^‡ý¿ñZ(¯m.0¡u!z{E €oEAæ §ifS¶¾#øõñ7Mñ\i¬³5¬Ó]Ï=‹\y9b»eä#™‰$–Ç·Ö`2YaeVXØ-µÚv×Ukïø£®4½¶"<Šñ~½·^G5ñâ”Þ2ñ…ιwzŠn%qÇncÆ[#Ä÷$`óŒWCáÏ_x£FþÓмA¦ß\ tëIÿzs†ÀÀý{f¼«OÓµ]jo´˜%g/&=3WVËXðõòjš-íͤ±œî†R®¨Åz¸\eZož¤£êÓõ=ZØJ|ªä£%óGªø[ÅZ&ó«h*>Ö—fW>„Ž?È=ë+ø!ãûOÃö3躻ÜHò8ŸÌ¶‘!-ÎFòÌXcåÝ’ÞÄja+A{*‹›ªíý}ç™ÉŒ§6ªÃNë©ÍXÞKep’Fìõ 8 ‘×¾¼Uïx ê—ÞÎgO)¶Èåó¸Çóþu^óL¼Ó¼µšÞäG†v·}ár1ý:‚:Š«©‰59…ý̱ÆÒ’°@s·¿¯|õ¡O\´å5&2ò–ÎrÈÿ<ÒžT^Õ `Ž;ƒÁ©„&Qç™Â"ÿ°Çw°À?áY+ÛCI4O ¤ÓŸ•0*¹w,V(Ùðqò äÕˆuäìxË>XÉØ õ'ŸËkEñ#_³Ž(4­?JµX”.è­âÇ'w'<“ߊÒ*“Z³7íËïf!Žá%´‘ °ëŒƒœÐþTÙ0!e\÷Øh^>Ö/ïȾ·´–2>u¹ùƒœc€Gzмðo†|oo+Ú]Áa|®X,Z9: ¸ãç É5Ó'µ…éJï³0–+ÙNÕ—{ÜõO/M½•í­àò¶K‘ J+h€Á_¾só¼N[ST/lÜ\4rÈä`lˆÂ09ãnÞp2:w­%î—áÓtn-žÝCL"Ë„f'¦qÛô$É},1³ $@|ÈŒ[ÌbI<¨ô xÁ=ÂNºzœ¼ÍÞä-w3”™—åÏ–ŒCï÷±ÛßÞ­¦ŠÌjvkp@yì• vpWæÝÆsÆsÏÖ›e¥^=üiwi ’m©3ý¡! 8#{·Ê…¾¤wärlë~ŠúSÜÉ©Ú-ë$‰mµ^gxÆÓå&ÄýÑ9Ý—([ižš7*’º»oï¹¼aEô8mnwþ}7FKBí»lS—Ý ¯r@89lpA\‘][hzU¥³êTKȈ8¸yZY1žA,Û‚œ2xÕÑåžþßXžöQ4rB@òÆAÉêsÏSô§èzŒ†—ròk6ð1•c•]¾Òw’cRˆO!·Ä·'Šú,F]œdµ¨ÖÆTv“M{×jÚÚÞƒŽ/ ‰£tÕœUž–¹[Äv&óN&EÃ’áß‚0O§9®q¡6ÌØd¨Î uWõ+/ôy ‚$äñ׎Üãò¬iô•ƒ0,Àc$×ì­Æ´UHêšOï>rœ¹}ÖPK5M°f $t&¤òBSF˜àÔ¨5¹¬¦º1Ê6¤ÎŸ”F?*m!#8&¯©‰¡o bjµk´ÄŒôÆk& ÞdjGæ8Åk®¤J-³sOÕu=*ú[GÔ&µ»·•d¶¹¶”¤‘H¤ua‚¬zŠÝмcã;¿^½•íäV-pWR\@&dXÛ9m¡Ü0ÉàÜ’ rdš–¢WìHn Ç©ÿ=zWOm­XøvÓlªfÔ fW‚DG€ Ë£ Î ,P‡€FkâxÛ+©šaéKj‘v²ìûù'c«%FRRv]õ:kÿ‰^*øOañÂÃDÖlšÍ­/´½kmÔWVþCÆé,Nä*•Q–CŒƒ”ñoâΕâùn-´Û 3ÆÎ$6¬aËeä¹s}âOO˜ñP|~øµ&§esÍn×w@ÀbµŒ„‚2¥NÈ=?Có¦¿ãø-’K1ÄÅЃ埔á#r?LW‹€Ë0|?N/“«¿v»%çÕ»yöWÝÝGúÕš^2ñ6‡§‹Ÿ9îîn÷‰Œã1ä“ÇA޵çòÍqyp××NÌÌxÜriÒÉ=Ó‰¯%ÞGÝ\üª=¤\’w¦kÏÄâjbªsKEÑ™ôô(Ç -_s¨ð¯Žâ°´];UVtAˆÙTp=+nmGGÕ×uµÄe˜|¨XçD“Ðc-µìÐOçÅ)vÏJ꣙U„&®Œ*àá9¹ÇFmkºRÝ_H¶Öã+×`'o=ë-ôÍNÇ7áÔ ®*ì<©'ˆovÊ‚%ýûŒà¨éÒ´üW‘arÞq„DÐ863Áõ®™`iW¡í”ŒV*¥žÍ£™ðïÄiVòùVás.#Àäó¿æÈÇN{×l¿¼©hVºeß…Ý/"ÇÚn%(ˆÑ…ÁPSæ'ГœŸ ¯<ÕFŠaýŸ¨¤€¨Â¨<ŸN ‚}.-þÔ¶ ¨3É>þµ4±¸ü2q§;¯=QU0ØJíJq·¥Ñ뾓áŒtŸ5l¥µºiˆŽÞëR¥@DZ‹ý1ês€wîþ ÛI¼7â{hâ–UŒEq!u2áÜOa€zŽq_9+‹{‘6Ÿq*0<2’¨­M;Æ(°Erf rq»iî?­uÐÏ)5jÔ®û­ZÙM^kÒ©eÙêzçü*oý¡Å´7ЂTÜZJnôËcšÊ¹ð_‹mëuÿe@bkAý¢ügáøã…¬ –8£ ,O–¸dÝ{ÐRYþÒ>7]NKíM…ÂÉ)’KnVãl\|¸í’NA®©f;ŠIÉ>¾G×ÂÊâ ˜<Ç…ò3šæ¼3ûKé·I4Zü*Lç÷ò}£÷Œ¹È›Ûƒœg֭럴_‡nÚZ›—·2n]ÛN†.J½g(-ú;…åMó’³_Ävrõ–$`U6ñ>– }Úppý+mIu6½Ñ¿æ'÷…V¸œ+ìœW'«|E±µ˜Áh²Nù!ŒG…>çøVEÿõ{ÉÂY(Š0Ë»rÇ׿ËÝóÀéÈá´KkÏø–+7˜³O( ¬Í´ñÐuëŽõè™–ôézdÅRFw¹¹ò£ ѱÉTm¥ˆFr¶2iR®ë;쿪ÐÛ©ØXx–ßG°ìikËz’|ç=v¹Çq냂s忾1ZiæWӵ̄%a_0Ý3œuëëÐt®wö„ø±6›z¾ðþ­oöE…|ÈíÎæ-ΊœÀã¯Jñ+‹ÍGU™§¾¸v ÙÁ'hÏ ¯ŸÍsÊxZÒ£†æþ)]CÕÊòW^­Yû½«âÏk¾)»•®¯ ¢G‘ÜûpzcƲcŒF¸'¹¥Û±~î8â•T/L×ÆÎ¥J“ç¨îϪŒaN°V@ƒ¦™ 8QK"³`MØIªƒV2£æ9¤B„’«ÐR‚²ŒJª@‹¾Õ†‹t×f2êw²ŒöÎ5Òk3Ùêþ¸Ô¤Õm¼Ã+ ±Þ[# “Èú×Ê©’;×Qá=vÖÎÁ­4ý6;©]×uµØÎóþÈqÇ^+ÐÁ×÷];&Ÿßè·9ëÓnÕ"µMÌ5¾Û™ ,›ðAlÕ¸µ¹`ŽHÚ£ýÕ¥ZñôRKšm móæ$cäçÓ¯cÚ²(9¹\¥JN–ß#£J‘R’Ïo fRUºð:T¶3f»n#ƒ»¿õª«ýâ¼Zy$“2|«»€[$z}~µ›R¸ÚÒÅûè¢[d¸iÐîf_uÆ9ÇãúUªœ£g=³È¦]sÈçŒÓÙxã¨S”ÔìLW*&ŽÆÝÎÇrHûÄ™6Yh‚¶yéQnp0? QæH>êãÙ©9SkTW½}Ï´õ½wR×»ÕÛÌb Ù>XFÞåxè;ç²4«A¦–ì[‘å11¤ýÞî9Ázœ Ÿ­X¾¼¾¼†(缚D¶M‘™ •…2\¨ç  ±lXž¦¥¹ŠÞ;>á”F§3yí´"ä`‘_1K V½XÒ¥·Ñí©rKžkÜn†68•&ebNàs¿0è y#ÔVmî o€´¶!Fv«Xñ"ÞJ°Û;­²>å\mg$ulzg…éê2+cEÒ[™d›æ#r®I8÷Í~ÏùE<¯ ¢•ç/‰þ‹ÉÁ<üCw¼þF·†<Õ™$Ôå+`Œà†Ãï´FqëÅ_ñxcAÔ.eÑõ[†ÒdÔ%[êM¹6ÿòͦJ+ÛI]ÄàñÍwÓÚûHšÈ3íû3¬ÍçÊwsÓ A'° Ó!°„é©hí_ßEœuãß'¯¥tcð8ÜFkF®¢²‹o­ÛirµÑ=u9áRœi>u»8¿xßWÑuS¦ PG”Y#Ê¿¼‰ÚI<öÇ®/Ä~1¾ñ¤º•È_4[yRH8Ü0;u=Îx®¯â?P»–Ÿ40ˆ Iæ›ö¨ Ä…u蹯;0ÎÀúTâêby¹e±í`áAÓRŽöÚ”ñÆÑ$¼1ÉõÍRžm²o+“ïVì´‹íJä[ÙÂYØãµuV?¤¸Òšöúñb¹Þ«$õËm?ˆô®Nµ_ø,ìuhÓvg%¦[µÜë2)b.v¨?^Õ«áêž ‚ÒK¨¡Xe˜áW¹_oñ®ëKøY£xq‹ì]JUÎEÁۃВrO§çÎG)ãm_Á–1ͨx³ÆÐ´«ŒXè¥P’ 8Ø \g=G±5³¥õhsUÒÝÝ“ô¾ÿq„q 7 Zú+›wÏá_;Ã:åë^Áå]j2G»z²å– @ØÀ»×<©ÚHÁ®+ÆŸì¼5á»­Ã’òéL»§ËLm£Ž{t ë^s®üD¿¿g±Ñœ¥¸ÈäAæŸPqXBw3ÎY˜úœ×Ïâø‚sƒ§†V¾—ÿ/ó=œ6Oµ*úõ·wæIyq&£r×·#©Ê¡þ´è†ù8\Žã¶ÈDÀ#7jj΢]Ðü¼÷¯ 6^õï}Ï]¶ôH—R‘XÇ –™|ÁÐuã¡ô¤BHæ•Gy\´l »ºšDHúS©ÀÉ?¥@ höó_zXÃŒîþt‚P¹=~‚— ãŠ8€zŠXd’Þd¸„áåM4¸Ê–„ìî#¡ñtz.¡§ÿÂP|Ö¸¸Ž4HÔ(Dr>fb=ÁùzóÖ¹¢K)-ØW]cwáÿøbÇÀv®,®b¸{‡½¾eTvØpƒò}ý\‘l§ÛÓŠ´¦§š_}µ"Šj¯§åÐj±EÁLÓÆƒéÍ#m£´þ`×6†©\‘¼çdl€8`Séƒg©hw ’I_œÊ¨¥¤U+Õóøü¨ÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ü¢Š+è<(¤##ÒŒ—ühZM§sB>ÿOÀÓK«ô\ãÖž‚‹ÜmX(ç–Š(QE!£  EQp lŒÊ2¢ESK€pzzÐ_ŒŸ¥&Ìß…>¢cæÊ)ÌwuR?aôRŒg½- (¤E+ÔБ‘Š@¸Éüè'æÚxu¢07[v{Í8¦Þ€X·ù”“O@ǪXž€ "õÚHúU›y#S˜×ê{×\"“WfR‘5½—ÈF9ë€jW…"ˆ3H¬Ç*Ý=¾´Äš5PCäCÒ¥G ØÀÎÜ+®1§mi9s ç—8ãDPŽ™$óëSųpÐÒ>Frm½EE zæž°Å!ÝDZ¨Ã8ôç#Šz" —Œu­U‰ÔäT0êiiŒÎN~‚óÌ¡ @p[_>z¶‚àÓ<áœ4ú"¨^”´Q@Ðý(;Ó³¸õõ œ ÒÑEô¢Š)QE!m€ fŽ 4ÄÄçu#ìI=Á)Ñ… œf@î65eÎâ)ÔQ@„*­-‘ŠMÀô¡[wlRÇð­80”œòNï© z ÈûÃð§Ñ€: ($)®ÆãÛÒHΨ ´ŠÆ9Ñ‘ö¶á†§=i¦e+©?uyÏ\ÓNÌkAÒ#¥Ãƒ1,–Ï^zÔLKvÝN ÿÂÀR˜†8>æÛ@qC°+ÀÏ¿¥$?ÃJ¨«÷EÐMØè¹ú BìzÇýiÄÔRÐ!ŒÄc‚à4ø|§;Yö“ÜÐ@=E& ¦˜ËgF–ϯ0ðëº%›øŽ8­ý[\ðáÍ®hÎÈäy¤à8ã¹ÏáZ6Ž‘¥h#Yº(ci6¯”œnÇÝ$÷¯f<+›\ÊË©Á,Euí«9‹/ µÊòÅØŽGóªž"ÓMuWtIÃF¿Ãõ®ÛRñ#'„®5­ Î=ò©Bù¢eÇÿZ¼á¤y\ÉpåÙ‰,ÎrIîkt0øxÆõo[ùa%Z«r›µ´°ž`?u?J#F-—˜§G³ªGÖ^YÖÄÀÆ4©ôP+ØhGPáC&z~»¹zPÅÈFGOóŠPT 0y º­KLhñŒ© Ò`(ÈQC8^½éh=îiÅû¸…:Šg–½úQåïúSè Š( €z€ih tQE0¨[ô§ÓJgïØâ•[=©+´QE0 MëëKMÜ‚O#ï`2})7¯­"ž2AÎ8Á¡Ù¹‘› {ë@[§ÉeÁÈ=©$¸»–Ù-åÌq’cLœzñO¸³–ÊS¤{b™U'%x±éÐÔðÿ‰Í¤š¨žm…È*ã«GŸâã­fÜÅ ´…!¸Ì€µ=êK&°7ÐF9ÜH<刀Å{ã=ëGVu" õ·áÿQ„Sr]w"F©§ÒNñ=Ô¯i¤FCå$‡%W'žæ–±W*JÁH ƒKEI(Æ ,²ÝÏ,Ìü¼ÄóÚŠkÆäѨӰ¨c‰Q³· †Æ¯J!F’EŠÜÍ€ª$ÓR(ÚM¯(\Ÿ¼ÇRX^¾!’8c/Æ×•rPç¨ç¦¹y•öA…»íéK½}jÖ³qo}3ÝXBÂ-ß3•~l³œg*’Fs¸ð{Q%i;=Ðx ô4´€rXžIô¥¤ ¢Š(¢ŠEÉ&€Š( ŠB@êh.ƒ«PÑ€: i•ñSwÈAÀý(‰('4ØÒâS„Á>€dЖ³òÏ^Ù4ÔdÁ¤ºŠ ÈÛ’zR#,_{tš±…².f—$uiò=¬˜íøÎ:gŸÇ¥j©4µ%É_B¢2y5"Z\Oó,/d5bÖwšEÆ«þðÈÖ¥¼¹ÔîŸË7NTºxzÓT£Êž¬NM; Ï–-¹Âã,9Šê4ˆ>꯷Ø5(ä1" SøùŽâ>A“è}iú¯Ã«É¯×ÃÚš]^*O²N2»Ó,Ø#¦8+O©ÎTùàù½öÔÔ¹e§©É·Ý4ëk™,ç¢1 @Þ¹‚?>kFO _<1>Au3©g‚$§?N Íšm¥0\@QÁå`ŠÆP©I¦Õc(ËDîO$3èóÃq!¶—Ìf@:àô òªÇ` ,„ ž1ƒéR\N—%véDÇËœ·¹'¿éÅG¬§§¸*ìSbóè?:Zšk(š%û9‘˜Œ¹#`?ÇßÚ£Ò(íTéÊ;‘t6ŠLIŒæڥŌWf · ûˆ²]”g·Ó½hêåNŽk˜C k—Œ:ípŒFå^cNÃcK]¬'G'aòö0ÞþÔ*‘Þ’"ùÚ PH Bç¯ùúÓLE\£±`Š,À’Š>_ÝËf€:ž´‰(¨ðç±Aÿ×§;8 C©®UN¾‚‘bÁå³JÑç¸ü¨£VB>òš ¬ßsZ~Õ~T2†êå@ô¬î# îÞPz‘ê=©žPRUÐäæ—|é"²LÁ‡ Á°Gn´èžénPU™F~v ŸÏùU$¶H{­È·8ARžõ-Ì©6$1 $òBÒ .ƒ;GçCVà¥Ó…ŒŠšK«™dÝæœç¦¥0€zŠ@…ŽŠ#&„ì[…ŒO笈ǺõÝìG¥I9„…‹oð©b¯œ{wªÊ#~9Îr*eœ sé]•Ñ›Eëx­|°Ö‘Ê#{0?@?­$ÑÊ(C3ÀªâêP¡YŽLéWb¼ǽ¤Ê”vp6Æ1ï×µtEÆJÌÅó'taÃ$±L'‰ðËÈ­k?j2Â.Ù`v«ó 8ëÐu¬¬ æ“n~ðí\4ëT¥¤YÓ(Æ{£ºÒ`Õtm.oi$±O.ßbƧt‡%PaHÊŒ¸ùŽk–ñuæ£{®ÝKª[Áö‰%Ì’B¤ê ÜóšÏ2\„&f*§åºV‡‡®•ua=ï•01ÏÚN@R1‘ž„vô5Ó*ëjKEëS8AQ¼Þ¬Í2Ö”:×¥ë°ü"¾ÒoŽ•¥]%È´†($’uò–r÷c‘Ã`{ç 9Êðÿ˜…«ë~!Õm£±HÉûJ?˜9Ú0¼òA޵³Ë*{UIKKߢ2XÊnŸ<“^G0.å{Híä ù þÎEL‘FÁC“Ô“€+¼¶ø qqá‰U@~|ÿ*ÍÂÚA´8ëF{øŸéFã×mM˜­ah¢Š@QEÃÔH qŠ}Ô ¼õ ˆgËc†ÏzaÆ9¤˜›Ž;UE¥¸n9£t;Onõ3-ºÂªcs&òX炸\çô§@é'Ë'~†Ÿ2F™1±#µÏ¥ø@B/çR¢ÈàJÀ€Ãøºê¥[–jI_×c)Ór¶=:ûÇ~ —ÂsiZ…a¶‰¥R²¬Š&@1=,¡‡ÞÀÎzÔ¶ÿü?âõ¯ j× ìªëi*´0Ï'8ç#¥y¥Œ^kì/ò“Î+¤ÑÏä[í2mVöOJé¥C,§êÊít]Ìe[Q¥éÜÙ¹Ò´/‡š ±±"[—½€ 1sޏÿ#³ø‚–šð¹Õ!šH•Žè¢Á$öûÖF§ãmVöé¤ÌK–?qN1è3ÛùÖc]ÜÍ;\I)ÜÃŽ=ì=« Nfœ—°÷Tv/åMÖwlôø£Ã>'Ób±]jD%Á[m‚%Àè\ž $ñÛ5œ|G¢øAÝ|;áË{»ŽUn®È Pu ŒôÎx®(’àgÔâ´tÍFûMº†æw"c0—‘26àãÜuúÖ2Ì*Õ››V}×Cx`éS‚Šw]ˆ5WSÖ®~Ùªß<òtË·zÑG°â«¿™ÆÌ{ÕÝoCŸBQ®c¸ŽTð¶U”çØñÐóU+Κ’“æÜéMY[`£ôR Ö§¨¯a­)úÓËÊ|Ö8é“H®¯÷h##Óka¶ËZuù‚UbàsÍm‰€ƒíK‚åŠBrNúg=:í®`«&6έÚ_˜æŒÜI Dã÷|•À×]CŽŒÆ¥%-Q´²ZizÝ–­q*G䯲°‡å`C—“ËgúW{ñö›½¿ð‚øKöP­¼¶¢&’T ÊNÖ-ìÀØã€yT—r^ÏçÝNÌÍ÷Ù›$Õ[ˆá^Q»ô"£(Ö…¬´wB…(9'/ø#Ë+<×33Ë#e™ŽwuÉ'×¥Øó‚²A§W1³ (¢€ (¢€ (¢€ (¢€ (¢€ (¦ù‹Üâ€%ËÍÆ@=išU‚?¼Ä*ýI¥¦“Œ63øâ‹Ýê;‹2Cm+'š%*øÊpןZ}õìîÓµ¾Ç'åØ~Up?úôÖ“Ï0Ä‹ÀAÅ1—iúm½º³»·keˆ¦žUˆäú tMpÛ‡d0ûÞ¸¦FîƒiÉÉàÒ\©‰»·µûA#ÌT=Ù=ûâ®âþÿCòíZ+y ›püö±ý~•×72ÚÁ§<1/|±áÏ9%½~ö2{ Tmk-´A‹m k€FïjÖ-G¦Œú“µä·:_öeáýŸæ€–8QœGã×üx¤2½3Ïz´¯hòU[»è=²?­^±6ZÊ +Ó¼ªmî ¤ç£þúzM:}CDŠ4×eÎsDÅíæx%S¹«ƒ‚)HÍg³M¾’“cÍ$Gqb3ŽÙ§+íÒ€è(i²6N´êFãæô C_®OçN`ƒ–€ùíéMyAè(loâëëšrÞAô¦f9ÏOz{H±ü¨ GQE(¦ùª~è'è)<áýÓ@ìÇÑLi~Zó:¿OJ>šò(õ¤ †äƒïOPƒ?i\‚OD'èiLr²ïíSÄÈÊFÞE*£»o_Æ´öiƒ•ˆ çsô?SV/3–À€Hǵ&œAI±¬%ÊÍ|ÍäðGLb” fÚ«“GÚ.<†·I¤XËÑù‡i>¤t5wFÕlôÅ‘§´2¹³ÓëúQMÉ);R|·KR——°•*AÇ9¤ØÚsžÆ$¦iZWQ’Iâ˜ÌN JÍÚúlÙ³nÁ“Œ7¥9—# Ç­0FF8s’iäÅŽ{ ቓ…I$´×F#Î= â“v÷ 8Zp|öÇ´¨r¬‹ —Ë; Û’2 ëŠE•w¸e d p ¦‚:zHÎφ’BÄ``çÚšz‚.ê¢Ú.⸷eXÏßnF@õÀ÷ÍTPA$ã §ÝCåÝH±Æväíç?/n{Ó7c½ê¦¥Íª€Í³3š@§RÙÛŒ}iv‡É.©‘“×Ú và@0/˸äğ󚙣hdâÛ ìrFAéÓµ2bÒH\ªŒœáxéCÑÊsAAœ¨ŠqõP"2[Œö§*÷”~y¡˜gÍ*¶îÔ2î¥##²ÅqÒ–€ˆFwbœ@#fŠ(0=ÐH黹üéÔÖ!\14 äf“i ŠåíM=@zJ‹ƒ¸~U*Ü(PvûTr»OéM§š¥6˜4‹"åSï6}1@îS* ¸?;{…ؼ çƒT§Ü\Œ@è)6¯ ¥¦ìÕ•Ú¥AÅ4ýÏ(w"ŸEÑ·I#‚iÔÜeA¥»SG´ FÖîñ¡‘ ‡–Ù†àG£Äþu¥â; O2="Di—%âe;Xr0=:ŒqúW=y¨Iy!.¸Vlœu:êLÒl¶pÚB,ˆ°#×5Ùð9B;tÐÍÓ”ª)1¶ÃD•¼ÛÆš5ó>ä`$gÐã¿j“NУÕ/^+=ZÜ"s9ØO¶1Ö¨„Ï9íS!ÓJ©q"•LeX`šÂ-ûÉ;ô:={Ä:}®¤-"0µ°%íÎî~fçƒÿÖ¬s`&Tk8š…3#‰9c“Èôê?*»¤øê{M&mPÉ œÂ"”.Ñ׃‘íSGØ:>³”‹™2îW ÈRG ‘Ó=«¾QÃÖ’pùù3š>Ú ó|Œˆnöï–'}¿~N¼ÆMDØÆHÎ+_PŽïK·‘ü¸ã·rK"žW‚=Á¬ÛhUmÜÏ 9?#Á݃ÆyãŸÒ¸ªRå•‘ÑsFìRúqÓ•$7hV#–1éê*º…V`9ÇCœÖÅŠÛiÖ/öK=ÄënòÁèTvn:ûÒê0xQ-جo#”F¹-:°/üGFq“MÑ”¡Í s«ØÈVÝÚ¾n?Zpt¤Ü¤€qϯjç¤Á¤ ¥4«ù‡±‘NU#© ÀÎh##ŠÁOLåqÒ–{Im³¸>´ìípÐj!:Ž”R¢Š(À5ƒPã×ê(S @ƒvrM'—¸eNr;ÓX09R­(!Î…[ÃQWÉÍ!Pzÿ:š;uaž”¦ÝÁoÊŸ³oa9š·áíëWßg' KUGû¦µ<5¬®•YQ‰ÎãÔŒ ¼:¦ê¥=‰¨æ©¾MËúÇ…4Õîf’V>PO9®q[wj»¬ø†ó\!fp¨‡€¼gëT˜§X™Òœÿt¬…J5#}Ý‹E#*¯*á¾QœÁô£ÐW=ÐP@ RÑHlŠâ%0©‰×ÜTm»œŒbœ¬P‰#8#¸©¡–+á庀øàæ­%SG£ µ¨ƒNœF.•ÆÀ ï\eéÁ­¨/ÄZš.»tååAÎAm­Ð:=¹ÇJ̆)£ˆÚo;7nÛ»ŒÕ¥‰í 0‰r¾«×ë]t¢áéÔ¤”‹隦·|ðb[©cKXñÀÎyÇJTðæ­§ÈñɤùíädR¤˜— n$}k²ð½9¯j–]N¦Ú_SÍ©Œ•:Ê´g™Bù’/¶@ûbRî@úàgÕJía•Ê»,œîEþ@‘ZóÆë› EV,„äŸÇ O¤Ü[H·vÁ(ÑdûõÍpÊ «\ë§6µ9Ëûu¶•¢Ul†ïŒÚ›W.`ŽáÎÒxîET¸¶kiJ69zו:n/CµK™ ³–9¡ÉUÜš–;D Ï©&¡d*rR¡ÆÃVl<0=N†êõéUTqÍBêu¼ÆÙ²zwá$¥g°[MÉEÕxõÅ-:êådPBŸÆ›JI' ]µ¨QEàf¤Š@3ÕqBù¶Æ‡8ÏìÛ º¥-¸ÁŽxéOo-mÄ& >rÍšd)#ŸÝ¡>àf©+IصŒø)ÝÛ?€¡‘–P§=Š‘’¹À9ô­âšFw»(R`z ZÈÅrš ž•è> ÖtçÒ'Ð/Õ$†èyh÷AZHcX2°SÕHä`‘\‹|+áË­Á„ÐHíåJ ž#¶k³IN’«§S“>ZŽœÞ¦”—†W¡ëøU-YC•#¹ÍI"&[)¯2Æ1ŒýkÇ“»Ôôà¬A#0Só V’@A/žWµXŽAÎj%“ÈWráÃ&qù×4¬ÝÙ´4#UV °àu¸¡!8èz Òf“|j[=€§•/ØâÎX±'¾j”'!9E’SNŠÖyðRƒß¸«Q“Z”·±U! ­¼gq'lP²¼Db-OÉ2 6 bq.âdöÏ Ùõ‹¸#³uˆ,`Ù©?RM/ulõ >¦ö¯j†²±‚2O89$ôÇ»[Í/_†=ÄW+ ÷¼6ñ2s…lnOç^iynºsÂßÚ±\‰`YŒçËÈû‡ÐŠÒ¶»¶¿ŒùlÑNŠ Lï9öÉý;׳„ÆJŸ»-|›<ìN2Ö:<ðΟáŸ\i¶š™U·B^&VxÏ*ÄtŽqžõÎÌÀ®±×ìÆôßDJd—tþ‚°¥ˆ`P¨$ðONk,M8ósGfU ;Y7œFyúÔÖú>þK(õ<Ò«Çe)UPå†sž•³á÷°ÔE=ÔPì팎œÎN|¯sJ•%Ý£K’š7Á— š­sÆá‡$õ'½o\Û[Kvðé)$¨2FNâ@êFJÎÆÍ´©æª­¶3§QËR‡–ÅÁaŽ*X”FÇëV£´ˆæRà‘ü>Õ#$!ÀÀö¨TZW+Ú\ªŠK`Œ}EO$jq»šl¢Àwõ§©C…?*Ò1²ÔmˆÔ°<÷´¯"v ÓBdà(ÏÖ†’%l"1à–Ç "¥ߥ3Ù–‘ÀA’ãò«Ô—f9p½^µ”¯+9#~´Ð ž½*y¤RQ?ÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?üK22¶‹œñ O¢7õ=KÄGL¼Kû+: 9=ÜaXªôf%•²¤ŒqÑ€ÀÆ+ˆÓ4x×ÄÐ +ˆ-¦o.²Èß9þ9H(x;XŒ뜚õ!i ÞÁi*_|BÑ,žûÂÓ#[ZÊo5XÄfY™Qw .xáP6…Ü[å©ìüIñgÁ^¯¥Þ¯%ºO²ùû›{I–ÈeÀ|(o˜` cé™ãhÑ[Ç&• Ü4cÌ™ÖH™V3œ’›åÁÇcÓ n"¹”ãCV:”dÒ{Eáÿ‰Ñxýî@¶š 6 õ Æ9õ;†@\“@À¦½°»ybMb cy#߉%•%†AÀÈn€ýÜ€jæ£y¤x&Yu-y2›ƒ'ÙÒCÀ8À =ð1Éæ³n~)x§ZžI§¸bdWd@ÄYPoñª¿÷ÏàÕJ¬e-69ÞÅ=JòxVMBfq«Aº{p‰K’‰H·qÀÆKšò[K¦h|íæWÙòŒq>ƒœñßµl¯‹®­â•õ kY¼÷b-ü±ƒ·‘ò©úw'Ž98¬ÿ³ÿj2jF‹Ãk,¬…²NH$ÎXg¾5ZɦD=ØrÙױ߾¡¥k`d1±ÌN¨Û;ˆär}9ù¿›QU{G˜ÈeØÖ"àthÈ=zþµÐÂ'XݪBcFÝ"°ËôÏ~r0xÏZ©«\_\Ù=ÄÿyATTˆ( Œsß#­i §ï#ÏÆO½N>çÍšA‘®Ðqaºó÷WwLàdúŽx⺠øDMvòK`²$±â rvó’Aç#Ú¹©Ýu$ª|Ô}ÈI%H'Ÿ¦sééÖº­>î{T‚y.–&„ß¼üÛß9ÿõj竜”\l®hêI¦Çoc¯¨òüÒ¹T]ˇ1`d÷_|dü¹7lRê]FßLÂ]B"äÄã=¹úrq]%¥Íõ¼Ö×:zÈ̸$ž à•Ééœwàd1Íj6¨— ²E J©-–²9Æ /®:`:0ÖæõªJ)4´>…àŽIÉ*{ÕÔžo³²,ΊÄQÎò1ž½ÏŒž!ðª!Ãß»/ú¿Ü¨ ï®*ñé Á…än@ü+õøâi%ñ'ènèToDt¶È%™˜®æqàêÇùÖ” *‘‘ÆIÈã<äñ\l^&’6"8WýIãõæ¤9×å ‰øÚ­.â@ÆzÚž;©Œ°µfÎÎ5q(Üp1œ‘ùúþU{Q†[,G¯¶0#Ü£;*¹<ûqŽ{ž pPø¿ÄQËóó#?­OŠõbÉkÞÎ0Ý{÷ëÀü«¥fÉýÆ/U=Z:·¹rU-´än9èkا¼¸¿ð¤zW‰xWÄ1I2jÙFPðËoqí–⽋Á:¾›ªi-á !Â?˜ g ‚ätöÇã]UßÖršñ„yœ£¢ëý-þG›‰‹§ˆ¦Þœ­käIá-;„»×g‹Tÿ„rÎá#¹x˜ä.®6º„v­€8è|+ñšK=/HÅhÅãº7&9<ÂÀ ÿ6ŸøQï•àÃóüHÓtëȼõÔ.ŒVí …’<°²àô*~^`y©~8xvïÂ,—RÒÃ-¿žÑ¼±Ä1*±ÈxÎ'¯×šüfn.\¶Ôúˆ¾·={à6Ÿ¥êž2Q¨¬ò{7•¢’8²ßy}çæÙ*ÆåºVÁäôV‘à?Iðþ/Ýè×–Nµ«Ç£Øê%ÂÇrþhžV@:Ep³»… ¸ð~pýšü{¡Ûü9¹û1oÎÎ¥ˆ0H¹ýÚ+1ˆ 12“^gð+ã×K`²’Nô–§~‡M' ­Ï‚cñÕ¯Ä&çÃWÐÜ[é×м÷J©ˆ –%hÜß( ò1¼c¹õ/ÙÿÅ t‰.ô+ Ûyu[×2\Dò,j%v³† ÉÂHÇ8Ýšð[ëTM>K/LM5bŽñï'yÔ˜–Y”6Ї¨ mXØ|ÁFî÷Á_¾½µ¿Œ5›+PxÑÄZ¢KW@qåUrÌ­¹ºs÷r••Y$ýÕ¡(Uq’Öûžñ¡\xn{ùþÍw÷ÛÝÍxé:gÎfóc.ÙŒl%ƒ|Ã#¤â|[ñ§ƒ<5¾•¢iÖöz„*fšÐJÅ –'!› üÛ‹.†? íÃxƒXðF‡¯Å¥øVêÖÑokg&ø\ã.9q…V y$žå³Àxç]Ö[Y>ªm–Á$f’îáŠ`†ÉRã‘»‘Á9ç¶yÔbÝÓw:å-9MM+âo‡Ô„™¡eÔ|¹ÏÌTœãêM2Ûì®Ñ*üªÜ2F0FN2WŒäœf»N]R9iÓU%¹‡/îîu9!¸¾ýÄy3O'½‡La²*î£qý¡"ÚÙGµ|Õ&ì þï*€:õì§jö¦ú3G6²mflåôùüºñ]&‡ªér –[õŽX‘Uw9=6žH>ßO¥/i)Ok¸Ì-(ësWÐ……³Î!Ç”]ÑH%É ©È}:zóÊ=ͤP°/ÌR¸¸SPÚ ‘»ø¸àt䌚ô_XXêG>Ÿ©Æ–ɽcÆÕ!ƒ ©ÎìÆzv®?Z³!¥’rÍ çËIêÀœŒŽê9ê}kdÜbx“„ý·*z!šOŠ$Ôoàr‘ ¹A’Dù98*1Ý W=F8"ý׊¬ã‘ XGŒ–v”2ˆ/ÇaÎAÊäc©ÎN–Ö;{Ëv¬Ñí\1ÝžHÉÀ9ëǃEžœòËæ[¿Ú!ßóN¥qI$ò1Á'ñÀ'+R©³½JÊÒ??“ƒÔt©–öÝq¹ÿÀEVؾ”Œ#+ô¯ÐK-ZÑoSE5{x›÷p9Jätü©ñO!XŠÏÞ·¨íR[±<'#¦jãZMêL£hhÇ©J(„ž:ÿëTÐ^»ìŠ0@àÕÝ£”ì8ÈÁ稩`%_ ý+xT“jìÊTâÙÐé:ƒÅ %°ë]ŸÃMáÿG<“)ÈY¹R3Ž@¯9¶w2ÀÜIè?§­ké,’+žâ½|*¤&¬ö<ÌUTŒ”•î}W¡h–ÒCÿ M…Ž´–Èfk†e8RÇh89ÏÚsžséòÙx[Æi—¥î¥bÏy|Äy‹€í»n7äðNцÀ<óó¯ÂOˆZ…½¶™¬Iæ”pB\¡–28ÊžøÏðôãµ}ð·ÆšÖ·§[xìésg¸ µ Ù#*NùVpHÙ•Ré׸(#äx¯&§€©õœ?ðç¯ø_o›Õe¸š•±«¼y·ÃýYðçÅ7ð×öUé•â8m‰sæ@ÊÂ]ÁXnU@Òg)ׯ×ÿþ#ðCÙjú(KKYŒO%çžï‹x·)v°EŸÜä*©çÄ~.ü!Ö¼`‰â_ Ã,z­»‚^wÍQ’ +ÃSŽFkGàÿÅ'ñ¯‰/tYiÚwŒ[O‚ÂÎÃN±k{;ÁRð¢StÆÆ@Tȳo;Éø÷%Z-õG¿Iºz'kžÙiðïYþÂÖõí6ÆÒÿD¼³š4³HÐÉkvì­<ª°îX¥òãx6Ö,ç9YðwÂkaáoÝøãÅÏ¢Ïya/‘ciÎ×ú‡œ°CoT-æyžkòŠ9HÉaµįÙiúd÷)ª£C( ì@BÜáü¹ß]¥*…AXÃí“Y7^ ñ.­§jšËˆ´Ö¹¸–èC¦Û™M¤±Åæ<‘aˆ„e2"傞»‹V 5\—2Ðèj†èòojñ~ξ?MXI©C«Ùxž+:ÐÚó<”•Ñ$3 ªÏ"±Ül‘Q”e8»ãïÛŠ-ÀW¶ZV‡{q­jOm³¨ÜÈf’Ñÿèh%’=·RÊw1;š?”àn¡ñ¯À¼l'¿Ðµ+S§–2^js Ÿ|±ÊÒ3Žå£ –Ã|ì3“\W¼;ñVðòßërZ_Çk:½”¶±b¦Ë|£,@Èsp¤Ô›×©ÑF Rzhõ^ggà{ï ÿÂ]àýúãMM*çW[‹éï^4k¹eRÀØ+•™ ó´óߟzø—â?‡ö>›ÃÓÙZøÝ¥2}ší¶Dcv„Å‹’…$Üà†M¿)¼gá–‘ kº<Þ2Ðô» ­RÜÉg5ºÛD71”í(ÎvÆÃqÌŠÀŒ±*Ø9êµ­&Ûâ´ï§i67ZMŬ ¨—$Æ\ù›MÁA?í1bqŠò1ø¨Î²´ÜRÞßÎìRŒ›‚m핬y'‹|MâÑã+­WO𕵖£*l³µ|,©å”óã¸Iƒ’å²vŽ8ÆÞi>]i5òXm`Q.©ªÍ4Ž_q=8ÜÁO«nˆôÿ‰¿&ÒšüxOÄqoi3,†ÞVù€`0~_œ À€Äî1暯…üa¡iñh6ñÇ"\y±Éq1VK¿)WÝŒn'¸ÛƒÈâ½l3§V QwLñ±RÎ2V6týé¡ê ‡§Ôtû‘,±[2Û¤y dœ·™#m< >sƒšì¾ø2ìÖ×4‹È¤u—tºrHþl• ¯Â©qŽà0ÇLÖOÂïiòxVµñ. -.lþÕYáHüÕxù­’D¯¸‚C) œæ·Â¯‰¾'mM=.#–I%ŠúÊß÷˜ùq$‡9n;œóÐñŽ>3xy(ôÆUfzÙð–Ž&¿Om’Þa<®°3ÄKÆû•G$¿!#=¨ÒÔ´ [85_ Íe|±ëŽ¢c€·ñœœ®lR0¤W9/æMaæÎð´Û-wÂ##«™³è2vŽ{VÍ£êZ”Fþâ2'kLF»À8ÁR7gœÜ‚F3ÅqÒ¨£vmRžê(¡â @{«›ˆ ³Œ%ÃBìT)W†ýá^0 <9ì9OiÓZI–H%d24ÑMÎCHPq“ëœ`Ô¹ð§¢j’j %ËÀb"ÒÛûA¤HK8bˆ $¸¸79Æ+2óJÔ-µx.âf’á¢ûáv¢œ¼`úñœ×U9¹kÐâ¨ù)…5 B÷ÍÔ-%š@G–«!$(gæ?Ë‘è7‡¡Ðî<ë[$‰ÏÈí€Á@ëÛ±ä~<ó¥ãH,õ ­º‘p«µ]KíN0zŒ‡¹Éè8SÄÚ¤vx’êáÄ·9%Fü.sòüÀ›G§SÞºe8ÎÖG3MÉ¢¿NXt¹ŒHä°,ƒ°Äœw1†À#¦2xÌÔ5Ûwaži8ÓsÇåÂô;™yüC®yÇàÖ´v½këÛ¶TG+Âï21ÛÛŒ~¤tÍYC¡–šxî©M‹±Þ2>Sží‘×õ­$ܯ#Q¥M_¨Éc’(V xÚàÇFU¤†àœŽ ïžÉR‹¥Å%é»å–g!%L“¼œ©e9éׂ3É8Å›Û'¸[2 å­Šyp°©\Ç ‚G dç‚ A¯µ½bàé@¸y%tVŽþxÎåçrò¸Ú¼öük¡»è¶<ùN*Vgçm!-ØÄRÑ_c©ô0è}*KE ~•‘G¯åO]¡•a9=ž9ÿ ¸°{˜… ‘ŸJ>m܃'Tqnq–§3®0ŸJÙ32tr@ËpkkH”E,a£€A=;V…”ÙÉô®¼<¹'sÑæG]¢ëßÙ÷ tНåa„l¹Väu•ôgÂÏDñÙjl©ql±!ŠÑ,házà0 Ø$­|¡Ê½ÓøOZõƒ¿¥Ñ‘4+ÔE‡~RV$`gœöõ5íS¥†Í¨K‰øe³ìú3ÃÆBµ«ÑÞ=;£î¿‚ÂóÅñ¿„dñ2ß;H’YyÆI–6Æa‘[Nz;‹ü ç|yáh>1Ó¼Yá]cQÑnu¹ô´¸‰#%¾ä1 ¸³†Ú¤Œ…þ"<×ÀŸu êÚ޼=2«ZÅÄ2)I"9ù$#žÝ°@¸¯LÐ~/øƒÅþ-Óñ—Äfç_°ðnƒ£ÿ`è-zÆÍÃbH ‘ Nņáäaú!_”…Rk›žòK ›ionnSKhž0‰>ÔˆÊÉ…tÎ<õc$‘_AþÛÿ#ðÞ¨Òh^ÔƒC+B#Óö"Hù× º¦á’1´‚Ùôùsľ ñ­«k›;¥·¶ÊÝÁ4yGÚª r>ïÞæ àîþ5–°Ñ-wïrjÖœToÓC{öyñχ¾ø– jÞ8²6·äZ´7#Í$Œô£$dr7HÆ=[Åpi>1‚xÒénÓd-n[“p>QÆ©ÀàõÀ#×Ë—ÐéžÕmµÝ3Hš9ãºi’;õF3óªNàêÇ;GL}+ÃߵƇk£%§‰ôëˆEb–Œ¨`@ ÷‚ŽH÷ïÛ„“®«F7oFU,l'KÙÉÚÚ£µøOñøx»Ä¾$ñ”ûtBY-žÍÓ<¦ ŒÀÉߟ—®W}â/x7Æ[éVÅ„z† ›´¨ä¸`ûº†]»YT¼sëÈ<×’Ü|Að‰-WµÖ-RG`LríhÎå%Cs½ˆÇ©æ»†>6д ë)u )ØÊa¶Ô.­Qf–5Œl‰\í,¤ä(Á?1À"¶TãN7еŽ9Vö•š“º}N7Æ>ñ¦…ðóRÔ¼Wáx¿¶c²ÿAûŸeÚUœ‚ͳ\q¿8™ðïÂ2xjʰÛn3‰&ÜDp7+oèF03žzO>§â„†êš®¥á‹õ]BX¶ÌÛ"`,1œ–Ü0 ‚v…ÉÙñ&‘<Þ–nÇäI'D°#³Ó#pNyÍyY–*¢ŠOálôrúPrkª<Ò{.^6–Z9ÙS’yVÎ}~¼¤×[á;/ÃÍfo¥2ÄÇmôPDÌT "XŒ»¸1 s‘¦¡ —£z‹Ï* mÛW°9Ž›2Ý=Á;¶0jšÊÖl<‡…“ùç¹÷†zÛxá§ ÖKÞ±ÝWš›´R*ëÞ,ñ­vöÖg·µ·-åÛɳ#™ œ3e·cž1ŠÅÖWk!·Œ ÏÍö{q‚Œc¶Üäg¡ÎzƒBѬ£³kwV–íG{:œùx;qÐmÇ wŒuæ¥ñ†m Ñ—Tk”ù±,ÇPćЯ'8àŽ‡Ó¡R)ªo¡óµ¨Ö©'/™åz¶y{¨^k¨òm|¶]À¦K`dƒÉl–ã'ãåÚk–ñž£ucª›=fÆH•ǰ–Fˆ÷»ðæ¯uuo}<âä@i}¬Êœ„·ð¹<+_Rñ‹â×TÓ%TZ:]¨cŠo*V‘‰Ê¨ÌŽT¸?$q˜•;;nqS²wgå(³¹2y~C)õbó©“+øø‰Híæõ©|¹#`’HI FsÞ¤C$nXŽH㌂+\úf¶4VÞ±½Ôy8¿¾q­OýŽ-{\¤€ÿÏ6¤rG2Èy=ÍI£¶ôÍkRÚÆnS{²‰7£ŽV;±•i¬™1ÄH(+Ž*HÌaƒÿtú´ò](f¸Ä›Îs Î}ë¢]L¥>ˆ¤É¦`sÓëXƒdäwªÀ‚7*¨¸n,{ÔB„í pzŽ™«;KB=£q ªù 09âµ4›ÿ"TûAvˆ®a߯µPH iûñÅO ¯˜<§^7œWM'(= '%©ìüU¥ø—A–-CNŠI@Ü®@Ãr¤ÀÇlö®·NÖu½ìj¶Îtù­Y~ÆñÝ–tŒä# P&¼@Ö¯ôKã6Ÿ1 ÿ,±±âUî¤{ÿZôû/ZkzZj¶RE+:ˆç‰òe„r<Às_S„ÄÇG’{ÚÞ«õ>w…tê¹GfþãÜ<'ñÅ¿ìµ;+ýx]ÝEj‰,ÂBZh£<¾®YA~»G<ŒŸ¶þx›QÕ?gŸ üPðGŒ®µMCL¹X¼]¡ßC$ºŠZ°&Hƒ£ÆÉ!“÷NÍ&¿3¼ât=F&²ºšÙòQdß±„l6œÀò;Ž+é_ث㟎~|@—Meûu¿Š´ó¢]صÁÝ|’L¡Dg*Ë.Jã$‚àsŠüË2h`±1ÅQŠTçÑ-ºýûýç¹’ã9¢éMû˯‘ô·Çë}KÄq¥×€¼am©Ûj¿cŠ?Ý!cq.£“!±ݜm,,ÍÍÉðÃ^Ѧ‹Yñm¬†ÖÆi/ç/7œ¯ónQFëó6<¼‚ÌF:ÖÜŸµOßÙ#Vºøâ¿kqX_Z e&Rê[)gFÛ ™[Í xp0»Àè7S¬|g£üXð¡â⾑¬´"-FÓEGŽæöÊÃX^¤Áÿ|²°õñ²Ëó*4#^µ©;ZVÑßÐöÞ#ˆ“Œ&œ–êöwùœ·Š¾xÆž¾ñE†½¦»Ë “´;·ß Ã2îG)=N (ù³[ø5¥¶¡u¦´Ék$PÎÍ2FbŽá*"måÊäp °Âƒšú#Zñ>‰¡6£{¨}ªê)nài¬aýß’WÌq2+Œ‰6œ‘ V#‘Éáâñf›âojWºO„QQäIp¶¦[vBÅ]ñ_ †$í%‘ÛœW3¯ÉMÉ£u¬¾ø¯E·ûv• Ô ìñH7¶òŽBÆàrr¤gŸ\u¯lø0Þ#–æ_ø¾Ålu•míîæ8Û äc¸n +<áÀ MCðï\×£ñχÛN¶¾[Ûf³2Ù$ÂvfnYAF~cÏ9Ρ®ÕñU)¸¨^ÿy´)QTÔôOäyÇMXÑ¿gmã'…üyo}«êž!ŸLÕü?i¦Ÿ´é_g•Ñ^RIdR’«¯÷Žv*?O­Þø6//%™¡Š8&/¼9òKaÈ烓^çã„^øsxfù-¬ÓO¾žú Û¼áâ+#¹x œ)T ccW). GñBËUŠã÷1ÆÖz¼ (Q$Á‰²™7#ì zyl ó½¯5N´,ÕíèŽîYR¬ªS•Ö—þ¼-›Á„òŨ^½Þg'Ìð#]Û6Ÿ”Ç<äŒÓ±´ð\si¯vBŠÞX%ˆÙÆp¬äŒ¹É\»°ƒá-‡ƒ¼A#h÷ñj\3HÖ1ÜBò¦ì€Á#lŒPs– ;WQéV}v‘ÂZ2ð;B¦+ó 2Çq8#å`¹\á5ãÔúÔœ=–Éì{”§†){W¯sѼö }5}R8nâCöxå!¦c vU@ªÍ‘’H?Â8GñgÇVVúÕäžÑ,CËFŒÒ2`}ì)bJ¯$»×=55/Ú=é–-M¼¦RX œ7|«ÓÔœóŸl×ø‹Vê×3ê6p8b ±Lá¸rwaŽ@ÊÀõ'¾ {Xl-W_š®§Ïâ1ØXÑ壣f2ê)¯J«uyö{‰dv2´{#*[æÁ+üNH5½"×D³‰ü6Ðßý¹Ïqe`“7É™Ž$‚eˆ © ®Cn´û•œ^ÛÀð[É6Èd1îMøÉ^ óò€Fk–×uù­õ$ó:²¶\  õÁÃs‚zÕô ÅFÈðá9JnO©©4zm´†Ü³1$.­KƧ9PU‰ Ç tl1Íñ>¿=µ”Vvpªµ˜•…ŠÉ{ŒŒ¥X1$cbŒgéÇ=öµHÚ”Êp•8BICÁ<sמÅqÇ‹â2×6†ÊâîIlÔ -nbPÆAÈÉ%3œªõ&ºéÝ#Ÿ)FÜ»ÿ 5ýJÿÅQ’Øî&•Ñ~0>q÷NG+£œîu/Eek ií Æ§  @$”0uùFNÞò£%¿‹ƒä~}FÞÖá®u(bÓç¹ÂÊÄ0 }Ôc´ŽH«oçbC3ÈKîPB«nç±^Ú8æ¥Ôijq]Éê|Dº>£å,×(?u™HÏâhhr<ÎxãéVdI^ز\–ˆá@g$Ÿñ§Û[‹ˆš'e^ ]Ø'Ôû×誜]’=—Q”Ì>j°TÉQšˆÛ$«`Õ«¥¨q•ç½T2Àr§pçô¬çJÆÔ´‘2‚pIÈqÍMö™n2Ì#¯?­T‚i]Œ» þUv.~íMƒgè o7rÃÝí’00ßΟo´ è8äûúÕe“Ÿ•8úbŸ;~í[å?­Tfú“$¬hÛ™e•[,-§ßñ­Ý/X¼Ò]»*|ÙÞ#ß5Ï[È¡A'æÁ«M¨ ².öØÁqÏ%x?Qþs]Ôª:~òÜæ©MOFwú~±}ªþîÝGÚ¾\E2ìÙ=t÷Ï쟮&ø‡§ÿÂ/|¬³Úº¼(–`PpŠžI Üÿ.9ó$¯læX¯çŒ‚XLÃ×ÇÔפ|ñlõô:r©ŠêÖ2n]zN2¸l“’ÄŽsúWmz4sŒ$°U]œ¶~kf2¬eƒ’¯¤wô>«ý£Wñ–“¡øÂÖÌÝI§èâ-nxÉä•û»³Êà‡Ý’pÏžŒ fþËÿŸáïÄȼÅ?eÖ­[O¼‘g´I!R®¥þNW;Á$wªÿüoâË?ÿÂ÷S¾ªòYÏlW-;?ÊÑHï.q• äŒ`çŠþ8ð6½ªYêß<=á4¶Ðí¯w^éð«‰ìUßk¬$4ÀG–eU#3 9`諹š\²MBiüI»«y§²ò3¬•jŸÚXVï¬{[•«¼s¨è–Oaoq¡%‘¸œµ´0í ôVfV$s’@À.3óm_›üMæãkÛUµ–ÿiXe€"¤JÞnS ·Fö;I<šôŸ´„eOÍ7ìúúgßÞÏâ#Οu4ð™Z&d† éÁ+‚HÈ-ŽAñ¿ ·ƒnü,ÖY½ÜÛ=ÃH$‰âs¹ØpH(ÉÆyaïX8S”=äuS©R5=ÓÎ>é¿>h/¥¤—ÒXµÙ»MRîî9d02¨ŽBìTÃweƒ:° qÔüB²ñ.¯á3¯hWÖ÷ÑDî.àó@xp2TŸãûÄ`dâ1‘×6í<>5Ûkk¤é—:nƒ†–ó6ËK•¥…”•À™Y‚à¨} õ_Öþ&|Bð·Š_Á§YI$’Êî­™ †eŒ¤’¬e˜)$ÁÈ`sÍ*8?yÉîÙœ\Ö Û¯Y»ÒuF6×—gŒBaö†ÀÈ8¿_ιýcY†áZ|„·IzÌØ.HàÜ‘|œ×oâ?‡—w—6:¼'Nˬk¬Ð’AÔtÎ{zçµÝM‹Q6ñÚCçC…c…`wÐg°ã¿\ÒT£(­În¬ž¯C/Ã:¾áûË‹û¨¦Žh–;eÚD ß!%²8a‘žxÉ«¤øjoÞË¢ £ÉŠg”n|ÁK0{Ž>§ÍfY#¸1,‹´âir¥‹(-·'¸çŽŸÎ³ôŠº>ƒxa²Ò®0¬dó®]Á+óŒ1îÆ¾kª† ‹¬©Ðƒ”»#»ŸB’ued¿F×àÖ¡gy“©^[­Ób[ç÷‚ k¢ó€~cÇ ðÖ¼|Kàæ–]áüí6þ'baVg(ŽNÈ2}Êœt¯kýŸ>#øSÇš›ð÷Æw7c[Yæ·µ¿Œ«,rìÛA¬y#;Èà·.Ö|-áïü;OxsÂ1èúí«[L†1+ÁªÂÆFò¹,P™ ®pJ¹ž§çAu'€|Vö—,q\¦RKBìØÚ0x ñƒÈéÖµÂÆ—åóÂã—-ZRåmZé­Ÿ¥÷[ÓoYT ¯®—Gý#Ú>-ü3Õ¼)âI&[)f¹†ALA \‘—'åǦãXþ¶R›»øRÒk‹— :0;J‚›C¹“Žç•ÈW£ü7±ºø³á7Mð_Œ"Ôµ6±–fMRí¼È˜Ò ´)\ ž¤ã½yN» k^ Ö¥Ó/³°ŸÝ4Gty ·+ŽÝÇÓð¯Í1xG…Ä΄Ü[Z«^Ýlz¬šSµ“ùü¥| â=6ö +U¼Š'šæêKkkH'ýô… S¹U@mÜ`òØÈÀǪÛé³kZEͬK Üò½½×—$’mÜÑîíQ´ŒûžNyøÓàtO‹½WT‚4Øä¼$f åyC•#oÝÏБŸ—ê…ß5ꡎD†á¤[0@±±Uû¼³ Ú݉Æâ+Ìœedzt¹%õ>×ßÁ¾º×.ôý"çN¹²–6Öþ8§x¯’8Ñ%Kµ#Úçî‚A*p?;ÝøKá¯üS¥øûUš{KKk·º‰Å²&¤ ¼°oå•Ñ&pNTn@ŒNà>‰Ò¼aàÚ7OÑtK/ ¬wL‰oöM=.a¥Ôl¹å0›cÛò0m"ŒTùO޾øvÞæ ˆ>.x/Å2éZßÚ/®¬ožÍ.H¤tœ ™~tX·“³äç ¥6ÔnÇRœg±åÞ2øðöËNž--‰=ó[Û\MÿLeF1Ï)Ú±0ämÛ’®9Á‡Õ¯§ÔtóÈÒdVYÙƒgæ/•Æê9ô’k3ö™øàO^ØéÞñ:Uö‹hí¥YÝÙ­»L³ÑÊÁó˜‡}üêFb³ü!©Ý]øzÚmV f¼•f• 8r¸.NF †ÉÜxŸSJ­7+K©ÃxÂn ­âÝ÷V𖦚%Û)šæÜ#´¦5Úd˜ž0oÜ?(Ï <£]Ö„E‡Þ#9n@÷¯sø«ê>ðÅÄÖ"Þ(µ;#‘¥¨Cº|ÁJv;€$àaÎ"¾~ñ{¾_PÁãÛ½~³áôiÇ.­+{ÜË_+->Gƒœ:“¯N2wVÛæRo^®ùL†]ªÎØ$``)Óx¾ø[…ÆT#ºt=Ï>™ê¦+Í|Eã) ß“jÑmŠB[jäý|zý2jÇã­E¦Y'xÙƒFPHÎ98Àéÿ꯬–eÊͲ×(ÞÇ¢Ïã{§csÈ$ åKäeWœà’G¡Áìj¬þ3xbÜÜK0vo-c ÿü¹ô®1üUh]®ÍÎîpÎHã×ý‘X÷zåÝýÀšåR6 ±çzõÆ?JÊ®`ÖÌÖž-j0y`G¬ ¨î8¦ý ’R&È'óùv¨»H]€ŽqÓ,lp#lŒò3_œ©³í¹Qb€¾Ö…9ì:ÔË rJ@9þ¨#t‰1å€H§ Ù|JvžÄv­ ×RåôD‡$ç®âM<,LŒðÇï’*VY:.Aéš½$¨•÷lp8o^zW\=èÝ#žM§b»Ú¢1)(‘AâEsøø~b‚ƨ9$zTp‰Yh-ÙÑN[hè;ý*`~`¦6\©?ýjÖ)-R3•Þ‚¼c~@ãœàã>Õ"ÊJˆÄ}:)©þOÔÓ€(ù>¸Î;úU¤îf;íO‚F±‚ѱRG§+ê^ÏæÊË¡@èëP¬…™ic1ߊÑ9-.&“,»M¬F1Î*qwl–K VcÏ,ÁçrNÕÇõä“ÛŠ‚„‹ÍÞ Î­a&Ý™ŠÜ»`· «¹¸ËÜq]¿Â/G¡jÿd¿¸Uµ”ÿ¬Ý€§ëÓ®”:mff zšÑ³—`Qž+» ^T*©G¡Ëˆ¡ÔÜeÔýýœ¾/| Õ<~|N¼‡H7×ÚuãÄ~Ï CÉ&¨w‰'=Uy¯6ýªfmGCñ^£âO ø^þóGµ°K‡Õ24„<’Hò(#¨³aÎOÌ~ø‘«è :ïÀ§1—ož?`{júGàwí‹-¶¾ øñ;o©ˆÄ·Ó—f@B½«0ÜÍnчý×ÝÜ=8ëà[ˆži—.iKYÁß«ÕÇÏ}vrSœêAa±m/×Èñÿ‡¾4Öü'âe°Òî–+«yüë¡‘’@½ £9íÇ=}ëßü=ªxcâM•œ3Z¿ü$VvÌY®%Y"¾eÉ ±ç|ŽB‚G\äóÎ~VñƵ᫿ˆÚΩà«6‹Ik÷“FPûž({&òÌùòNOF t¾ñþ¡j‘ê)x‚é.[ùR•™_®ìŒÇfõ¯G—a3ü"OrkX˪¿GÝk±Ç8ÕÂT掫ªýW™é^]øcÇãQ‚kÄ‘îH‘¢cV%¶ª®pG*0}òNN}ÿÀþ#Ó|YáK¿½¼¶:•â³j:kâmÀ:±Uù£tÚUŽpKdc%Šh:m·Ä ̳¼Ú”d·iÝMÒ üÀ¼ÊNHʦpTœv´ñV‰}%­¾µ4ÎV$·¸ºG9xÐ4„²ó´’î^+ò Û/Ä`12¡YZQþ®¼™îeØ•8¦µ_Öç²xÅöúD©æê þ¸È×vSyS@UÇï¸Å%€Q•Ýœî¥ñ‡aãˆ)¬ë÷1ëZ}Æ­ÔŸÚR,RÏm¿&)%RxR[~â Ib(*£>éª[÷ÉÚ¹+žƒ®*èæä’hÉÅM?3ß¾øÂØ%žµáýK3YÎðÊÆ6eOÊG·`ò¯[ñ‰ oÌúUÅÚØßÜ,°µû„u ™C„^™ó€0~n|—ðçì#ºÓ-µî_÷±8Ü[¸ ;ñ’p2x¯¢ôCVõ¶•©[Ã$ac`¯!hÉŽ5ÆYƒ0Br»”Ž1€¾;Ž+QÄaðõd¿yª}¬¿R0'C:iûº?3×|7®Þ&•oD.¢‚e·¹n.$F…Sp/É–<äõRݳ^“áÏxDÒ¬ôÝÎÉ=˜·’Êd2„@¨K ,çrx,Iá_OxçO÷HöºœZ«[ÛÜÍ ˆØ}©‘åû9 !óXâQ¥¤xæhã–!‚ñæ‚Hî![@ÛYØ@6ÿ ÿû¹¯Í%AOV¢U¹^†ïÄ/x·Â^=Ð~!ZXG.¤LRæ)Q$Že‡–Ú ª¹'%7)ç¾øŒÖ?5Gì³#k7S]Ç…FÖi\±là’î Žœšô=>aâã Ž¬Eµ½“C¶ÌT.K…+õ8 Cq’=+žñÁÅZ6¥â/ ¼5°yﮡ¼Y"Ž@[y!€#k–b›ƒ>Ub;¢Šä‘͈¡*ÑææÔx›Í“ȉ³¹XÄ2W‘·w=8ãÝ­|ýâ%¡¹’#ÄD´§zïý{´×vv]ø{Åwoì ѳ2å6–á÷ÎG=Ýõ¯6ø™áç¶®-aWY‚Ÿ><1ÈÁÇËþ¯Ôø?4¥ŒËž¤½øj—x¾ÝìÛ¹ó•!<>&íhÿ3È5+]Ó°z R[é…v–Q÷È$Ž¿OZß·ðóê·år‹Ÿ0àœ…oé¾óaò®%€™‘›€U¾Uã |ªIàžzWÐG )Í´ŽÙb#êΧáŸÃï iº-¶¶lR{››pÌó.í™ìAõë×ÖºécO™ðïÐ ÌðM®£eáØ-u4A$k…)œê=:ÖþŠö%nÅÒ)dµ “÷Í@O±Ú_×{d{˜œU<§,–!ÇHÆöÚçÌMOŒärÝþÁÔSZT~”؃_’©XvÞAôÈÉR>´›É1H…¾óçò mX³j§i©<qRrÌ ©4ZÇ€Ê×h¤cG-úU›FdÙ36;m|~|s]PŒZHÊM"K:m  µ[–Ø™wÃrÙÛŒíIÌ Ápμd$›OçƒÊ¦Kô•Š›vf/ü^¼vöãë]ôÔµÎFæÝÐØ-]P—À8ãšwÙ$ùrW?/?Ë¥Mö¯ÝÚ(Ôc ¸œwËdÀŠz(ûÌô"µQ‹Z7&ÈãX™vîä9>Õ,j¬ê2Ý(ucòçåeÁ?ÖŸH‡bœ ` œ ÑEóÌ­qm­næGxagعm€œS ?0Äy#¢“Ö”ZK,k'“ò9à±àûþ´ã"—ÉÆ@Çå[F<¤-Kb9J$¥6,€àÿxޏöçÞ¤ˆ+ °üê¤ ‘»:u#š»k‚¤îÎzäÖð³hÆkBýŒv“)*€wþ¼vçëQ^Ü—¼š\dØ¿»Û¹À÷7²D?zŽÐ¨Ë"¶~N;õ§^?Ý`‚2G8dþ¦º\ÛŠÔÇ—]‡Pu"3#©ÝËsüÿÈ¡æ†î%åa)Í'ç®HõÏzÏ’x“÷’œ pqÖ¡yÖ[Y¤E!ÃÏQαu¤“] =”njgëz^§µ£]˜nQð²–\dpFrkÔ¾~Ð {åøkÅ2ÞDþ\Ä6æa·”ä|¸c9¯8°3#ŠeU ÌF>³LÓÛÅt’FCe†Ý* à`pÙùjøZ´H4ýšX…)i+o4/ Þ|#ñN¿áŸÚÞ´Ú9$®–$¸€aOT%•Ave @~O8>žµñ?€Òê&I$ ‘·©$:pz`ý{a¾øÇa­x_S²·°{"µŸrÍtTÅò1‹r®7 Á$±ÝœœxDqxÏáíâ]ßh7öš=þZ̼L"xÎHØÇ†Â•<Øê i–ãje¸¥Z“´£ý[æe˜SxŠi­QÏ[|?ƒHÔ$ p#2:`ðAú SZ6Z>až”ˆ±±Ú_™fô u×­Epnü©ŽvXíç\ÆÅzsÛ‘œcŽiú¼Ï&÷PË&\É–$–çÞºe8¸]t2äjZ‰-öŸo–ñÃ#>Ý¢F#9Îÿõb«ÛÞ3ÜG$‡…|²“œ3ÓëQ´R¼[öç¾´û(cE2Jüö__JÁÊr’èRŠLݲ¹…ÝÍ€øÆN0OÖ§¹“Êœ¤€ÄqŽyϵfÛ3Exÿ2=óßÒ´âd˜tVù{ŽþµèS“”N9+H˸-Éid]Í–8Sƒ“úôëYòè–.Å U'ªíÆô­»˜$ •Á,rÄŽ•FHy.I•ÍRŠníS¨í½ŠÖ âŸ]-׆¼Ewlb+$K$ìʲŒzŒÓÒ»¿~Ô¿¼#©Cqã±>£¶àñ( §’½Ï8ã 'žNxĆDq$6A9=©Å*è3žkšxZu#f´ìõ_wù3IJU¦¯ç³ûÏ}Óÿj…Þ9¶’Êk–´¼¸òÒXÌâ~ ˜à“ŒuõçYø×¡kRÛBÞ"ðÚÆ-½Ìö·&InT"˜® @ “Ÿ–&ÑôÙco2Þ<v)Q•ÒªG¡éлKi,¶þ[çÎŽf]‡§ïÍ|í~Áʪ’Vî“¶Ÿ4ÿ2 à£hÉý×>ŵø‡áÝWFK+šcƃݽ¨fW$îd½1ƒ“òŸ˜dÑé~8ðÂj¶ÿÙZ,ßfµ¶Ž;RÙXÂ@Ì›ÔÞ)ÇPwgž+â üTñ‡Ã½IdŽâ[›!Õäí Þ¼ʽÃá·Ç¿ x¯cÛßýŽévDÛX? ›×ò¯]ð÷æ˜_eFô«-®Þ¾·ßÕjyXšy– ~Ó㇑ëZå—„u›yµï_Åîþ%é73™]Ìp§#æÛšÁ²½û<ñZÙ^:íùò2Z3ÆTüØîF@9ÆsŠÑðÞ¥qqØ®‚O0ýärܪE.T®àH?9È<äddb™q%í›fx“K„[ÌÂ?4C(¹g-Ìg ËvÜxÀp<ÆåuðåF¼l×õ{õ^…ÆT±TÔÔ¬ÙðTлÓ:TOÏ©by7d’@ë‘Lr¥øQÏA_S/y[ÔBO Œ`S­Ëx¦œŸ”zTÐD üÝE(+°%]¯ÕIlÒ•SÚ› Æ6Öµ'”–õ0mŽ*¿9⤌ŒýMZw‰›v'W ù™Èô4"–,"'¢ô†}Üc¨&¤Œ+ýź/s[#Båíó•Â|øÛÏëV­å]›A⩉S"03è*XäÞÌàtšÞÛ39+—=¡ØGü5HAܤ’)J»œä~5¯23%†F$ƒŠy¸¿–j+pA9ôâœ0åæ)ê,Y:´ã €N= I#o•¢,æ]ÎÀ9ù2Aõ`ŠˆG¶±’òŸ˜ín{ÿž*`%‘V6Ep¬YG¡#ôí[(»jg¥î"¬†¿p9À#ÔãÔÔÐÅpÒ讣$²¤}E$B[yÜz{ÔðÏäE!Fǘ6zñ[(£9H±e$L¥<¦\’kBÍFõàt5Ÿ gï“Ö®Û˸Ïl×m-ŽZ‹©-ÆÅR™ú'Š£<($;>c¸‘ÏAïZ4GsggŽýƪ㌲ã'8>´æ•ˆZ•Lld;FqêÏ­7÷©ó7ËÅI.ØÉ8Á'­Tº¹EBîx^¸ï\òvGJ»#žçåg’P©Ÿ™ÉéYÓÞ%ã e"ý\yçêÞçô¥Ô.$¸p²Œ¢Ë={·©ªñÊdv²GQé\*·+-Ž˜ÁEK‰Wc®Tõ¨É£¤..ì.Ö}à c&­É×^Õ,J[çl–=3Ú³tã7©¢›†ÇAàÏþ;ð‚Ï^úÍHÄ‹,:wú×§5ë~ý£ü?â³rKh§„y±=Ñ%˜çpnyŽ:ŸÂ¼F¢üÉ‘ŽF:Õiü9¥Nþm²µ¼™ûöí´×}¢Ôöà9Áªâ¬[ŸÝãÔÓ§¹,z…e Š]¾©ŠP™#héI¹Oå[r¢E©aã •Öô©bEÆHÇãV•É‘4 )㸩cŒ¡$ãð¨ãVàìÏ¿¥9–`pFßrp+}LGª¡[µ.Ò8+Nié ã²±pÙ©£µ•—sª†+¤ò+tšØ‡;À9ž¢¤)ɨ󞻩ÊaµœÇV ‚DLøÖ³XÄÜ©ÁíJmш*¨á¹Y.ºhÎXÒ1¬Àÿ³O‘C|1ØÕè2})Ü“€˜Ï­W'asÂÉ€]UsÜŽ•2¤r(;Æ@Á›0uY³¥I,@'§ÒœV¶&R$†×z‘æ°¨ƒR¥¤å.Gr´[DõÎG~Õ&9+‘è+~Dg)4É!ª)˵œžz‰$hÔé$0œzÖŠJÆd®dpAFeu€ü*@äÓ’aÃ~¦Ÿ0–ŠÄˆ H¹n¢ŸLŒÌÒ3nõ<¥F²ÆcýjQˆÆ ÍPÉmÕ ‹w`Í5b;Ú5`@$8¨wLK›]NU”ò§ÔTºiöü1;‰ûÇ'sšÒ-IÙ“%erhÀE°ëÖˆ§s)ØÜtéCÊqè3ÅD8­5D—¢¹” ¹Æjå¤ó9ÏœÙ?Å“T!8ÇSV¬Ï÷Aû¹Á­éÉÞÇ<¢™©låchÕʆR žÞýýê&]Ò¶àQn²ÆÁÌDÁ?Z’Oõ¦ºÛn& %"´è3–9äÿŸJ¦èeemÊzb¯;l9ÆsU”eØñ\í&iM•ü…ì5Ä#ÞãbLƒ“»§ɨ9;ˆÓšÎQ¹ªvBù[Wp${Sã,:7çH^IFݸ÷§2+ b™!»æ#Ž”ä¸8'±éP8b@CŠ|Q°»ã¥°‹ýÕ9ìjÌ2‚s¶£’<ˆ¼Ôª¾Tch ç’{׌•™é7}%ÄØùsÓ­p’'¡ïPüÛ‰jHãŒK°åV" åÜä’A늳ç«F8É Œä{Ôt¢ÜJz’\\¦ì…È&o.å;Ž8àõ$t4çVv¶1è)&Ó¹JÖ±{rBŸ0<ö¦=Ò žj›;±Îê@ÌIñŠ·6ÌùWRôW rÙÎ}i~ÐøÂƒîOj†Ø:ŒäŽ*À;†H\]ÕÄÒ[W8ÜW§½)yé?Œ} Oå«ázVœ¨È|=þ‚œ@=E,htœñ2ão?…oû¤ó< ×µK(ûç¥W˜@ ¡©DãfˆE§vKnJÄm׃ÇjXPHø tïJbcü#ó©# Œg5v»ñ¶ÖéW-ñЬ(aÈ«VñVf2Ü·n|²üdç§Z‘ÛçvÇCš†ã8žõ3IÉãh®˜»ÆÇ4´dsFÜu=j%RòÖ=ÅŸ,ºsô¦!—i‘€6“ŒƒžØü;ÖksTíWrÒ³&%~eÀ¼S…¹îIü*H£•Ì’p8$óÀéNŠÖîs‘c<0)(^Ãrå"6ꤹ§-„„ì ŒVµ¶…$0«² Äs“ÍJš:ã{•Æ{“ÓÒ·ŽVÔÃÛ$ÌTÒÜœ1ã¶XXXÆ ÜO#­ØtÛe9…O=NjÄZ]´‡åflOÈ@úsÉ?†+e†±›Äwg‘Å1 +°ã“Nk,`°êHëDмRäÈÈ÷“b)ÎFsŒŠù˜ÞögºÜm¡¶ù‡ÉÐôÆsK"©pqC ¿6ñœö¤.‚}+&îY@Ô¥1*C(¯zl“« "äcJds²Ÿ›?JÏu'ð¤Y,@Ã>O|Öv»4ÐŽ)Ü‘ž½êÔC¿µF«±&ïV aùè8Q‹&vC¡ÎìÐu« ‚Fh†$ß´ìL J~TéÍtÂ.Ç4ÄŽ6c’¢¥òX­2;Žp[ò5'šNkxò­ÉjL‘JFÁ‹Süô#å[í éúÒ¬êÃ<~u§2,‰#'Šž Œ‚xƒžEJŒŒ`ãÔUGRINÀqRmÖ6㳊SžÕ·*{™ëÔ‘[`ÆÑùÔêÛºU=åõö©må 0NsZEìŒËp0Lf–áUЀÝ,r?:d(=ªy¢^Wœ² Ì;ÿ‘ʵ_Œ´Ý:æÆ"xƒ—QŸ1Cç¾zzÓÚòÞ"$ ¾2Ý—?€TrF„îtŸSP½±Œž@$U)N1JÃ÷[»5bÔm&@̃LŒ}8§ÛêPå<ôL=‡8¬”óÑÃ#mýiÂ9cÎ.Ìr~QV«´¶#Ù£rA%Ã7Ê;SÇq»‚ãç>•ÏBó+q7vnIЮŒõÎq[B½÷1•5Ðèí£·’•b «`ùÆ}xéž?µh‘²™r3ÔrzsJÉÒ/u KQ¶Òô˾¹ž@¶Öá #žŠ\žØï[º^¨ÜËqi©XÉeyi,‘\[ά¬’+mÚÀsà #98‘×NpæÜæœ%©ÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?øžÝìõèüÆ€FãeVU ‘ÓŒõÏ<{×ûKO¡ø᤾2¿Ömã‚ÀD4­%¡òþß~¤¶&WÃIàì ¶X¨ßx"Õ¬Œw°:N -媃p½0ØÈàr3žµóÏü8êx/öPI ÙiJ÷hT‡óŒ»a‚A‚8ÇÊFAÍy´)Æu’GË`ã:˜¨½‘ç_±W¯ |`ø“ªëß 7ºngçÏÎSí— 2á€`’¤—©é__é¾ðï‚4X|?á--êy’Èß¶BÒ3ìäËp½—ퟗà:üÇÇÚç„n Sgs¥¹$e]ªñí‚p|ÂþþÏ¡ûwá톭ôÛÿíCˬ[¤2È ×*U²K€cc)ÈÁeÚÕÓ‰mÎÌìÆÊrÄ{6ìž?j;}C_ðDŸ ´ÿY×õ­³èš6•s’[tÌ€dǵ_'Iç?.GÈW€¾ ÛüLµøu—¦øj‘ÚÇi2´3ÁrX¡R ?¥~ªÉâý>ÏÅ¿…´‹/í‰ãŠÚîòÓNU»xqūɖeBJœð 9çÆ¼yðÂÿ?jûNj/·±Ó4xíVâ i?åöЪ:SòªÕ9ÎAè2ÔaëJ”Ö‡VÑ£K•;½Î7ư–ƒã‹+zçÅ©¦øž T¼¾¶½åÄkµät.²ƒ&™m$‚_bÒ<¦èvš ù Ò"ŠóUû`a4è,˜îV%œ.Üň©¬~Ñ¿³ý¥´÷2übðéŽ8]Ú ;øç|ãu ,Üôç8èy¯0¸ñ§Á?ÚÇÇpxÏâ'Ĺt˜áK{Í/B¶û6œ¤±ÿIß'w™:èsËWªí'eè”—½²:_Qø{¢jßðŽê~>Ñ ºº$ö­«`Ç!TghÉg€'' “a sPŸBÔ4ˆà}X¼ð€­,Ö«‰} b!º–+ž3Ö¨êVwPý±îÃùrFrÁ¶õ8äwì2^nJž†W³€ÛEìtäV¤‘Xå$Áp˽q“ÓšH.#ºtµ”˜ËHÑØ÷>lœüÙ9öéFŸh×ÑÃa·–f›sG»sHÜG#-ødþµ½6÷B†ym­$H¤•£v–61–Úr0ÙãØuÈ5ÕƒÃb3\pô÷“·ßÜÆröܧ²F—ö–Ÿ¤¼Í~©$ó²³)àp9 àc€3œ×1w­A©"ÊúC…*—ŒvÆ =ÎõRTŽyKËc¹·ù²XînO<žO¿4†‚n«ŸA_­åþà)Å}n£›ì´_yóóÉËJQ·®£Áº¹`òà³u1ƒÓ¹ÿ?–/>ƒ–RQiWÈ2¬ ˆñà Ðäc'ÐãÖ³£ºp>µvëT¿ž×Ë»¿&(Ô³nÇ’X÷üzW±›ðÎ"¾ž/¨¨ÓÚV½ÚõÝú6—äsá³*’©YsK¡(ÖàÛ-±Óc^cu'{8@ žq·Ž¹Æ*¤×:…Ø1ÉxÀy›ËOÓ?Ÿ=koør ¼wžjã;áú†«Éñ/B¶]þLÛH'-´^Mm‚áNÀE9SS’¶²×çm¿J™Žm]Ú-¥Ùht<¹ÜìÙ³õÿùÔR2GîéëÔ¿#ó¯7ñljmïeƒK‚$—pÜäcïuv⸟übÕ/fIªÜ#yE6Ç&Ŧ@žzׯS4Àá#Ë:ÒË1˜‰^zǪ|Jð~•hõ´8ò­Í'Žøà} šçµ/Œúii#Ñlœœ+LàO9uǧâ—¾- $2…]Ä…§¸ç¥Amâe߉í#ž•ãÔÏå)Z-$zÔò:j7wg¦k?õ½ZH¼í^HDrâÕŠ¾ÜñŽæº |a´´T³½‘|­Ác.Ì_ŽIÎIõé^}­¶ô1þ¯¯Ÿ¥CkâIá¹I)~ï5Ëò¥:—lë–OJtíkYh&ÓüCkö›L©ï‘¸tíž:÷ÅhC_鴮͒Ì{ÿú±\y¦"3¦£êuåxyÂmÎ'96§3ɲ-Çêj–«}²2%æ:ÒßË«HN ôÅ`O¨\D²±û¤’á_‰Ä8«3ë(ÑRwGéÃß¾«;i„íÞBRŒÜ7Èôä¯^ÞõÈ|{ý›<1ñßÀ¦j>%‡N¿Žá.,u)öiq³ £ò¤ð0AëÐ ÔŽêO ګǸ2;«)Q¹I+‚2H8'wÔ6 ñ3\B_Éa"­²h!±’§æÝÊœ u

jü¶]Q¬¡W›¶Ìã¿gÿÙÁt«è´ÝFMRöê4Ú¬É~jí'ÊE'ti»“Ô’£ž:íOÑÙ_†Ñb†5)rqóÀ ‘…8AœkWÂ77zð¼ŸH¾¶·’É|á „FÒv²ª‘É=¹4‘‰5ËŸ°Ú2É$ŒÅm ÁG¨ã ä ÀÉÍ9Væ|ÌÕÎUäŸsÔgÖtm2yüâ1¦êH‘Û]" ÕrY”·$uÇÞzç¥x·Ä¿_´¿Å9&ÒÓâUŽŸ§äIôûÖ‘\³32E*¹o• l’î$‚kè[Hµ»ˆ&ÔíÕ–,;ÃjÛcpA r ‚ãwÍgÛM•áhîLÃ\#±9ã§xÆNZ…ZڣЕ7†´“lgújŸ\Í)R¼¥XïUs´¡3Ôõ‡¯|ýKNžì4Ê¿4–E1ª€pÜž§޵•IÕ­ÔÎUî½ö_Ó|Su§j‚An ‹dp )Q–œ|¤ŽxÃg寧ˆZóû*ZúÙ•. Žuç'žÆya¸aŒó“ámÊhµñÓã0FnÝ3#<¡ƒ2ã$ä² ã‰_õaNî½¢èz q«k¢ 4¶Œ(3)Œ.ÜîeE@GAœ¥(Ô¥ª¿S« èWƒ|¶]:Ô'†K¹~ÈÎÈdÛæDä) œñÛœcú`Y‰ÎwZÈêg’å°6·Êfää“Î8ñ×nêm-­?´~ÈeH6ÆÑÛÄ òp0Fåeäžzdç˜×§¼}¦æC8^ùãüþíSuÓ°LtàƒÖ¸h|_ª+1Whìœb®'v¨ ç¹ÅzñÌðò§Ë&yïV3ºDºÜÄ»^2=}aÍ ƒ[Ëâh5UÉߨn¸ªwÚ|qe‘‘\5¡žôÑÕJR†’Gè.£cs¨Åo`Ó¹I%½¤×§Ù™Š¦N@à·\’Îuü-m$V·2N^WŠÔ´éoÄŠØÀûÇæÎ@N'94ÿø@|C5óBû©m’X£.$JŽÀå2\Š©=yÚ5­*Y4Í&Ø\ÜZ¹kÁm$²DÀYG™$eTà§3ùŠ’©ð´y‘£'-KZv«¡µÜ|![Îóâ†I e$ÆålsŸ—«d dæ¶,/5û¤Úv£æÝ½Ã¢•¢ˆ(V|çîÆ™ÆOžë-|—òë—zlV¿i™h/#Ú 6C.@'úÉ烩O·—XžXÝÖ ŠGÖFù”Ÿ™X€BýìNy ìÛØÛ‘ÆÑkB¯‰´Ýk@º"öç|’ß’7Ÿiî qƒÇ'/ÃdrEVƒì³’–%6-•C–É HëËr?úõ»q&³¯Ç~ï;ÏoæÎmW%²V!Éà1ïò“€AÅM¸ßcjÆÂ~\œñîj•5{4e_Ú^É–mdVÖ?2)rË!ÛóǸϯ¹æ¤[{¿êíaa2 ¡{‰KüE‚\èO p ñÂñulì앯ouû1·1ÁûÐÑÌÀ7ʪ­”;HÁ<ã9*#ÄòÝ9[Jµo,…*誀¶Þär‹ôã¸ÍS‚¼)»-ÌÍKÅm×öNŸvégÃy>i 31êò6sŸNq€89>3ñ¬~"Ò´Yõ™m´Ûõ’x 8yËcïzñÇÊsŽ¥ÖaãÕRâöìeA Æzdgn•sÆÑ›Í>4Ï ;CxMQ¹.ªã…àØnOòìËU*ØØS¨ì¥£ù«_^Û›J¬èÐ|«TGñ ß^éÚÕ¥ÓÉsq§EpÖ­tê±£‚Uü¾8$ ÏÜêqÇâÏéþµógij6DVèß3õõè21šÑ¾Ô`‚Ñõ+€ÚÞ•@PR5:ž¿RsÞ¼{Å~'›T½“S¼VÏ÷—v|µÇ =‡ÿ_©5ûVM€YS NÞÒZ·e}z|˜ÄOûWæþ¥ŠÞ ñV«âƒ6·sæ À­º1¦Ù¬‹a!}í!>ÃøEQÔõ"¬dÝŒN:“éXšœ×C9Æx\×.#âï{³Ù¡†\¶JÈÞ½ñe Jp: Õƒªx’GbªÛ}³Y÷î™çÔÖ}Ä»É.ÜýkÇÄcfôLôháaY%Î¥tÎÄ8à `Š­-ÃÊ‚2ÌB“µX’zãò¨ÚdRMB×& òåS]OB0$u‚Eð¼òùè>”gy†F´¸Y4,Ä/ c¸ÿ#Þ 9=XÒÁ‰ FF85Ï)Æ] V…‹ k›•Ah’\»8? úŽ• ±´É R­Œ-'=Ž)J'“¾&ÜTüÌ‹?áúÔÚñ²è1(¤”<'æ`}Ôæ‘7u?‡56hVEPEPFè(¢€ Ÿ29R;ƒR¶¥zјÏLw¨|ÏT"›#àäzSNQÙŽÚŸ­×7ö¼¿ñ}Ö¡p²êv~EšK$~d8w‘Dh€€Ä±Áo˜6Þq•>câÛëËÿ‹¨dfžyÆ×…ËåA –;ÌI9禨Ïã FH^æÞ~ê8™G›–€§Ç ägÒ¯x#ìcP¿Õu½5§Ž4c ­ÃÜT(9Á\œg9ZøhQp¨ÚêxžÕ™rør÷W·ûEçˆ-Ûp3ÜEòBHÉaƒ‘p0â0;švŸ FX.'š4rimß°™%ÁÈþ“:}Ð=ê;mWKòlïÚÆ83µúf/*xxÒ”®â’¿{nÎLó¹ZÜÎöíä2öÿÎ<±ã®+6êà ’G֩ͪÅÎeµR¼ÕbD@‘ëšùºØ¥¹ô4è2[›õÉMÕUîYÎG·'$äÒ×™*Ó‘Ö£“’i ‡éž=©ÔÝÌz­gq‰™Üzg·Zvìœi†$‘‘ž0jx­o&D–;ypÁrŸÊšMì6¬1m݆@ž*Í¥Ûiѱ£†2? þU`Å@Șàg5^Kˆ!ýܱç5º„iêŒùù´Z‘5´ÂÛÊ!„µy _Ú¬Ë$r2IB¹Xr=ªÑ[€]9˜+© ªpH=Ž:ÒÝßAuhZî'7¾`ýòã¸çw|ûÖrеÍSìWBÀ=(Œ“’F(BŒŽôêÌ’}%,'¿ŽB6(અ/Ìx'¶qŸjÛÖü=m£èm˜‹[Çy¶Kèâ3`€ªIä`g¨îkœ]çB:ÕëcieSÜÇwjñ«ºnl!aÊž„Б]¥^V–½{(ÊêIíС$Q“Óž–³ÈÈD ‡8S´àÿkjSøVÚ9ËH™.Ft¯99ãnqŽƒ'ëL¶ñ–º×ê_fFRCAAR1Œ(Ààv•:q¥/¸w“WŠûÌëÛ'²¸6îÀ‘ß=h“̹\7L•,oöâ×ÅÙ²J °CçWÿµ´ëˆãµŠ;‚ˆÜf5\Ã#8§p”Þ…)N1M+Ÿwx[M×ôÙF«q)ò-J3n ´*îÁÆv›¯Ë]>—£ý¢æúòÚîítÖŽ9-šÎ%`¿2m.‹Œ‚äAëŒéo,£°‚våi$VžÞ)ˆb.î¸äŽG¡â¥ÐâÕ,u)íôÛ»ˆçÚÒa݉zùtâ¾"2ÓCç¥{jt³êk}¬º6Ž E—,¡„ŠX¶we†CWƒ…ã§Ñá»™<1­ØK6™³2Ç4ä[ÿ¬ËŽ£X²x&§ðƯ¬ZÜé±ÜÄ&Åeœ©L Ù<`¡é4†ž$Õ®ÿ´®>Ó 2C=©E21T!Bøs’2§“‚x]Æ©I¹s3ZnMY#U¹ÕüFn'oìçwŽÎ[•tð¹Úb'zýæla€ÜzñQišEôn„=Íú|Ò ¤LÄdžœ€€FÞêž žËDuÝ$-i1)%æÔ™Tª«£[‚¥ `/B+†»¸ŽÓD¸]ŸYËÇp±€®äìmÁÙr#æë‘ÎH*|ÎWGT\#ñoïÒ9BêZ”pÍ Ä¢åŸŸ0§†Ð nR9ÆH$ãu-rú"ºU® ÓB±{´—å™X’~Pqèx ’8w'OøZûND}4yK¾0Y¥ïvÏSž1€Þ™¬MJô+›tp3#{žõúo ðu/gOŒ{ÚJ?Š¿ù7˜f²¼¨Òù¿ò'º½RLò¾÷€Ç“ëŒõ5ËxóÅØérl™YH‹ 6?JѺº_,±nðàï^eâ?µÖ¥5ÝÓ`d¤iœü€žŸ^¿•}ö.´hÒ励ç`ðî­[½lp$ÔžÜärÝrÄä“ÜŸs\v§©I#F''±®ïÅzm®©n÷6`,€P6x¯:¸ŽE¢—†Sƒ_žf®¥9o¡÷Yz„£¶£üÜûfž (¯©ÞR.HÉ4¤dbŽ€Ø*ž¦¯XèÒjrÅ¥éñ¼³Èz“ŸA­gÙ$ý+Áž#Ô|/=Äönî 14¥hÔžJç€Ý³Û'ðßršSÛ©Ô&䇆n4yÚÏP„¤ªHd<jºÏ{mfÚjàÄîœü¤w™éZ•Ô×—-s=Ù‘¤Ë3HÅ‹ù'’j•ÔÉFEûgµtÔP‹|š/ÐÊ›Š¾¬t’o–¹^98­fO#Ï&ç î*I/$”mŽy¨â@ílAk–¤Ôž†ÐЉjÊõa\¤.z†âe™Þ1g~wŽ¿þªmÔ–×2ùÖöæ @Þ7änöà`{:DT\í¬ùäÕ‹²‹ºÛpçHLŒç‘Ne$ä6>”)eˆÛ©]¥ƒ Îq޽ •°+Ç#• VBÛÇbiÅsŽzw¦mtÉÇZvì<33vÉ&‡y>ãHH=‰àTaG`IíÚ¥‚4ìÞË·@{sM&Ø\O˜J·`F‰ÎÀW H·´ÿŠÐ¥ü×Úç„crb öWþS7²o"\ÛƒËg7ÕüVÛ*Ú[Dq3F<æ8Û±¤ä²qœã±Ë]xîúëW†í@Án$ùÂ0Qè3Ž£ñþUíåü#•RÃòc)ûé½Tšûÿ ÏŒ©‹ÅUè?vݵ¹î?M¼N¶:ZK0c<ðåœòv«c`-Óæ8dŠï-¾=Ï Ú}üÚõÄ6e†åŠñ–C…åŽ0Á>¥‡1àZF·§ê6Ë-•üRÇÐ6Xøšúk[­Nål结t+¼Î«"Ÿß7nÉÚH@¹ú÷…eÐ|Q&™©N÷aíüÈü¤ó\Ĭ¤…V;(0Î/(…å·'‚VFÃ#/èkÙ¼ ×ü§ÚøËF[{Ë”h­/m˜5ĬÒJè®Å€ c9Ší;y Å|;ý…V(Êô离§þG³–c>¼šŸÄ¾ãÆ5»wÒonà æ\ØËO$NÕÏdË+I ù‹sïòkÒ¾*x8xvæöÕ¸ßn1*«58ù€(¸ÀdÎ@BkÍgF†I!#£c¿PÈsyžQJ´wJÍv’²g‡ŠÃK Šœ%¾ëÑŒšÝeF‹0#¥xßÅ-(øI[zÉÖh-ÚSæ:ŽƒhOø×¯Í#2$à¿´Í”Öþ8µ¹o».ž¡} VlÿèB±â ŽŽž*îöô¹êdqö¸ÎFì­ù¾-¸‘DžR©<~µGX²þ×ݨ[*‰:º(àý+*Òáâlx#5 —/nDñž:õþ•ðþÛÛÆÕ6>»Ù*S¼t3;Š•ÁijKöµ–Rð!Rz€8ÍG\,ž§BÕ\0AEš@ø¯$°ç´Äu –8§|§øóH‘†Ï?ZÎÅh9T`¨àwÑÆrh)ž3HçgÝgÚ˜‡Ò*íÉÎsM`œR³ôØsšBÌÜ(¤$€9Î:Ò*rIëŠx>n7íÔ A´7*@ô-É«ðI3ˆ,ÙX3ÚAÀ>œõªû¶ÈÜúã¥Oiy$‚Q_rǧ§5pqºR½´7tm-’Ò6žÜ ÚÞYVÏç<þ¥ilræG-Ï™Ó*–w"m®äæ0·¶zþªf•PÊ»–î‚:ç¾kÞÃÆªÝ.³›–§©OâG»Y#f\œí¦1ÜçÞ°u |ÆmªGדY–ú€€ƒ¿4³jfoºp3_GøÎéf¼˜ èW÷ñc’8ð;Ƽ€9|—Ç'šê> j+gãVµžà ¸´)“‚ͽH‘éúV˜ ò§‰Š¾C,eÕÃ7mV§³×»ü ñ~•âo ZíŠÚÖòÊÔŒ"V@›64D2”áQ²pÅÙù9ðhÉ#š×ð5‡~"‹\Òµ‹høKÕ¶Æf‹r’„ä dŒaZqNOý³•ºpøã¬~]>g‹—bþ©‰R Ñÿ^G¹üFøkaª|+›Ä×¶› ‹QžÃLœÉ '*ó&¢º€¹9*«ó]ÁM|Ÿâ­Yü?ey¨I¥Itb“kÅ€ÈsÉ=p9¯¢-|O?Œy«êÐÅ£X–—Sx®[ýÎöR ³n'mÉ'Œd_>xÏÆöÚ_öŸŠ!²fŽ]@4+ö‘ìwäŽ2ÇôÇ\ô¯ˆàyâp¸\]9¾XÆÏU{K[þJç¿›ªujR¨•ÛÓÕhgÊ÷?ÙM«\éWv(Ÿ.ò<}ì7tä=pp8¯ý¤¯îûMŠ[9RHƒùn@eum§‚·Ez'ˆÌ7€¥NòIÝŽƒßŽÞAñFÛÅúÞ±/Ž5½-’ÚêFó"›ˆÏo~œ¥z¹žaˆ­„ö2´Ó³æŽÊÍno“á]âŸEE±ÞÚœŠwdÓè .ŠÁºR aœúñ@:@‰•[Žô¥ŽüÿJ3ž­ÎzÐ4 Óô§FʹËÆŒ±ØOœQÑWxÈ9gñ  £‰º61‘œÿõªkXcˆ°–™I|-¿çúT±¸—b‚Ãhc“õíZ:LÆå3ø,¹m½†1“ùúWE$¹‘2ºLÔ³/,`Áz®Šw~ý;Œûg½miÖæãdöÓ,‘z…ÉÛíÒ³4û9áÚÖìÆAŠBÃŽqÒ·l"ŸKÓ—Q—d¤©FÁäoCŒõýkÝÃSmÝìy5¤´]X–Pßê7±éÚuœ³Ë1ÄqÅË^‰iði°­õ与i# ÑJÃrw`sÛ'Õè¾ð—†ü9Ý G‚„3˰¤óŸZÑ{dhöPÆÝ¼WØárˆSMÕwoð>O›Ê¤’¤¬×¼5ªøl´ÈI•õ8Ígé··Vº¬†œO£©5ê>>ðtÚèµ°[à i8šp ÌŠÈü<÷ÊßøSCUžM+NYR(òKˆí““Û¨â¼úø)·¹¢=>*J7–ý{—áŸ6«¥Eu¨À‘Êë™-¸cÉÁéùþVÃUѧ™>Ýw0PÊeh]»±“Šâ¼ðûÆœñØÃ"Fò6Øâ‰vÁ8ÀϤ×[§üºtS«x–Î)rU¡‘ÎGL)ô'žEk[ˆ2üîëVJV×[¿š[SÀûI·¡q¼qya¦Þø{@ºg´½f”P0J]ºŒlÇ$wçÏ~%ÉǼûicž6»ˆy¨CƒØqŠîu¿„ÚÄ%Ú¶—,ð=¨QÓ2±*2p?‡ œð9®r×À‘[xb÷Â+ Ôx÷=®£nÇaÀùw)ù¹çÑÆeXÕW”[šmÙÙ¹|÷4§Jxw“¿º×¥SѾü/ñ§ìM¦üWøYâ­3Y¼ðêO⯠ø’×mäw³Ì±1XC{#e­»u±V”'çwE,þÓ]ZqkshÍ•¼e`µ~]ŠO)Ê‘œt¸&dž|wñGৈ4 w±ƒÄÚSéZ¡šÉ]n-¼Ä“÷m"­º5e‘pñ§üGÕ´ûè/¡ÓlËFù¸_(…ºSÕdÁÉSŽ™ë‚ ðpó¥EJÓßkwµ×Éìz”°ø˜6á.mnõùþ'™øÇáý¥–…o<–ó0K}ùwvÉQqÉqלs®›w£j—ZEú¸µ¡ðº’üëésuáŸxEdŽÎ]#W´C/ÙwG%¾¥!Vl²M–A"±ó2UO’|Cø+â&îM^m0Ä—a§…_!¤BW. ‘–\¼9&§—5iE;>ÌöðY‚Ÿ¹[I~v<úŠ–çO½µ‘¢–VV †9üjÄ’»pG\×(Ê3ÔZ­ œ ÑEH ²;u¤`ªæ•f}éH¨€ÐBJœ‘×Þ‡lqŽ´¤ÔAõÐÑE&î3ÇçEìÐ@<)Œ¸9'¾hœŒÿ:a”ø#Y~ñ IÉÇNÔâµÐw,‹›y x®-”’G–P'ç'µiÚÜÚyšå Ø˜ˆË;ú£®=k3Mqm©Ç=Ü>tQñ´¦AkgNŸÍ[)Lq©Ù–ÃGŒç22k²Šm^ÿ# –ØèôîSɹ¶`Í™U‰8È}?ZйÕî„wƒRT H!‰6çCÐ`žpAsVBÍÀ -ðýj'Ë׸Çõ5µgaÅ‹¨XÊ$LÁ<ÖÜ›rxã厣vÅ{tjÎPQ_™æNRmŸQG¥Þ[<–ÑéÒ£Fs,f6 ç$vÏ&ŸqeqkiÝÎÄ2Ëåù%³"63ó(ÉŒã®p}*Å÷ˆõ+Ëm¡hb²D«€?Ýîr}{V%Î¥e-76Ï&$$G,€BêUBĆÉ$ÑNCO‘.?ͱˆÓÃÒ†®ÉjÛü•†YE|s2~$‹6­Å»Ãräœ2@êØŠ•aêó¦ø¥áï #ÙÆé=Ì®Ì ¿É²XÜvÏ99ÇCkãŸÄë‹]*D¹¾‰¯gU¤cˆ#9ù€t p;nç;‰>ö¹Žæ™ŒŽÌX³I=O½}.?7®¡IZv\Öèí­_.Ë)Ê—4þéæ}áÿÚOT„ýu ;JÓg”yÉ1Ô9ó Ë íôìkV?‹ÿžR|IãB‚)Z7“N†]ü+… C Œ£§5󞟣]jQŠ"ùmª›rsþMjhþ’âåßQuŒD@ [k?Ó×?Í…yxXN?eB 0’³Ó{ÛV÷¹®'…¨ï)4ÖÖv·¡íÖ´ÜZ&´öš¹ Κ—n¶ÉsjÙ1ôÞ¹\ðü÷8EzO„þ&xGÆ1[ë:äpÅp¼Å!·ÌŽ’RÛ“†ÀÈû `sŸšm| §oMtêK”ŽÚ%ÜñëÓ’>µÑøoÃÞ'ð½×Ût—½¶¶Þ7,²VÁÏ̽ùæ”ø_‰’r§Ëþoø=WJ0÷%ªï©ôljGÃÿü/›Àú—ÃÝ2C5¼Òiz¾Ÿj±ÝÛ]*üÙJ¬±±ùX;x`ÊAçOü,Ô<,Ïkªx~ñ1µo &Èb•u8ÀëîwÞø‹¯éVq ­cO4ªˆ.$Xž2ß.ò†IÇŒdƒÙiß´'Áw‰<=âÿˆºß™ ›ˆ„i·sÉ%‰!F8åˆÇ\W…V¦3‡+{ÑU öW¼’Ýw·¦×ØxE:®ÑMy¤ì|èoõ»K…ÛoomHûLhÊçÉv$¶1´~÷¯¼I«x¼ÃöÁs¨^Áo¼L±ƒº‚ Œ‘Ó$ŒœóÓíükÂßÛÜxþ$h¿ñ0¾y^Ñ®¢I‘|²WdY m@3Î8ùq~×uÝ/ZÔ|3ð¯Ä"G’CospºkJ¤V:ñÁO#PA"¾£.Ìð¸êW¤Ÿ2é-5òoO/к”ê^ó¼ìsú/ƒü®ë“hßyžÞîÓoÚ x÷ ®õÆi:×°xÄøYÐ,´wѦ²ÕVÌDÏ ÿt ÂÌIbF:ÞSâ%ü/®\èÓ]E?Ùåd@ÙI’7)î+ÅÇ`ÖJÒM~^G·†Ä}få³ìU¢ ûCœþ«pàe£?•p)&urHš‘›hÍDn°==)<ÒÞîH§{‡+GœqÓõ]£¦äÿ ÊžÁÂ䩎 h$B@êi€&Xx'h}ÃúÔjCg¥7`8‡ZXÇ#ž£ò£2’ ~T®¾gÝlb‘MXBK1,ÄÜŠ”XÜ}íÊÀs…nHõ¨°¤rä}M;Ï•™I•¸É㊨¸§¨¯Ø¹kt`¼ižI#î«‚;ƒžµ~ËOŠýÕì®èÊïx”¡îOOOZŠÚhîó¨“|¸ãøG®@­ ?J´¶Ä±—h±¸Î}k¾'&º£–­NUÙš:JCm(„Ÿ” +»¯¯Ö·í¡òb¸Šú䲈Р#,Œä`g'#¿RkÖ Óà‚Ì>û¾XŽœŸ­nDLðµ½ÉËPCàªí-ÀSžÇ'©Í{t#¥6£÷®ÙõF¡¥Ý$ªóXa·8 ÉmŒ vÆ+ʼny¥ø.Kå·ÙªNw†HQ]›7‚ƒŒ¬ëŠÔÖ5¿çÖ.ô¶Y’A2™yù‚)à¶{@çŒ×ûJëšÇöD~H`‡Lìצ?+í>dQ ´•]¨¡×hû¦C¸ùŒÍù× áV#3Œå´=ï»þ 5ËÚÅ(ý­=4Üù£Çzľ"ñMþ£æÈЉ™-•¥ÞÀÁéÎ;Jw‚ü#ªø§QööŒÁH/Ž)u[˜<=xUàŠI o‘g F‡¿ÐäzƒM¶oxîHíôèJE?½‚ßbƼrvŒà`uÏsë_h’x¯y9J÷²ëóÿ€{Úý](µº³½þÊð߃#’ÓQñ5­¤«3ƒt¹gÈÊÆ:äcÁÈÏrxçL±¿k¤ðÜ×Î’b5»“Ëh=ÔsÓ¶x«Q~Ïþ9Ô.^xoã`ªd{«Ž¦IÈɯ\Šé|3û5ëý»_ŽxÏ.#€°9ÉëÇl`ƒÍz¥›b¤•:\‰]N5S,ëԫÌÙÆk¿¼mÚ[éfËODut}·pseºgØúV6¡«|AÕïZ]CXÔ$¸-æcy1ö+Ù®ÿfÝ:HZíoîÊž$Þ(ì>é9Î9íŠÜø{ðÏBðõð±ºi;®òI޼“š¸d9•zÉV›K×üŒ¥œeô©Þ”S~‡‡Gð“âŠWðÎ¥u$‘†F¸ÜY » ZØÓ~júÔzwˆ<9yk9Qû‡F‰8Á<äJúgCÕåðLñÞi¢'‹K}-ºlÀfшÂö<“Ò¹íÇ÷×z•á_é°Á¨X x­[L¶GK)”—V'«È&vñSо¹ § ï}~jÆK;©ˆ¤í£òGžx{àý¤RŽnŠ ËæK¸.Ï,0:ÃuáøöÞùl,ü*!· ZÜèCt‡|ß/P^z÷øzŽ•¨ÓÞÑšCƒò ¨9$sè®+Sø©ñ'Âò-Ÿ‡üo¨ÙÁ鸆Þv¯˜só¹Ç`zdã9ô1ÎXqXxÅ/´š½ÑËMUÆI¹ÍŸaü)[ßx^ËKñ>“}5Ζäx™%»¶|àΧyù“<od€)¾8—ÆÚi™u í¶wª"ͧâuêÊѶq”Ë“¸ŒÕñÿ†¾/üU½×ôö³øâ¹IÔÌójó(üoñf·âøuk]~òØé °i—²•Ž5'89È‚@JÅ|' ©ˆÅ:ñ’Œ$ú}:-? ŽÕA¦¢Ùìþ9ø#áOß½®§a¥.¥y*Dömy‹‹hÌo!Þ¬»†ÖVˆî«Ý€Á«Ã|eû)Ãg¨^jvÚ¤²‡ ,6!vY† ##ƒìk Qý¥7çO²0i£VÃÜŽO7íDÍ!pHR~A€ª¸*ÿ^“_Öòiëih’Ç;ÙÈˆ× DrÙ°rØÏÍ’Gç^gW*»£ɾ®ûvÑ¥ÿäJÊœ­ÓCÉô€¾Ð5¨ÝCý¢æ0Í%ݺ;üĀ䪎?ˆóÆÌ^Ðb’K8Òd*3 „^pN0Lçt¯Cð×€-ÿ^8ÍrrøŸK7²CmÐ’7a—L:A$ç“Ço¨«^4ó¼ç™Â,^F%˜©bçŒ($ñØk—¹6ú{›Ql€Uvç »q5æ§dìo…¡õ-M­ÞÝ¢_à †8ÎØ’eËí<€}¸ª7~/K7k„Š9î<ï•y·$zžzt½Gâ[½>ÇDºÝ)ûBØ´¨î—úçŠó훇s(bY¹$“Ô÷¯Žxy(§v{\,jÇšÚv§âý5à7·r²¾\ºnRÄçž=øéœâ¸ëÉnqÛ“òóåºßƒ×Bg¼‘¤í|Š ãÓðÅxYŽ5í(­Vï[ëªÝk§ùž*)ÂNý—èy¡3À)T õ ƒ9 ÉnÈåóÁV®¯ÄVK¤Ëu h\?$/Qëð®TÝV¾cAП)ïÑ­±½†îŒQ[?ÅšqPÝEAì)kÆÈÁ£8 Õû5:Ç!ÚFJÕJ¬é䈧]>ržf7`ã¡ÍmFQU>ÄÍ7wsvÖHÜ_xYè¥AœtÆìÿ쵨—6–‘+c,N3(¯cÓŸ•fÛøêÒæX¤ÔtH Ñ(C2»¹êØàš×m[Á÷ÄLb¸2’L2® và©ã5îÑöM^G™QN2´¢^Ñu hÁ„”v–¾Y#$EÇ~H-Qø–YT¹@ê¥Ê¤F<0UÏO_þ¸¨k‘U-ÜÛ—ÎNWà*ö™¢4Ï$¯l)gd_(ªÇôü«±{J«•Ï’>ó>—Ñuû+›f p'¶ y‚íÁÎN>ñ-ƒõ«ƒÄŸe»ŠÛìk/z®ÉÛ$$#*®ìaHÈÝÆÌqò~‰âŸ‰ž E:V¸×0« ÆÌw•ÃÏê~;] Ä3 kµûŠùG-žsÏÔ\$áìŵnF´Õòß§õsÊ«†ÆàâêBJq]·±î·­ÚÛ²è÷ב+02ÉktÑ™T 8Æ' d.Bžª1£ð¯ÅñøQ“]Šõ´è¤Ó5xá´„I i-XF_{HL‚só38•Šßïtï…×¾Ò<£^^¨’ãN¾ºŠ_µG \ G€o˜m!ÃñœÎüý¡<1㉥‡Tð½¨ÔíbQ¨éº„9Ρ)ó.*8%L™ ×ç9ž]ŒÊñŽ…uf¾æº5äoMÔÅRUbïúÿÅŠüDÒm4Þâɒݯ|?  6Š8Ú(ãŽ6ˆHWË™Ø3;r™/˜x·P6ºqXãˆÎ° üMv?,tox•ïl—ì–• 7"Bl²&C`…‚ƒÐ ñâ ¼yd– %bEØ»HÉç“Ïç_¯p›XnƒžŽM¿Äò±ÔjÖÌ^—å²pK®5»,ú½œ!@ޱ1¹ôßNk†Õõy¯5In#y³±‰7c9bFOÐã>ÕsÅȾ¿F7%¡XÀ'}}[Þ²õD´hRêÖr埙Mtâk9ÞÏcÑÂÑPJësÄ–§|N§ mЍ¨£ tïÜóëT>ɺ„~5¦ð´Ó ä³ßZµc¤µÁÚÈ2z^G±•Y]u=%QSºf%C‚Ÿ˜«:>ƒy­Ü˜-påݺ(÷5Õéÿ 5mrácŠ=ªFY¶“´Wká/ƒsiÓ[ÙÚF[Ípfy%ŽFÞ¸öÇç]X|²¤æœ•‘Í[1£N.ÏSŽÑ~Ǫ‚öâW#?º=x«Ãöq“QWušå6deÜ€}¾í}íû"þÈÿ ç½~ÒrAeá=.Í®otë;öŠàya¥+p#HÕ¢†•>sŽÁ#‹ý´¼sû+xÃâÿö·ì­á{ý#ÃímSý¾Ý [Ë¢í‰"Œ`¦ÅÛ….È[`-Íákä¸Ì|°” ç¯zi>Dûsw<êØœÂžVrQod÷~vÔøoYø,ÝÑõ@¥OWqî1‚=«Ö>)ñ.µlI8L½:ûÿö“ý•5_êÚ ðŸ…|Eyk«ør –»Õô9aŽéÊ“ÈÌ`º¢à67m9ùÈ×Ï>(ð‡QþÏ×¼#½¬ò Œ¾]óªxùÁ äp1Ï=<UšÐUpviùêµ¶ª÷[uGt3VnÛºòü™µ-çL,ê6ö`r mø^îÝÔ¸W¯?À‡úÅ´¢êL®ZiÀtTÏA‘’Ü€01Áÿ캧„ÇÚ£·’X®BÇ |êà G©}kSÄ^Õ/¥F‘[[ÛXŽNpqùâ²naŽÚÚ;(÷³oÉ8ÆxôíÚ«ØÊ)ôЈԌŸ2zÞçã¯'ØfU·QC,sÒ¼­ìdRÈÉŒ ÷ÿ[˜t·‰Š’F[Œãƒ^3}Gw) 6™¥|®w†‚ª¤}.U^R¦Ó9æ´š5ÜS9¦>XÀŽy­[‚Àªs,`neô¯›•(§¡ìÆ£–åhúœGbE>‘ù… #ÉùyÜqÍb‹kæ.YY†NGãZ6Ú¼xžroy' ÿtÖddm*¥”ž<­Mh‘î 0?t•½)Ê2ЙÅKs¨Ó¯…Ôkulìqýî c§ÿZ·4-bäN"»Ô•DŒA/&Ò ðNr:uü=ëŽÓæ±µ³É°ã%AàšØ°½³“²±ùˆùpr>†½¬.%ŧ}}O2½+«$miù ¾\dv©5-*ßT‰f·couÝÌgiSøS1ÈQØUˆÝŸ¦=+ÓŒc%ÊÎ)BI£Ñ¾üRº×coøªm—Ñ®Èå þµzŸ^µôgû_€ÚÞ¯¡éÞ0ð…4›‹[m!ñ¤v³@.3ÌfÔUšåq”Ý Šˆó’_ÌøÅí^IÒê¶h˜4L¼¨®óŸ|K¢­u]-gpÒ>ç|áòÃç»·\×o•ÖÎéSƒœ.“k{íwêqÛêÓ•JKGº=Sã ì^-¸¸’÷çM¸ r9!D*»Y~O•²X(UÉ-ã¾&Ò~ÌNPƒŽF9¯Q“Y_ÓB!†énfßG )öüª À1É9ùEvÿ~ |×>hŸþxºî}~ç[þÏñ'ƒu;èî"m#”Oj3¾x¼Åœýܪ”äx2¬Ò¦W7–f:rü2ég­¯Û·äg/ßOÛÓ~«©òˆÒo5ÂÖÝÛh9!Oû?ÞΊòáIû¡¸ükÞô/„•¥‚OkàíDÛÍ:ÛÚ”Óä>mÃùdDIPw”‘tá†HZËÂô +RÓ~#ÙkêÖÏ zDqA›nÄIüÝì9A"+0'æ9P¾Õ\~[¼”¯V{µt—{ì%‰¯m¹W™ó•߆/´„SÛü‡€ã$V·¼1y¯ßµEH%œø õ»¿…íã;;}?ÃsÛ\K$>\ÂrႳ2@ð¤9$qžƒcáÁ=FÎt·’)VÖîi·{ ‘mó 3 ÊnÉÀ­°¹ŽQ<<±|ö§‰=$Ÿkwf5qU]>D½ç÷¯ÀŸ†žŸÃÐêš…´sܼSÁ)µ l7r«gŒ‚q]¿„|oá±oºÞ[¤+²ûP¼—dHŸ4¤*8CµÛ´Îp lü=ðëÂQiV:SßMctͧÛîÝ)Û7 F-ѸÃ`sÉ¡ãÝ{[Òt»›²-,¶)¶÷Æ\ʉ2ƒýÂ{‚;pkò<Ë9ÅæxÙÔu%ÈÛ²Ù%²ÓÐË j/]ÎÃDñ/…-ô‰!TÂÊÍy]ji‰¯Oü™æÿ³Î­§]On5í6Ým`šIC·Þd^Œ>íÊAèTäƒ\­·ÃË,öÖv²ÌòL˜¸û&õ·Q×pTrsÉWÖ Ò¼%¤èWz¦ššÜæWŽÚ{œ±…íRˆ¤e†P‚Y~XÏv"²5›K Ë”ÒäÓ/®!ûB£Iwµd’Wi Ý׎¦qÑHú<7çôez¶Ÿ“V·Ýcަ[gΕ Ñ~ý«Ã±Í©]I¡œ/O†fŒ±Uhlå6ãÙ-ŒgŠ£ñoÀ¿ð€‹6±Žylï,šC«<€ÅæFÅ%Œ¨Å2‚¹ 3Å})wá}Àž‡O³¶ŠúxHÔ#¼"[ÈdHQÝÇ._saKFÇ,>[¸Ö¬|K©x“쫤]ÚÍö)m5$2µÈxnK,ñ•d2òã$òHtxÏ;ug?u»òôôïøžŠÉ¨{Ô[¯šŸ­=ð 8œŠ³ö"6¨TÚ)ÔL`Ì7?§ÚÎ-¥Œ“Ó†<~DR­« ¾qMxÒ6¼UEJ.è”ÑèDrœ b¥¶ËPqëIilò¿Î™ö­[-âàp¹øÍ}u:s›Ðùê“Hf“¤©/ÙÚEÞ•Ù§ø×Sá½;Mº„_IË)“8Sò·ñõ=yãèj=/ÃpDŠ—ÈÿÞ(ÛWóßüö«³êú?‡Û´\òcb©ï^­ ^ÉsLókUöÆš+|šwúl3Gº'Éhä :ƒƒÎ{õâ¶þücó®!Ö£ÕæŽñŠ;b¥¢x÷‚c*Ü0!¶•êUN0q^e¬x¶âæL[ˆœ2†RvŽp3ŸÐUŸ†¶­ww/•;Á…I^:(¿$éÒ±­6.²„ ¥~é1}^P æÝš>‚Ðþ&xa4[‹ kSÓ´Èc ä¼¢Xö® rN>pAÚqüM»Î|Kñ[Á:dKq%Ãê0+$²z! $€=3^Qâ,ïµI& )*Ìe'$uZ£qin­öi6îD CBž2kÊ˰ÉgUa£7³Öß©¯Õ!ˆQu.ì}]û+ø¿À>$ñAÔ"¿’„OíéñM4ÖXYZX‘Ab¹Ê¥,»˜ooøcàyïï4Ÿ Yx«DÓ´KíoíwÚ—™ ­¨.÷ìÄ•‹å%Ÿ9–Ë×Á?ñfáÝpkcS–æ(§"×Oh$Ž9•·2ÀsËp8ÎkºðOÆ Æ>1µÓb6·š­Ý÷”4¶‰U$€ª,i,Å‹¦í‡I!wf¼Cân¼A¨Ëá #U‘좼ûT7JÅvŒ®pIaEã–ã«àÿøÃáß„­<_§ø> ‹ÝGÅ3ZE}¯é:A HÚ9ud$«y§Ëëò‚Uúѣ¢Œõ4§Št߳ޱ]lvÚWŒurò? .Ÿ=ºyÌ]¦®æ%Ž×pqä¸*†À!˜6?‚µëØb+âŽl/ot¸­ìá“UÒR[{Í_O1Â÷J%XCÊežPUrVFVpåHÜMq~ñÖµà-ROéwbC9d»ûD îÌàdÎO‘È$«Q§6’к¸¥Y«ØÝøß«ê¿>9k*Ö›M²Y%·‘-´ëD´†D‰¼q3.R"¸P|²q‚í<ðOá‡ÅÏ‚Þ(ø­¯Ø5µ¤§N²xu2ëÈŠ9 Ú ¹–%8CÜ*íHÑæü7ðfÓáý‡ˆ|[ñR°Ö®æÑ.WÃZ=òJýÀÙÞI\#Àñ!YÔ¹BKmr»Y_ƒj KBðõÏ‚õÏAt×~m7PWÄÞT(¦h5o>øe˜HQÄËó)€tG!ª’©J¯´z_ï0‚© ŽRVOtx¯ˆ<;uá›ËkKǺ„ s¦Ìк3Cœu‘TïÀÎ@ÚÑ\߈< ¥êÊZ%Xä$‘»ôö¯hÓüYÿ å•î®x^Â'²òçK›a(´—ËgŒ gŽUxF62€ee`C³áKíWs¶©lg+mq!$+œêÄÞ¸8'¥~£Ã|g„©Eas9ÚKá“Ù®‰¾¦º3ÊÇ`Ôj{\ÝWŸ—‘çü+ /Ï: VmÝyýk{þ‹U‡d.Ú·m´o_£Ïa£4‹c&éãR›sÀœ¯}jg«Ãw=­Æ•!û<~d“Á"Ë(ÎK:‡½këpÙÿTÄ{ uâäüÿ[[ñ<ú±Æµy&y—Å_Û6’÷7¨ÅG-·¯ãŠð»½A;„\)bTz úÃ\Ò¬¼M¢Ëa%Îc™I"9í×Þ¼gÅß u 0ž'‘UrfE;ÜéúV9Æ[í¤ªÁiÜö2ŒÆ1‡³›Ôó8ìÎðà) ¬K×÷Ínϣˆ%Ï×jtÉ#;Js_4ð²‰ô ºhÇ6Q7 ˜ôâ£6¬€ÄØÏ^W­k>Ÿ’FÞj ¬ä'lc$ÔJ‹] UZ;›-6îIÑãÊrTç¶?ÏÑéZºL[¶†Ye#òH9ÜzzTÚ~œñª·˜±ym‘œŽ9É ãØdú µ©ê§EçO$JÄä@˜fÛ’ùIãƒØWØÒ¥ Z½™©UÔv‰vöm6Ä/Ú‹;ÎËÇÌyÎ}kñïœ÷rHvCÌS¹?ÌzVž¹â­B?)”F2A H9¬—²]ʬx$ž0HÆ•aŒ¬¦­p´eMÞ[ ‘".ΘdñÐñþ ³ov-®c‰MÊ;"«›9Ê3ðrÁ œ`ƒÇúR\‹V³óí¥l[ˆcÊ俆+CÃkke¥¦«pdwžI*°â9üºW$)óJ×ÿ†:e>XÞÃað Öú,·Ú£ùNû£ˆ†gŒœ £¾þ•ŠªÑÃ;¸–Ç÷ôçÿ­]%ç‰öùÙ˜,+ÉsŸ”I'¯¹ööƒ›¨øR‹EÒ"Sç°1ˆ”â8úçŸÆXRŒ¢©êÿ0§*¶n¦ÇUû>i–‡UÕ,æžÒ)–)×h’Db7„%X+m'‚9ÁuýQøUûXIà Éð»ÀþЭô ,Ö:Ô÷>•&»_´ÈóÊ&·¸}Í#í¬€D›HÜêçOß[x2킬O*íŒ;ò¾ÒKqÔc<Ù=}ÅÃßü4øàèãŠ][Æ:¿ƒf×îí4‰ü…ŒËëfeŸæʬˆYrË%ä È~S‹Ó¡ì)).t›kª»ü<…‚ÄûzÕvÑ~…??üðÃÅöŸð¯þ*K[¾ÑΡu¢› I¥#&cýê †_¿&UJù{Xóìß*kÁÏêÚü"Þ3jQK©êkf,œÊ˜¸]íå3‘A‰voòܱoÔ®Ö_³Ø[äÃ#.K«¬…ŠæL«mؼ€zT ¥Z]Ù/™pæäH 1€©X·ç ~PH$6wcgŒ„§Ë4Ò2…e ¦¶üγöŽñ—â_Žæ¹áRÆïH¸Öš+7´¹@°@ĈÌFÔ ªÙUÀoeÁŠ4Ÿ øjÿO¸ð‰­µ«'ÓüíVi`Œ…¸hÝX–t¨ëünãFñ›7Šô xFÒûB°¹‚+aå%±x#›{xöÉ.UY7Ÿ •®<7â_j¿€¼£Kq,Ö6VM,[Æ_„„Ê¡ü¢2Ë¿ *6±§>WyX•)ó¹4u_ ®ôsA¸ð•æ•×ÈŠy­Y¥…Þ2¾tRA( UŽÖå0GÍ´â¬|3ø+Ä»k‘{a7öM›ÜYÉ<Ŷ%Œ‰‹C¶g[±àmI©CÖþÍ÷—0ø}d¹‡IŠgšå<ö!¦UQ¸¹‹Ž—ko"KåÞCæÃ6íÞ_˜ŠÄáŠ+2î¸ÎgñM½õ¶§$ÚœÞMÓÉ5”÷hÌÌø@¦$2`m@È_'m ú™{ E;ü_¡Íæiͱ½ÐB’&kHý!‘Ã`É’1¹FA$`“—ªéñ´‡IÕôÝÊÊ6dß~ëz‚ìx8®Î ZW·‹_Ð!Þyžææî b#)]áX1T`û‚í*TŽ™B9ψ–z„qËö+iä{‰V?³àÂ(• €Øu;I$¸YqN?+­NIÞÒ’e=Ú{«}ÅVÀRÄRçKßòïúžWâß…Mý§ö­2"b—-…O¹ÏCý+Õ¼-šn`}zdW­h¾#Óõ»q,Ní§iÏ>‚¢×t%ÔTˆã\!†9'Ûõ¯×å…ÂâiûJViöØòiã±4§ÉSKªé d‡÷g$g¥s×pì~+Òüq¥-°a¹T¯ÞÍyæ ŠŒxï_9Ž¡R±ôxJª¤.z6¥uv&deIÙ—N¿J£6.é1’¡Iaž}zu5¥r’BX<€¤lÊʨΑž¼€}…P»x€ÂBÀç’ÏÀü1ýkÖ©mÙæÓvH£%¸ä°$žIc€áPêv–ð ¨2d Èœ“ÜéV¦š#óº f³uI~ÚUö‚aOÝáúšå›V±ÕîT¿q1b’¼çZ¼š»Çkäœ(Xv¦ÞInqÓ©$û{U 9.O(’r1ïZú_…5›É–ê#|¤§Ë‘ÈþU…5VZÇ©¬Ý8Û›b„)41‹>É„òÝ7— ¹¿Jý4ý€¿à›~ý­<]o~ºÅæ—áxü;uvqm5ô *Ä *â/=ð„!'fÀr™âó 9-Z¬[“º‚óKwØä©˜Ùý^“í™â:7~x/â?‚ç×4ÿ·YJÖ_iWR&oao.IPN¬ FˆT0-óo!×kmm¢ëמ!ñ¿ÄOíOͧé‰ce®Co=´DIn×+Å´^a1$qÊ0ª¥Eíá_Áσ^"ñrÞ'еm:Ø]é–£Û3iíÔ°¥ØYdd¸ˆ‹Ô•Õ#XÕ—Žý¤þ3|=ø«®ÛkÚ‚¿°®- µµÐ,ÚUkX­ái|Æ‘~_.i™ñ™w²¨ä0üŽu'Z¤ªT~ó¾ï©Øý–’²Wþ‘é×><ð7߃_¼ ãTºò%Æ«©Z»=FÊ@X-še+ÐwŠUù“•ÎÀWÂÒyyÁÇ%ºôÍ+¿_Üì3Â𺺬–áJ™Œu?^‡Ç¥V–X®¦í·X¶*¨|ÍtÀ<~yÏzæR•I+³‚uiÝš:–©yöôy"–Öd ’ ™¾nøÆ¸ úVK4Vñ•(Cï ObqÏÓšé¾ø_Ãÿþ-ø_ÀZ÷âÑlµÏÙé’ë2Ûá--ç“a¸eb#å$väb²~8x*ïàïÆ_|*Ó5›}jÛBÖ籇S÷+8°d I?7N˜èA#5¤¡%¥¡Œ£'©ÎjO,ÎHl\’ èjßÙ´ßZÅq&¸&Ö¿Ñ®mí­íƒÃjŽ­!yƒ !V‚Wl‡'øj­ÌWB5¸¹‡ åï(³Æå3ÐŒ~n¹%H â‘­mntù¦›[† üÐâÚurí€yn9Ü1Ïo¡¬d”Qšv)ݧ—)•F7ʹ ü<~z ê–M¶î8îYešÒ RBò¬`7hR[ eNÇÜTiÙê²HŸÚ³F$]í¸1Ú’0HÝÁÆ2=Î+ؾ.h?²‡„—Ãß~üDÕu7ÄÁ×Äž Ö­›íÚDI4`¨¸s$eÈYE*»sUSJf´¡)_Âoø·XÔï.´—³ŽËÃÚúþ©s¿tQÀ‚<Å#+†f‘ÚÔ©f `@ ãÊîémË 6£F!*¤>JÄppAmÀq÷³{Â>8Ô|5uq¦ÄË£ë1ùµ…àó{f`Hp¸màD‰†eXs\ú_Í,ò«!™¶Ó£Û$óÇǧpkIFK–I8Èø‡¯Øi—z—©E4Z\E§ÌÞEò¡r¯.ÆÃ¬P6UòÛ‹1ªZo5}ÿ‰¨©–òÛm£\:ªo;2ŒU>fnp{1ÏÍË-6Òxwí·ÇÊ8äüÄãúóœ “U0LJ¥¸ ÉSŒ’N=‰?€µB§î‹¥‰]2}oD×|9púgˆa•%·ÅÉ(¸€b »O¦p νӡˆ‹ØäBÙbÆÂàÆ9;°1Ê‚ÅlZ_hÞ(Ö5{Ÿß½¤¶Æm6xT»ùÈc‹>[;äíË£q-–&³/ãycŽÞÝm£ÊoP;c½*ŠÑ2œýæû—5 kÂþ vš‡™±72Íó³Û²¨fʬ¡TŽ˜3œ ­¥ø«QÓ4q£hsÊ‹mr³ >Øc)p?¹åíuÁUbÄ’IÎAÒÙO¯Þêv¶þšê臒Ø\8uŒ)ÆÞv†8%GÝÎà1PßÅâ).fµÖïL³ÛÊcid_ÞÈFùN\œç%ˆàdâ›rJèÖ¥Gnx¾Ëð:_†>0ÒtýnkÝjøÏ PÃnV¾WŽä…zJó(@Ø ’7Àç üiðìÓ¥èö>;øMñ=o-ï/¡´“ÃWzzÇ%Ôoh×WSÛ´XÌHb·*à³°—’ªsæòx?ÁŸañ¶»yã |Qö;m Ë1¬Zx·f’ww*’eŽÀ B‚Kn SÐ-µKFžI®tË«y\iƒ+# ¸°8`è¡ÑIûØí˜œœhJ2ZXô0µq‹×õ*k?³¿„˜û(TzÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ü!šB àÒ»?(üê'¸2>é È ŸJrʪ…°=ù¯©æ×CÍQл¢êÑéŠ]½ºL0AG@ï^3ï[–Þ+УÓÑ,í –8‘ÚÝQß ìôÿ=y5mÒdþ•rÚ5|5½ EH+Gò1­Jœµfô¶éy‰å,àôŸ½Q¦Š÷wQA^@˜-Œ’@Î.WþSÉ‘žœVˆÏø×zP›8ýè»&:+eWò `À‚_°‚V\Zy´ípü)íÚªé÷0Ø–crp'€;ñS ZÈ2Hè>½ëªŸ$u{˜OšZOçQò…Î}ý+KL‰• ±ûøÁcÛUTLv™¶ðkZöF²øßE&îrÔ’µ‰Ò%IL½@ wÏ¥iÉq 1šD‰®E$n,ÊF988È$Ú›¡iNûæŽD prÃ'¯§nµbAi>±-’$ÛöZî×%}IÉü‡jô\aêq¹§?B–¡æÎϤ›QËIQ¾c·pIãߥRÍjR[¥bŠBœ6XŽ{ŸÆ–yd†àI îX ‚O€:zäøÕOµ<ótÝŒÌx\~”¤®i+yܾ­Š£ˆÚAÛÔê3ÀéëYzÝÒ@íVÒElyª¦O¸9«OªFC•lëÿÖ¨ÿ´_Ê1¸=KáÏAëÓé\³jqµÎˆG•ÞÆUþ™o´û¤¹@/îàúŽ«øÕ1ªH­m=¤3\ ,."·p¡¤2íàrxúçüAäOt‰b®£½ÞÅ”zœ äsøW™‰å‚æüŽêœ¹L™nUnYpUX™þ.j΋¦ê’\ùìH…{°ÆsVmt‹+g]RKUe\²1ðO_Ò¥Ô¼af³yÁÕà(úZá…8BÓ«+y2œ¤ùi«ëZ›øvE’ÏNgè·;r9éÛñÆk!ïµ­jAo;®î#A…3XÔ§Ö® ÝÄ»UÕ¡•߉£º”H4ý¥F&ëëŽ8íÅPiî.¦Hf¹á›q¯¿•é øUàox~»}Eæ¹kŸ.U–p»ºdªvŽ2s“žÏF¬|ù)={#*ó¡„=E÷\ó¨ç–y‰´·,Äü¤XWYàÿ~9ñÕ´·zDQFñ8EvLmÈÎ~aÿX®›Gøo†µÕšÍ”¶`”±?/¨ÿ<ûvúWàßƒßÆwšv‘kmo³«Þ5ºá”;Û8û£ŸSÇNõßO+ÃápÕ18æùaºŠ»<ÜNiUÎ4°©9KfÏ“ìáñy.d´æ5$?œ›\>éÏ<¯¬Óð{âLwçMÿ„>÷Ï ½D~îq‘ø×éö“ðÏÀº†aÔb³žO³»ÁquÊÏ Ê„!U·»Ç^ß.îeÐ|)¥ÚÞéÙ|)°}Gì;&²ºÒã`7pY†ÆFYIàg#Ÿ’ÿYxzWµ:ŠÏ¼]×ácÓŽ8Òî¯=ê~dÇð‹Æö—:¦ˆmQÈÇÚ.cN¾Å³šéþxZúmAašò[hÚâ[I¹Œ/#ÕNF=¥}תþÎZŒ.¦Òn¼%–©sqæZ™g+n±D‘#¼”†,ª2)%j)c3U¼³Ð4ÿƒ¦KÈeKiç°·ó£s„cÈFÈ—kd¨ ã<`ú8~*áÊ3Œ¢§èÒüÓ9ªàsz°jQÉÿ™à¾ Óu =ÒûXžð´¹V™²G¡ê}óÞ½oÀz…´}"Ùu½!µ[iïD¯eÔ"ʃ¢¨Ø§8$ýì(컇lŸ°×‹|+â‹am Zl†Y®.¢‹leÏ—ŒnmÆ2PWæŽkSOСºÖnü!ý‡áó§K¹¯µC¢#ÿ-#Ê®HEÉ €ýÜ㓊¸§.ÎhQ¡†NÑ»wïk$p`r\~´êÕZ½4?$XÙ#­7xòʨÀïš¹$1R‡ðªó¢¨Ü#5Ó$ãv{êWdq¹ 0nÖñí~IªeD€HúSâ´–@Z(Ù€<‘Ú¦’zj9F2Z›š}ÒÚŸ™N3ëÒ®JØ9S‘õ5fXÛ§š¤žz³3ÂŒ?6N:ô¡ZJ 3ŽTãÌ]:µ¸('æÇ·­Ygˆ·ÝÇlÕ }9ä‰Y­°CrIê>•¹£DžY -ÓŽÕÕB3¨ìÌ*rÅ]ô=28³‰K9$Ÿðã¥uV–“H…Ûï`€{wªþТÌŒ±¨ùå›Òº[m)bW¼Q 3ÈÁUGã¥}.ãM;hxxŠ÷•“*[7Rhtí˜èè÷äæiÚ­¬övéþ¼eºg C2ƒè0w s÷†:b´J_ìö…8]¢o)Õ°ÈÄ|¼äqž?†M2ÚÅ4— œy¼àFrNy矮k±ÂV9”âÕÙƒ¨Ù›˜òÈ8ŸÒ²µޏ† PªÌ{ŸoZíŸH[ÌÂ0ÀFd(Ï€02~+Ž» ²»Ëƒ¸çÛ•rb)ò/S¢…NgäŒgb‹ˆ‡ëTîu2ðâ7÷í*HõÎ*ޣޫØÁ=W­d¾œšjˆ¡%‚IÇ9¯¯´ƒÓcÔ¦¢ÕÞäÖVrê÷¸ £““úã½KöN™gyu{¨¨BU!ß’ÌzlóÐVUÅüL‰lûwŒ;ž0¤ôöéYî§çß‹Hå°H9Þ¸êbaJµät„ªNÝõÝ\ÝÊM²yj~ê‡ÉßÞ³L³ÊáÝÎ{ôë•g¹É@Fp6ô8©eÓš;zÓÇ’û<€ØaîExµ%:“m³Ô„aN)";[In™ŠùI'­#Æ-ÜÆYN2E¹e­’BªOÌqÉÿ8©Rí%ŒÇ3K°/î–09êÞ§õ¬ýÛ+fÈøoʺφÞ!¶Ò†úøª¨8‡ÌÚHÀÉýQœ×=6›;N×-·‚Sº› ì22ö¨n,n퀒x]2\Œp{Öøjµ°µUH­Œ«SX8K©êÑøÂÓíÑÍnAG‹r»™m8éü±Šú[ödÖ7ë:EΩ0€>èÒg Ãs‚¼ŽzÏ< óšøÿá…¶¤ú€–kGx7(™Â|ʹ p?+íÙ“ÂmVÇYÐ|+qsii‰#-6T…õ-Ôà  WÓϪdš¸‡h¸KMµkK|ϘÅPäÌ(Ó¦®ù—á¿à}%k¨i`´MÑ–ø$r™eÈ9;¼¶g”1 Tà`ñ-¶¦Þ*¶·iwu§ÜÄ¿mD…ŸÌ}¥„kÈPÎÆÀÆž'àÝ_ñ ù³º‰,£],ï¦I$ÛYpûx*zo\Œò3ÑÞøSâ§áû]x¿TŽöÃË’{›Ööò"™œeŒ˜Fû Ç´˜Ámsô[Åš.±„-b“á´·v¢C-¥¯‡­[™SilÛ²0Û åGÌq´VF¥âxËÄ«à¯êÇIñ4ׂëN³[qq%”öì7Då<âά[ òç’A BçØxƒÁÚ¼Qêú_í p4íQáûEµ­ÌóL'Aä‰ *ÌÝõRÀü¾½™áo xoÁ²êß íAµŠSþlv·—Fÿc® ›+°<œ18ݶ‹(%}ÙÉèS&³á³ø“þ/ŸÄWgRT¼´¼2\…ÌÝå6Ò†L*‰ ù+AÁÔðxCƾ»½ð‡´+µžu6vº=½ÝÝœ*¹–™¾yœ Ïóã”<’œÏÅ­[ð÷‹ôïøÓVžO°%Ƶ{¤Oö™]”»°Úáw,ª1·oVñ7ˆþ!k×W_5˜ôÝ ž½7#’8œ a"H员ëÉ@J/œŒ%9(Å]¾nD¥«ËOÈü€Ý.?×7=ɤem@[>ƒ&˜NYˆõv« m¥&#Ž~µúLS“<Çdˆ‚J%ºê:¿›,ãeª²±ì$«ºfœÈn䴑®tÉbzcò«±Ø,У3,C«›œzW},-÷9ê×IèWÓô;€ÞLÀœJ÷§\éW°;4pHpß TÏç]ÌEm)'ïY×ÓÚ¬¼A,jr@ÈcÏBkÔ§ƒ‡³GŸ,L”µ0¢gtÜð²óÀdÅoøzÛNî71‰r7†“øÏëV´«2Ò\FÍ„ùPrsßÛ®+¢ÑtˆnL0cQ’ÊO~kÓÁà䤛g#¹Kzc°gwÏœ€9ü«kQ½ÓôÛt²žöäšòÉ! Ø'ñ{ûó%Ì:mŒ1Úi¶S‰•†éP‡Žzž#ÁÍ#|I8ù@Áã’3œž+Ü¿²…¿á#ø“»$“Ä6ÖÉ5¥Å¸yš5Î RǸÎG¿P1Ô祗¢é}¯U¹‘ïÂñ1%€ÚIØ£æ^y޽qŠçbñ¸²”©Ó`‹Ãʈ³dwð?œóš‡Zñ«_Ü‹ËÉs´’Uºƒèqžç¿zÎUéò¿{^žCŽjËN§Ks¦?ÚƒÞÜKj×ös4)èˆ;%XärÙé·Þ¹mNËM¾ñ/,ÏånòÚ@]9 ½G#éJ|S§OËÊ&0Z9ó½{zó×ëWtoˆ6¶×ò[ZÒîTÚ³8ÙG=K°÷,O8Àät9ÎtÜ-{ÿ] £ °“|§ªX=´ÿ-´Šq‡Þ½Ò±µ[|H&`J…äúZîÚ&[‰$.¿wËEÛùži‰>šÒƒ%›(èX=yî)õÔíæò*) ð?JµýÑÇq#)ùJŒ±ôçüô««¥Ã¨L,tÛI›–mùkÑüð†ÊòÅ®˜Ñ eyØ$}3ÔXôàzõ®Ü]_?qè·g&#F„}ýÙÇêƒÙi0GwgÓ¦>yS ¸öý­b~s?u ÈAÏ–ßwoÆ·|{¡Üh’5œ($ÈT,(p§$pž@“Ís–:±ª^%†§M<Ò¶8ÓsxíOñ ²„Paý”éó¶w>4ë^Ô¡†ÏL¶6øXÌkn Áã¹óê{žGZû÷ö*øñáYm#ðµîƒ6™/›=®³=°n7*°'…òˆÚT Î~|åqƒùûᯠk~ÔM¥È¶7¦P²Æyò#ålýÒ0xíßÒ¾¡ý¼}¥øjêÏWÖõ‘ ꛃ¾Å9U\ägŒýÞO8úXŒ LÓ"­‡ÄÞM'(ÅoÌ–‹O>‡“^µ<.>¨¤µ³~OsìÛëÛý.D²m6Ý]£KÛ§¸ÓV_!å Ò¹,­åðA9^OE£ÞøÄš+\hZÞ‘áèîu5ºÔt¿í…I.íÀ êL;WRqâ ¤gyÆ­ûYø&ù¡½¼º‹R)æF‚ÛOš°ªW÷Áö®á·€xº/i~ h-­øKÁÚÝýÃêq‰¤°Ãšp i”® C†fW'“…ÉÚ!Ädy® õŠÔgÞ×jËçsê(æXõ=”*);mÔ½âËïÙÒÞòæëzŸ§)dÓt¹÷Í>Óæf6BŠåðŸ>C.@L_ üA.»áCþ‚-¡C RÜêWÖö°‰ ºV’I¤ca¼d`w9Ë;Q}Â:—Â>Þoé>ÒgÕm¼×šøéñÜIq囕‘™wåyîà‘Ìë8½O-þ4'›XÓå´}:ÃQE¶·–FÈ·Ÿ,K¸G(îNÉ»sÁN¤ZŠoï:Üá +´Qø#ñÜé^2º³oC6„·ÚùÚe¸K‰¢£»ÁHcæ¸Uä©ÎÑŒ)ûFj ü3áMSSSye£êf èr߯šnAào½åŸ¹c•/Î7 9?jgៃ.Vo rÜQ¹T…g™<°Ü,r@ì??Ò²N£vÌ—R£30 ¹RÀ€yç¡éÚ›¯ëW: Š9áŠÝ!…È.}O¦9íÜõãΩ®MŒ#de,Xe‰˜¯Œ„'£=>Í ï‰ )±|¬“†àúwÖuÞ£o:·€“Œ¡ æ°.5;ÉÛ Îp£Æ»Èed<• ÿÖ¯6®5Ô~Gt0ª(·q}, Ýÿ»“ÀªŒí#aŠY&iäóqÀšj°?ÔW æÛµô7Q²óœ©UÇ=x«Zf—q:„@~éj+H&r5û­Ï­u¾ {k+øï5D" Ùb'v5Ó„ÃÆµEÎô2¯UÓƒ¶æ†üÅ£wY_?ucÉ qÓšÑñÇŠ5{?ì–úc[EgÜwd0Îà8ö ÿú‹¿»¹þÊ·kté”|z’AÆk)µ¸&±¸´ºµšYæ;á݆ IØ’s÷AçÔ­}åBN‹µúž<#Vu•J‹äsW‰5« “›oÄ-çñŽGÆ+F/ˆ~+Ó,ßJ²‰ –EØÒÆÌ$ œ•s‚OOoJ–/êe¼º~$q¤€‰dHW{Ôoê3xûÄM¦$ HПšh¬Ñe˜¯& ÓVUÝø‹÷¾ÂûÿÎßZ¼¸ótÁ,@}½{óÚ»ïJæà=ÎÔB¡YWpùz`àŒý©®2Ý‘AyЗÇŸóÍoø>=NúèYi±4„óµúŽÂºrÿÝÖ[»œøËÊ›nÈöïêR˜Ô,ûÎÜœ?<úþUìŸuoNm Â×–ñ&¡e"_}¬;E@ò¶ÐÀ»€b¬Oòø'ÄÚm´m%ºººí?ã_E|(ø{s¦x6ãÅ_`žSyo$vÍñå «>ð<ì¤Œ×¹ÄØì> ©õˆ¦çîÆ2êßè·gÍå¸yâs8û¤umt_ðv<¯âEŸŽtml×Wâ‚ÜAgq¢Î¢ ›P¥SB™–pKNN@Íröú.½pVÞ[1åMH^4ÎîIPÒƒòŽ1òå€ÏsÏб| †æÊó[›^±´´µ„1}Bà*ʲ«ŒóŒŒ÷/Ÿ¾Ÿ„éãˆúdž4ý#UgêpágùbdàÍçÆã»$˜ „ÃqÞ+ËãIá•â’n-$üö{úŸI.ÄcqNJ­¯ªºn߉ù÷wðÿXÔdH^ýæ!Hç†ìÆ?ÇŽ+¿øYûüUø¥ŸNa‡MHwÆí.$Ž6*¨ Ølœ1\`g<Œý£áÙkÃ^*†ËUðçÖÞiQ ¿ÕLVðA²Rß ƒ{ËòàÚø ž9õh~xŽî/ìuëIaš3j–oàæ` ûûHÛ¼ïA<ŒëÅ(8Æ}.Ius³ù$¿?Àör® ¨ï,]NeÑGOÏÁ˜cDdC´ÀaN8§Ÿ)¾EÜ­»•à€=sßô¥‚Î[’9#Ž{Ç¥¥¶ÕYT” ‡çlg};×ÝÓ¥)lx2šŒµ"Ótù Â}’éHp7ä玧5ÔišmÉUI•%7….{žÜzUK[;kÔ¸Wy0D`ŽFq“È*½sý*Ýî°¯4‹k2¯˜ ¼ª‡?…r^™<×­Bœ)G]Î*²”ôèM¨^i°Z,VÐ~ôÆq¶f6y'Ôà=Æj‰ºÔ£…mÆ¡);de›Üqƒ“Ðçœc“ÍVw†M2Ë‘æ€ç¶zž*¼ÚšBÆE›ÌP@]àÌxãŠSª—¼Ø¡•‘#ÞÜF¬Ò]£m9ÛƒÈô$š‚Io—î&3øûtªq’ÒÉ ®ç$‘&òÀn;Õ ë•‘Õíe‘S$ dúÕËó+~ÏÁqéÐÆº½¬ÂKˆÃĪƒ•$€FqœFjþ¡3²ÙÊvm“ËýGoz죀nÊhçž)-S9-#Â÷ºÆ¤,,Ô¶X ãèøëÄ6‘O=ê\âîxÚ5Ð*ˆ“× Öæ>Ÿ e~Ö?Ǩí¶îþ_™Ž Œ³ìr¥µ(k/>Ëæx…ìù©X\Ca¢xOP¿™Ø=Æ­shZ= Œª¢ŒFNO\ž¸=Lj|uá9- ½ñSÚEs ¥¸½¤•Šœ¢€6í;¶ì#wÌFzõ_ˆÿäÑui~ü)ÓãÖïÅà·k}.Íe*X'`'¦^T¯œh¯uíb_x¿GµÑ­Òçsÿj³¤(Ì€rÇûÀ’ƒ¿ÆfÙŽaWŸQÉ®úÿÃ|ºÃà0˜j|¸x$¼´ÿ‡2¾üÓ/bÔu‰×·štZŒ¯mciqå«I¸<þñŽðWÑŸ |=ðῇìü/àýcO×$kÓqr·γªyjÍ´ôRI±·,~îEr¿¼)ðíš [½Nî ¢òá¾Ó¬È·U AVvË(bIíœãšïl>øËM¸¹Ño&-‰ß,m¸‡Û»k¤œ†ßwl‘_?Ž®ÒånV~Z¾š‹½•×ÞuÚo‰d{ôŽ-‹i1Bl“88ëÔ ¯êž:´¼q‘ÜĨñJ‚ÜE–eB2|ÎpÀò.AqŽ;ÃÑKã-dxE¸ÕR [VžðÜ@ÈÐÇœl;™™›,§8=+ºð×€ÁÒ\i˶\ùÓÈ僜m Ÿøc·Ì{ùŠêY~òWoeþg·…ªæ­è;QÄ Èˆ][–  yãV­¥Ô;d†ÆG*¥„_iÆ89|c§Zn‰Xýê$|B¤9ì9õúÒj¢!"˜¡‘´a£sòÂàŒqŸoο°#Âz3ñG.iX[½RiQŸìÓ)*IšD';v‚¹ÎíÜ ¤$´qçÉp¥”’P±%GâO^× ˆMÏ2†r#ʯû Ûüû×½º™%o³ÈHhÀo0gžxJÆum­îh£} “j`Á¶"ΛòÏž:{díYææÙ¡ùžC‚X~ÿpúã·ÿZ²¯oÝ‘cü¸&78>†©>¥sÍÀ ÉüI® ˜Ë»3ªm445MAWìoµJüÍÇùQïãUÙsÈ,]ÉÉÇnŸ•g®¢ÎfhÎãü@Ò}ªp\>Ô*O—‚3^|ñrº;#AEX»=Ýï”Ø9#?/ç×Ú¡Žêì€ ¬™ãssõÅT–ñ¤RÑÍ'g¯§Oñ§ ZdÃ]¹ÙÇÏ'òö¬ý¥ÞæžÍ%±¦²³K¸ñ¸òuÞð|#ÐnþÝâg0=ÂÁ!ÿ\È sß#Àÿh„;A$c‰ëR>µ9ƒË7,A]»qŽ+¦†*6ù•ôg-L=IÛ•ØQ–8§hcû ñ‘U’NÏ¥+v,휞r)Jç-ŸÂ¼ÉK™ÜìŠåC¨¢“œR1yì*X¢*¹µzÊÑ¥ `þ¤Ó,ÕæEqÁa“]åŸÃA­½µ·„’K©<•k¦m‰ÆÜ㎆½L.u5G#oSŸÓ4‹$³{«§%ê¤arNz“è mi±iÖ©æªüÀç¶?Çüö­_ü%ñÒÒßZP·ˆ%·´ŒvŒ†ýà}Ü®3ê~µ'Ãÿ†¾*ñž±“¦é7 çN!WXø.HùrxÍ{xY§½wüO>¥DãÌÙ¡áHµ;±;¤P‚§Ì»› D£Œ ç¯=ºV¥Þ›fÚÖO1DÅÌÁ‹olŸ˜Ï5ÙÞx*-Ä~µ¸´è—2ZÜ]ÛH®·RÆå^@Ãøzãׯ°ê¾ü×¾'x¢ü5ðæ·«M‚––±—8-´;à|‰¸à³ d“Å}(Rú¯¶œ”ckÝÙi¿äxUëN8—I+˲Ôã~hÚ™Öáû-½ÅÙ$"A¼Yˆ`œœÆ¿B|7àëÍ~ïIź%Újí¥Ç6¡¤yÊ,០… ,@¦1¥‰ ÌÄ–¨¾ÿÁ>|'ð×]…¾-êrjZ¡Iiú%¸û-¹À3Ê™wäà àí'¯ ŸÂ¾]ÔÍ¡Ü"»«@|É‹ 3rFÎPyÂ×âœ}Ę,Öµ*=aNíÏUvú/-ú¿#ôÉñJs­‰ÒS²åì—?ËÔñÿ |)¶Óµ9îm4é­Úé¦u¸¶¹òÄlÊZ3·§yè~ëú¾¥)Ö/®îÖ+–ŒÜË/š<íª?壇nܹpp*ÕêÃà÷‹¼yq?ü$W²iZMô%ôý6™®#¼méÈ z’I¦è_ÎIÊÚY҇ÓKÑN–Ãì÷Rà<»vAåàü¹É%KòÏò®ÃÁr6á9î®dŽ${ˆ¡·á#ÞÁßy@Cr¼mç ¨~êÌF±Û¢2¤° Ü3ÉB[å'Ðã#®ø3ÁSiöŽÃV&9¥ ç•_1‘[$¸eÜåÁÎx' ˜J¤ä›»z¥äz4ðü°M+.æïÀOx/Å.WOÔD:Ÿ˜BÅo*(„°RÜÛÉQÁ †Qê¿Ø+{oå5¤rn‘\Ü#€q“Ò¼›Â?¢©3ˆ·"‘Kp=‡âýx¤ ¸â”0ìN>´« ­#wúÒäò;R•+þ¬wæ‚ã zg¦)ˆØì9ô©g‚㉭¯RRñîuD ÆrFÓ8猎hHJ9íE Ô}i­ÄMÈ'ß5zÆ?Z§l„Æ+wJ‚ÍíN_ÏóFÀ1´¦9ç®s]¸xsH´¹QjÆ×nÙ ‘]n¹ãÍk[º[›{k]-#³†Ù`Ò­–Ý#‰Sss¾ÝÌÇ–,Iä’rì´¦02Lõ •Æ6äÏàsøÔ§K¶Ð;×ÐR¥(%cÈœã'©ÐxC⟌ü?â»6¹syykKC}+L±(*…c÷F8^Ÿ®wtCÄ^%Ö_PŽI•™-X¢(“†PE ‘ŽàÕo†ÿ ¯5Ç]KPÌ6ÈsÊýþ‡ŠûSþ §û x3ö‹øÝ„|M¡_I izy»¼¸±aóU×ˉ߇_3å38#Žùû,¯.©ŽÅi-{µÛÏW¥ûžs¨ñx¸áhë)?’ó:ø%ìÍáýjþÿãŽtK;½#ÃÈÖ¶tÑG+³…X¢8’vîã’mÀô¯WÔþxQÒl5C±fÑk;–…[ìî0U‡PÜFEx¿ÅŸ‡6ö×׺ý¼ñu!2\ÜÆ¡ãP’ „<–;O¸Q^v',T-NVwü<ͨâyï%Ðà|QûOø*ã_—@³Ñ^ášçlrå°Û‹*dc,OÈH#8Æx®ËÂη0Hµ 2cX"v Ž]NC28ê1ÆkÀuÏ Ï6­iwl° U¢•FB„1<™ÈskÑþ|GoÃvÚ…ËLíp÷1“/’Ï¿rô‡ÍÈÁZå–¤ù{t7úÅ|KW>œðW†,lÇÚ­÷2ȃåyIÛߌð+Wâ>Ÿx<6Óè( ›<–Líß_˜.k™ðŒ5[5%kX£ÞÀ&#‡áÓ¥u“ê÷Rh²6¥"7 ñ¸àóÿ×®6š=m¹­j6³{ÉÅýÈžBóØÆïDÑ0©Ï·óª—óMp‹ö+£…º³’3ß§ò«šœvVªUåvh¸Ì#j±îÁ=ýkéob´o€áq÷N9õïÁ¯ë:Ó”thüŽ”Tš³+ÜêÌâHä·C+ã2…úëY—SO"yD±ò?.;šì»39G”eȶ ôà~•NC·?/'œ«dþ5ãU¨Ûwzœ!#º°ùç°*2@äñîiÇæÉ\Ʀ8¬lÕ ÷†àx' ¥V“øSFKgž´ç,H@íÐ2HäsìiAíŠ*Ë’=øÒ†ÝØ PL–‚‘œþfŸ°{P0ßÂ8§PH›Ò…P£–Š)·E-:Ú<°ÏòªŽáнe ãjßÒmUe@ì@ŽÇþ•‰§©ÖíÌÎSÍ›jRïœ(è •ëá,šg!»Xë4˜-Â~éÇÌrp fºMÂÿÚKÁ##’=ë’ÑÜ©Vb ë_ ¬’L\21¹·r+ëðãZIXù¬uIPƒ‘ÙøI˜Åc ÙA¾y厡‰Ig•ÎÔ@ä–!@îH'Šýzÿ‚Y~Ì0ý–þê~+ø™=Œ׋Y&³Òn’M:†0Þh`?z¸  ' ´A¯–¿à_³´¾3ø±yûFøŸGŠçIðÀ’ÓGŠ`ÏÔÝf\00Âû¹I•}1_¢ž0ñOö›y¢æ9!‰[ÙDƒv@cÆ2ïù~câoTue“á—»9>íj—Ë©ôœ‘ÆIf5ž®ü¾›7çp×õM;UŠÛÂ~ÕZ+‰÷G \G»ò[Œqœäf¶‹ð[Gm1¢ÕíVYžYdó®ÈviOÊJ¹Ï'ƒóô‹Lñ~‹¤Bšçˆå€%¤ežU@¾XRO€3Ÿþ½t¿ ¾"ø_â7‡çñ„öÝé¯f·1j6׋:\ÄÀ²²2¥HÁùI?½~A€P§QÔ®µgè8˜ÎQP¥²,ø[N´ÒÝ-çUKdP‘Çnj㧡ÏåùÁñÑm¬žãG?3Ç–)ZRxëÏbyúÓañ”ªj‹$S·–ZK` *ƒŒ‚8ç×úÖ‰¾$[M¡=”óÇlÑÊÞD,6œc~n¼cŽ+ЭZ“ Ô»w9aN~ÑY_¹sJñ»¤Á-§ˆï ·'3íS´Ïp«“׎x<×Í?´‡íeãûÉ<1àínkë8Y™ÞÀm FåP\ôÈçnr Æv×sqá¯üh–ãGñOÛ,tˆÌpÊÖþl|ílr\à¦sÇÊç ѶøuðKáÔ×zVŒ/¥÷³ÞÈ$HðJ®6©ã=3î+çñy¦O•§9~cÖÃá*×ÛåGœü7ø5ãY6­su“’‡•¶™%«ÎãóÁèž ø£èš„¾$˜jW·v[‰ÙM€ã Ÿ{ ê2Iác¶ø ¾*”›]I4Û{y k¼FFðzc>^þ¼×_ ø¿Að¬T¹™§”¶U”‘3ÏßçHv¯ X¼f6éIYôKc¾T(aÒÑß»=3±Çe§ÙÞ]hgÞË` !-ì?…G|óW[œqíNŽ1´òrzÓNÃM (U°ò2qÚ¦ŽÚá×rÄ1ƒŽqœThT àQßÖ®¥ôEÕUxëÈ«§½YrèV{[ˆpq‘ÅF “Œôõµoul¢–àAŸóÿÖ¬©Ñž\D›GP Î]JJ1º&»´†RRp4ï.BØ¥I „Ž74Gð¬”%-†åˆ~b~ZšÞ6?ZM—´UË]5Ž Jè§BNÆRª’gÍjÙFå†8æ‹}1Ùp¥_²ÓØ0ùz•ëС(³†­U#wÃ4®ˆè0Oõô7ìóðãþ¯xÀVú¥­‰ñ±g¦‹Ù× nf•"óƒÊ©`ǹ¼'Â~E­Ú½ÜDÆ ^ÅàÿYéš`ŸN“ì³B­"$râ@@:rìGCƒ_W„½„¹¥gfûÛCæ3{ñº¼o¯¡û«àï¾ý˜¾Ú|8ø%áYl`0°Äïþ‘{;ûéœòò ¸ðM«€®Âµý'M:~¶¿ÚÉgæÜ\o#7 ±Ü `’ßÃ×¼3þ EûRüMý¯> jÇÅM2¨x.â-.dn’MD}”4¹v-6àÌä\ºà± ©õÏø;ºJk^>×"ÒÖ{”ZOtæ,q0= œñ× ÎE,ær©„ÆÕ§ˆ—5[»õ»ïçsö ¹RÅ`©Ô¢­ iäy¯þh)iµ®²›µv^iHƒtcÔõpOÒ´·ðàï‡RËâôÏ é¢&:‡2«ÚǼGeÔÜ1Ѐ;±®/ö©ø·âíJçKo‡·PÚ^\JðÙʾby>Èæu˜)F•Rà1RAPÀx=wÀïØãàŒf°øßñ[¯x‚ÂÌ[Ç6¬c–4a³HÎÁ†bHÇl׌¨¦×¶“wOOëCÖ½šåZ_ÿü?ø‡’xE½¸Òâ&¥>˜bŠVÚ…Þw?QóÇ'­^ñ†tmNŽo Z‘ïFž<‘ŽÀ(ý zŸÃë}#GŒi¶6Ö6PDÞÚÞ iÙ@Ú°õ=ÞX•$ʼn ‘Ð׊¥Zоרë¦éËc̵Ý"]AWLXÚÒ&|f<{»Ç8Ï'¥yÏÅï[øp;m"{À$r*–Q×–n€ôô¯s—áÄú¤æE.O9&µíþi3ÙýŸYŽi6CFy<{×Ϻ8ìSp·ÍôçNƒR>›ÀúåÞ¦m4.w}¬ZáFaS’1ŸZµðÿà¿Æ{I}ªkˆt¹¢e¸·$†Sž=³ŽãÒ¾â³øOà¸mA¶ÓNI$Æ£ÓqúV}×ÃM&Þa8¶•÷2ŸÀ/ð¯FŽ[Š¡«kØ*f§£¹ä^ðâiñ¥•¥Ñ±HÚCÀl}âÀ ôÅuÞ°Õ¤ñ^†Œ%+Dã«RQM½Š_Ù̘8ÆFFj{[˜(¥t>$ðŽ­áËÓg©Zêpp2Í3B¾¿-%­¶V(Ì’Èç Š:’kÒ†ò\¨ãu· ´Ó®×^ML¶Ë Ž}if¸ŽÙUÄèÛØ…©7°æœn¼ÑÀüWT}œNvæÙvÂo †ÉëÏ5×xCX’Ø–6î!w~5ÃA;ƒ€Fµu^‰žò<¾9bpz8I¿h’8ñ0\ŽçìoüOâžâ?x›öky¥·½ÑšOi§í,ö·\ p¾S…s·,£€A/õÇŒ?gý'Å4‡Åºž³w¨CkpeƒN’õ„N¤ùlÀ`Ï Hë‚ ~eÁ ´?øsã£ñ‹E¶_ìÍ3ÃÓi\NÙM;Û˱Týí¢-ýÝé×véƒñ»V¸¸K‹¹Õnd"6ç€bGãÓ‘Í2x¡G‚âÚÔ°ŠÛJ^Ri6¼»ÛÎÝÔx2uêätêU}ÒôOOëÈë¼Kð‹Â?à··ñ߆-%š`ŽA¨@Žëoù«EFPo9àíàðp*FÕü%ànæÈÂpspë#,,I%DŸ•Uœ±Œ 3pÚàµÿPXøœiWúMÛ\<à9‰UG©n0K`ã<žÇ€²Ô¦ñ‡Åëýb Ú5˜º w äó¢Œ.•ÕÎ7}í‘…ëϾ.2Å{+7kH£M»ŸUøãEŠuY| ÷0Ïz±n{[gQ" À'çûã#'šÙ›Tðø»<¨÷Š»¤¶O½ˆìJó_ üTømà«ÃcámB´Ùœq¤¥†©8ùÈÆ0OQžq^…oñD¿³‚CeÏ(s"Œ>8lzóšìQ£Z’Sž¾hÚp–ˆë4O èEÕ­Ü9s–¹^8©5ý"ë@‹m'ËÁIÍy_‰þ)é~“í6ÚáŒÜÝïe¹`˜õJ[‹„è[€9­ï þÐû§{=zî#iBFì˜Á'É#Ûÿ×[SúŒ&©½žè™T¬ÝÖ§_hÒÃl'žÙ†å'•5Fç_±Ky¡ÙŸ£Œ‘Ÿ¯z­â/‹Ú¶K0ÈÒÉò„‰‚í>„ç“ô®Vñ½¬am¢ýäûŒb0O=ùç§9®zظÑÒåS¦ç¬‰¾#ße°ŠÎFÁUxÆgÿæ¼óÅ“\×íÖ]AíþÎÍsn8eWWh˜°T »æ Œg5©­jz“¹šêH¡ ÃÊi&ÌnÊ3÷³ƒÀçÒ¨Í¯ÛøŽÁô]BÎÞêé$¶µa0_ßZNä·—ó㓎FqšùŠ’©[ç4Õü´=88•¢Ñü°êirîéop(ÚQOÝz—6¸Žx#bã cÜ×i©øjÛNº1FeE+’É-ëƒÔtéÚ¹» W2Iј8¥'~´=zXnÖÀá†iöŽâ;Ó™†+šnåþ¤$Hø+!ã§4Ð9,yëJ­»¶)i݈³ir¸ú‘žõ¯¦ßO‚Xfeeû¥Iô¬v£€hXÜF¤'êk¯UŘ֦š±ßèÿ¼OafÚ}¥Ü8’խȹ±†ä$mÔ"ÊŒ#“HI.„»æžGÈaÆ/l`óÎw{s×xŸö†ñˆ¼ ¾mF´±q\†´ÒãY̱ÄÑ3_ J ¶XýNÉÝÚÞ‡‰^„ê$¢¬¯s Å7j Úlû a˜ÎàHöÍU³¹’TÈ#¤ÖEΧç’Kqε>ÊñA ¿ŒóX¼O5Fû›ªMBÇMb‡8œ× ü1Ò5;½J cÝ’ärë^y ÝG#© 0zú#ör‹Á¨Ú^øØOö¸D¸ "@Xpİ*w0ÉÆ~‡ÚÂT…*R¬Ó|©»-[·dyÎgjjË™Úïeê}ÑûxJ/ |ðþ«m.©§ bI§Ô#‰ãO6,€¸À •#ÚO!X9Éú3Âeoí[[9-íó„Cs#;Œ.Ý$@À$7ZóËR¯ZOcl"²K8’Ê uP–ë°lW;p7cמMã.¿w§›•Ó²µUŽ)¾dVL¸dmÉ?Â3ŒQ_˹®&¶kšÖÅN6s“vê®ïo‘úÞ•<+¨¤¯ÞÝ~g¶kž¨Oöaˆ¶‡Q÷ûa‡'î‘ØõêpIÍÒl.-Qc.HÈ-‘‚ …Æ'ŠÑÔÿhýçPMhb‹ûJÝÀ¼y€DŠí™Ðü­ü£8"¹rOÝ7úÔ#k³I¼}á»/MÏsL±Ëu§¹E%°Oxž§ÄúöúÄ;¨¢‹O—Q¹Pð<ŒBs ð[œœóŒgîó_5x«âG…ôßɧéFÆK{Ffº6öõÄŠ­–äÛµN{åºüµ§¬þÓZf•V œËÖ‚x;YW$àœdp;‘ZËÚйƒÆÆ=OTø½ã CXÓ£½ÒÑo^·–k”f–te$„à òF‘[ÃüoâO麵¥ê[êDlÔíæ_(HÙ*eˆe°†N0H8 ‚1ÏŒ^|iñm¾‚Úæ›§é·ðÀŒæxßpBÅŒl›°ÅA^[‚í®ém<_¨i«w¢Ü5ßö¢@–övÊò¤^S¿Ê®q¼¼.óƒJta*j mװ㈴¹£Ôú£áÜú­í‰ñv­â‹»"ž]Ê ’)™Sñ’¸Ú8ÏkŸøâOLÔ]õ5 ©mî ì“éZ³Ú+ùr:Ç=¼€H#%¤tÈŒŒ+(bMx'íñÆ1ü ƒá7½fàj·P1Õ4í ùbºòXòþU.ï 1Q½vÄT¨|Ñþ4Zü#°Ó4_˧5“]j:¤FK«7‘Þgyf”ïI# ±Ifr#‹áÈ……¡‚Áª­ÞMÙ'ùÿ‘³«WVÏD•ô=þßPñ'¯`™'º–hÕ %Œ’]—®Wœ¶9à\SáÓ¼Yá½öװĨòG$$`ue‘)GEnÿ2öà×…ëÞ!Ô¡·Óôk-FH.'”G ‹†ÆÛ›õÇs»qódwÚ7†î"ŠðI%¹*°>ø¥G™¶ày’gq éÖ¼Ià$›ž­³yb•¹ø-©]è’u¹%¿úÓÎîHϵ­Ûµ½±Ž&;O=:óšÝ¶µ·º³k–‘F{T9NFÎ}=8¬ýKOŽÖGƒvè”áåÉŒ¹ô¯ë ñ•HÝ£òº2ŒŸqËjRGyeWã¨ÈÍT[é- –Ø¥Yb­•ç 5ÒÝiZWÙž?2BÊÁ–4P@õÇ=¿Zçõ(íÑ•¢¼ÿYÀ¯o|ñ1§ nz´*ÆZ#4àçJ>l’üõÎ*ÄЇlù¦FG8 ©”œpyÍpIXéè7÷'±úRï)ÇÒž•ˆé…'%ºàf‡Á ŒsHByˆq•£Y3ïŠ üé|™„FcŸáœÑk†ƒ€ –‘X7JZ& ­:)Yd^ô”×Âàíü©©8½¼—Ê:žƒŠ—ûP“…`k-›?tbŸøʶUäG³‰}¯òyo¥M ñI5“ççîÖ¥ŠrN3œ÷­!^WÜR¤¬ušF¦ÊÀ+þïdk KrNJÈUGoºkç ÜJnž¦¾€øu-χ®,ÒQò ؤà#Ó×½}wÕ”ª´û3æ3ºiaôî}#ðÇ㇌|o§x*Å‚A$Ü5äÑ3oÝ‚6 Ã’ àõ’V½"ÏãõÜz4jZô‘$ÓZ$kê}Ê q“»qÆ;øG„þ!h±hVÚ¹c« ­ÊÂ.-T0æVÁQž¬¿t{q²ñ 7[vÓno³)Ë}¶ …‘€0NFÉ<ç#¿Žc²èƼåV“oun§Òásh}^<²Ñ${YøÏq6Ÿkkkgolcœ×$ðPMÙnzÐÅJoÐúoÅüö¿„4¨f†á+qºX$²ðçiÇ;±œ¡É8Ìñ§íªÁakðžÆy¢ûEˆžêIU‹M3º(Œà Šp 3šñí3í>$¸ûN¯(*͉Vï ‚ü`à`c8È-Ÿ£õÝf-ZK‹Ç±¹˜"Ä‹& (8ù¸Ý·°mµÆ°ªUR¨¯mއŒ©Z×üSÓ|Q«ÈQ+kÀ’…0^I#þïiç• œnÞõ9®ÃJ»MBKs¡èkÛŒÐyíµ<’q†, ’¿)¥|[‡DÑ!y¬ñ–¸uPþ{l€RTg<κo üKyâ¾Õt]~´‘ۉǚˆÛs`ü¯‚spG½aS=ìT1Qn×¹øÁ¶‚9#Šk ÊÞU׎F š¿¥ªMqçï•ÔŒbçcàzò•²Ù"ŽHç%‰ùŽ8«¶¤2þí±•sköêsnV”¿æçÈܳ³·º‰RêY·˜NÖKuÕSÛó¬ÝkÃÚqdŽêÞ\É’Dxb;tädsZnªðöe*pxÁéþx¥ÔuéÖXt»­1[§”So*9÷ëúWt©Ð•=zœ±e;œ½ß‡Á]Ñ\F  $žHªšSÚ¤k‰)éˆùÇ×úWiw ÍÈTüåzÉÇ¿^Kfü¨ž7l‘øã×L ÇD1s[œsÛÞº€Öl§S梚ÎâÄ‘ì'ûÝk¡Õ-m7¨Kg$\ñøY÷Œ)3ŒžŒÜØWŸW ËÖçd+)+™‘G(ÈHÙý6Šw‘sÖ8\\Uëx§f&F>ñ~¾”“E|ªM»“€wnqY{•õ/Ú'+féSŽO¦4R³eòIç.y¥,ê2c5“V)„C“úÒ›Æüã¾(##  ²žÿ¥$ÐjFJ~Baº¤Àô«ÐO‚Ù§(ÛsŒŠqŒ¥+ oAŒ¬v‘‘ïR[ ° ¹ÍléQZn[kø¼ÈÀ#€28íþEi\hZx°–a¶òG(˜8pr@àõãùóÅvÓÂ6¹ÔŒ']^Ö3ôhdgP# “_CüÑìôÏG}2~þbX3 `qïȯž,5ùìîàic…R6·Œ{Ïå^‰àÿŽ3é·Pi2[ ‰öoÃñ=1Ÿº:pkèòLV WšnÏcÄÍpØœEAþc2;º¶ û㑌úH­/ø¢þÞHí¼Qt¢(—@–prH.Ç’1ǶÖ¼fÚ[Eµºû:éw3¢ŒïU=:˜®çÂü=ã?Ýé(—fæŠxʶ8Èç¯Zõs ¿%Ï©ºm®mlÖ÷ïæ|Ìif¾ãîùž“saö©•ã&HŠƒ!'?Ý=3UMìòD,æ•‚6Ñ·¦>¼~•…¥ø’ûG»ƒK}­jco'̲8mÁsžŸ1ÀíŒUíRö3$Wn§,Á¸ž}óþx¯Æs<®¾WŽž¦ñüSØôa7^šœ6fÝLjmã…êÒ?, ³bÄç'’r8éÛ§¥_ÕßÄxÿ>´·zM•ÜO.—ñE˜SÉèO¸ü3V-nâŽØùï+±H‘·ý=+NÁ-¥cšÜírÎ'p9ê{WTiB«·CVtõG=uáû¹á‘ÔAwi"4¬zpµgÞøsX²1ÜK¶PʸòùÇ×¥vÓé`±Ž;H¼Ç‘ˆS.xÈÃ{Œ“ϱô¬ÙEÌp !³VÆ76ÂËÈÈäþ5L;õ.¹yÛØÜ++=œ„×fEV¼¶:Æñ¹‡*Pýk¤¹7N ¥¸Ü[• €? §we-Þ»NGj婇V²7…w}L$Ò!v?9 ËÏoË­G&ŠÅÙò@ìÝ«Y4ûۛ׃NI£Ffó€:“ŽÃÖ¬Z[˜ã3JÄ—b ÎsþsX,,d¬Ñ³¯(­Ì{-.-ÅÚÄväëW`Я` ™Y[‡NA«×V1Cu³z¿îçî’:qVì.ź,R;ƒ½I#×êækjXz+G§™ŒëԒЛÚ›noð¼~ô#ƒòñÇׯéP]Ä7<Ö¤¬J„*»gßËòü+U®.uH–-ÎÀ( ƒ§ÿ_ëN›Hgµ1‹|RÒ`sòkÓxtáh-Ãí§Íy=N#P-I* –ç#šª“2œ¨9îsW¼I%«Þ4V áS ¸ “ß›º8Ç.¼zWƒUµ6“=ŠjðL½e±òíŠîþ|DO jðÞÈ»ÕXn’F@Ç^8Ïùâ¼ÓÏÞ«0\Ía\Öø\u\4Ô¢õFœ,+ÁÆ[XÿÂ{á {NŽò×^µ†`C@·*¸“ºõ`ãŒØè¿Ðcº–2%ácfÈcžªAùÒ¾QÐõ©`q¹ÁõȯGðÄMVÍâ‚[”6ûþh¥û£8ö#±ë]ÙŽ ÄRU'îTJÉ­Ÿ©óÏ< 9aªßS×¥Õ&€\ÙÚièbª$bÛÓ T‚èàñ]L5§ð½—†õi7PXéÿd‚Fµq!A$²eˆq–ÌÎ21ÁÎ3\–ƒ¬Yk‘¥öšÑH²áY ù¢g#ø€Ï_ÌVòZi:~·kw®¥ÔÚtÆ×ÐXÌIaÎ]Q™X)*kH8=+â1ø V[[Ù׎û>wDÓ­=³Ç?,þ*Þi–øw¦øv-FŽÒ;m2ÙD—!L’¼ÎÑ¢™d;Ûæ#*ˆ “³'/M’Þxî t!ã%Î2Òwù}IÊ´|âUÕ¼i¦40h·ŠðÇ™r¦ñ žo'ËšeMÈ^0äÚ¥ãr@Á è|UÔü97Å?ÝøKÁK i#Y¸M7Ãп˜lP;íƒñl vBp+Ê«©s.¦ŽO™òÖ[/:ÙƒŽêᲤc®zŸ¯OÖ°þÙï•äù™P<é7ðÇ®G·øÖíΰ§Ãé¤_iÖVòšåÑò¤ ·…Þ2\6Ê€O$Ms—ÚÞŸ©N4]:K;9´0O(™àCÊ©*olc'hÏPJMh ¦­bÔZÏ!i'¬ØxüÜn Èäooƺ='Å’xa’ÎâÁnØ›ØãåeÈäŒa‰äu$ñ\¶“ªOaÖ×]œžxUI'Bd„Œò˜`9ÉÈ'å1ƒÓxB ìáÒ4ï Ý\ê­|fûh½Ý[Êò6gqlûúeHþ*ŽWr!Ŧ|E¤oÔfm6âQ·a*[®F0+#WÑ.c½òŒlqžù©¥-‰#©ìAÆ*kríJ¹El…sŸ­~7N¤9g¹ìÇš¼L—Òîl" g8♲Hœ¤ˆTúÜŸ[‚îÏäƒaS÷N?J¡s$r'˜ðœ‘ž•ŒèÓÀÍ#9?‰­×Ïq9#­j[¢ÛD#ÝÂðMQXNTš’W—æ/´0ÏùÔÒv*§½¹¥#1ó—9èZ::©´$CXä¾Ì·^™¬¨`x”.qÜóVôÅŽæÐJ'’0N󎘮úRÖÇ-Hû‡Ec=ŒVÑI3|áŒc‚[&7¢žû};U+‘Zу—ÀrC7ô?­W{@è#šêlʃ3HǧáùUØ´(§·Žp$$FêÚG ’0Täöã»é]—•M,s(Æ=J÷#)’ؚʾ¶’pò8íZŸd¤Ý"33¨Y ÂŽ{sUä³Q"ʶè:î_/³ŽsÔŒ¤­cXÉEîe¯•n»­åd%Hs÷x=G‘Œ…VºYPyªÑ…àŽŸ\{tŽ_ÞB7ÈeíUä²µtÚ±(ýšã”e±Ò¤®4A¿ÍVÏ÷OZ}”‹t ‘ã¬Û€a˜,qƒ·œ0êjK[äµ.]O#*ž•—´´½âù/£²Ò'†À$#h ŠoŠõ¡onËk:G&ÜõÇÓ•sIâ‹È,ÖÀ9Á;¹çó¬ëýNk•`òväÿ“]u1ñHîsÇ'SšE ^ö[‹–žI7¹?xúU2OñO~jK’8ãÒ‘!iWrœ{ŠùÙóNlö"”b5Nå Š–€v¦ÇlÁ¾u>ÜÔÈ‚2U—áÉ\žÍØ0Éè{WC¥ß4!Nþ¾õÎD _òέÅå㕯CUÒ[œµ©¹­Qøã *ò'óˆ@ÿ2)ûÀãƒëúsŠö½Æú.›4Æ öÛ#I5½ÕÀTpq¸ƒÇ9{s_%j³ÛÊ#PÙ%Wþ5%§Šï¢q5åԲȣÒ¹%~™"‚k¬œK Æ“~±aóµ[ø‡'ig òãph®OVøûàm¢†Õ·eÞ$Ï”cœïbÃ~~N¬z+åÙ>#j·[£žòGA€‘»eTÐÓÒ Å·.À´¸p ¯ –Y’¯3¼—DßùZÿ3G‚ÄI{Ï_#ÞüWñöóP—ÉÑô[X£UKtÆJ¨À @À=IÉ8'êiŸäÖ"ˆkò›‹•‰#ûJ0ÜÊŠ¨«ÏPãžö|â|K<ƒšsSiߟE»K‹ˆ è§>Xm»¾§šõ)¬ŽJŒmèDòÚÒ¢ÝÏ«4mvÞç/iu–!ùb¡íéס®Kâ·í9'†×ûÁZ´/|ÊY-X`\° í9gÇ89÷éƒó¯Šþ(xŸÅ•7MmM¼.Øeç¹ù?ýjÊîP/Æ8µsË“Лú‰ê×øo{zšÐÉêÆJuç{tÿ7Ôë5}œ,‹ÓžJ¦Tg¤cÞ»/|:Öü2ë£oÃ1ĨÀ©¿­ssi®‡a#>滫áªÓ¨Ô•)V§V)Å™ñ«)Ø€78i¯º[n;â¬ýšxåÝ•!yÃb‰ôÛˆ" 0(¥¸ôëÏè*çp’èo®B¶×‘‚†Ðç©%;T°DìBÊNî€{ÔRÝOnìÂ勞¹É5^ææñÈdœp>øü*ŒzÓ“5÷2-H»íºb¤%ä=‹åÅeÉâ‹ç AÚ1òǃQ¶¥t$«zà*–"Ÿ2he;XêímѤQ"Ï×fA5µ‰eÎ%rYŽpÇ€5ÈÙxÜÙ[,ri¡œ ƒï‘Ž~¹«–þ5ó—»,…zºç’;s^fu8燭{Øèu{X ûØ,€–ß•ìr0:wÝY²ªn%-]Nâ6ð1ííôªï≥v`"Ž6Á"8ñ´Œôç€sÍWMIVB¨FYÉ3K&îÀŸçÿÖÃzRØ#NijXšrc•ˆƒÆÝßùÕ?±Êò¿T¼ì9ÖÎ:œ©ÀçÐgù$xqx±díòöÜIîW¾•‹ä‘¢Œ¢µdhе«ÌòÆ Œ˜Ý°ØÀ9ǧ5‹}—™2yÜXƒüë ]$&;xÕ‰ûцa|c=óTæÓT'˜#BrX19‰5•Z\Ñ÷Q¥9´õf†Ñ1êp¶v†æ©\Ë%Êï´Œ>óc"º9¦´€Ú¹î2>cùV=Âjš‹²èòIÔnŽ2À÷úwæV¦ã¥õù´eÍ//3,C9“d„)=ÛŠ@¦0ñ¤lÌÃ)ãçŒ}?*дҵ»¹>ƪ±0!r0§®;sëùU‘á&Ö“Tñ”*àÐB ÇN‡ýsêrF„ít¾öt¹Å;\Ãrñ6NGlÓÖyœmÞÜ×O§xcÃOb÷rXß–Tâ9vÆ“ØÜ~½=È‹RÓ#_ÜÁ¥G ún,ÀR@ÏCéZÇ QFíþäG·¦¿Èçüɤ9.ÙlüªqV’üµ–K˜cø¤5vïG²<âTc†ÛÀè}Ï;gš¤t°qÝå“•QƒÒgRªBzÜa¼²Œ„Y7cŒÒ¡¸™æ9Hˆçø¸«F(ÔJ‘íÝÉgêßÒ«ÌÙmÖäò1òõ¬¦åmJŠî7ËXyiÇari¦\“8ìHëLù‘ʰ çÝiû×Ö±æih^ƒ¼Ù½Mo1úµ-¹¤Õ›ddbˆÕS¿Oj) ¨4-ÄÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ùÏÄZu®¯¥&·á{V/´25Ä·'zGX RÛב÷*?/ÊM&«áøHQ|a5¨‡rG—™[®à>ñyü3¤èZŽƒªÚYLË{î•s²Ð  LÍåmã ÙAf£ ñ”¢ß*<Q«Í(³ \ƒv°—vQKku ¹GQl豨*LѾ#Ú¥AP Œú~‘ukðÓì6¶—1›÷o-­‡›p˜s#í[lm—$†àp+Ï>,üa°ð&¹ÿ߆4ý"Æ-*—Qµ)w%ö8i|É+!H*ƒ $W#/íuªZ'Ù.G&WS£e‰M®ÿæ?TÕµ«1&›„³ù^lpÚ<ænv b¬H<‚C`AÆî…ñfÂmIíüCá׎æÝ–4ÚH%ŽNC+…`eœ€yÌœ‚Aη†¾;x âFž4/]Ûiú„p“jóÛÃ*ѼÅtyW1¶@89¤8$>%øMáIÕõÍ_½Ús ƒ!t˜3*ˆ60Oß|«lÛE~WË3 ª¯³ÄÁ®ÎÚ|™ô”jañkšŒ“òÿ€tÞ ñm•Ô±¼¢Ä-e‰¯e·;#Ü X€7ã#‘É®yoŒº x»â,Exˆ²F&kQûØ›ndPFr¥—<‘†ÀäwIøW©kºÝœZf‡©ØjvEmæ›RcÉÕˆgòÔ†)¸²œŒ¸‚NÏŒou=Ã1x«Á—°ê6Zœ±6§oèæ‹fc\(ÊÈ\ü¤òv†8FªqIŽT¦£n…ëoþ“OqÕ”ÖRHÂÞIm ’»ÿ |¸IÆ #æÉÓÁðWÀZDRZx¾é¡†;f­­¶E¸lï ³8©)5áüañ‡4ϵ[j0]é&3ì7·Ê²‘¸…Ì Êr œáÁlc‘U®þ<øõô‡Ö.tk™ qƒ$7)0 ÀíW‘[ƒ÷°Ä g©Zèq‹¶š W¡Ÿ.¿3Ûuÿ†Z5€} Á`Š%x2Ê9%\ Ú1ƒžFGE7Gø­á e“KÔ/¼é®ÝÀBò—b­¹™PžÄäòr õ>;Ä¿ø¹-$±ð¥˜…ãžv…B³!£`d ¸,3×éŠ>+ñðàûCiؼP‹dÑ0)~g íUÜÌs… 6qòó¥ U15£JœunËÕ‘WéÅÊ?¡Ð~Ѿ4ƒNñ=Æá¨á{Y®$¹c5¼nè¤a±3× w¯¸¼´ÒáóonV0_±–'?™üÍ`|@ø‘â GV608få’f_˜ Ÿ•3À뜜’}+š¸Õo‹ Ý‘†F`ß™&¿nÈrÜ6I‚5ímïK»ß}ì|†5ÕÇÖö’~ëÙv:;ÿÞå¾Ã$AÂ’¤öã½jxâúøwY¶½–{‹cñ¼Â>]ÀFÞÀ v ŽO5çÏt’ÈžŠ8¨K³gƒÓèW›ÄR•9j¤¬×©4èBœ”’Õ­ã?Ûâ7ˆu<3çzo€ußkújêú¯Ã¹o ɤjrÙÝb“¸H¹³.Ò£, Q‘¿7Íxw0Ëœ¡x/´µ_5ÐÞŽuÊågænhwÖ¶Ú¿öÝÜ¢6`c¦FØËmÉjþ$xá³mò»í»Î}0I5úWáþž5±òn[¸§h¯W»}ìÌq|IR¤Ü(+Gdí«ô]¾E?Œ_ï>'ø­üL4ìá2©qÇ—î¯<.ÞÑÀ§"·Œ±ynÙô¯Nø‡ðH|'ÖWÿ#›N½ž4h¡Œ¡Ê‘Ë3¸øî0pHÏ•ê‹oiªÝØ[\ùËo1A2© øäÏàyõ¯³¡ì)áà°í8YZÛ[¡å§)Íó«JúÜkÊI9ÏZ¹á:óVÕ’ S$©óŽ sž8â³Êdr{W¢| ¹¼Òç:†›n>Ð&þR¶cƒŸáã‘Ð÷Ï}©ÆU$íÑ7÷ ¼•*_ÛYÚxª_Gg£ÙOökxJÍû‚Àd ç-÷>؈À À¾º¶º´ÒÏ­„US¶å‚x€ã’}8Æ ¯¥ü_s©Gá(µÛÝÛXÿ`]%ÚÝG³|qù²ƒ4‹ò¶x ñœukóê—R¥åóóD¡“h;‰å;~ƒÜçæøc3Ž"eIAsß{êû›bpN3<¯¥¶üeøqñÕ´[èZ ¨Z©X¬ÅÈfòâÏ ¹n8<@Ý‘Œ’}GHø•¦6‹6…£jVÍz#Ûg&be+Ê £Fw(nlîR c5ñ¯©]1[h¦e†&ÈefÆsØãŸÓµ³à¯I£[Eew{q–ùcwœ°Ž>^Gãü)æ.Qš×r© 4t»óV·ÌÒŸÖ°ÔýÇuÙÿ™ö¶§à½3Äz”Qø×LŠßdRÏ&©d¢A$¤‰0@hˆ8)`AnG…ñà?öHføâ[/A+yök¡ç#gƒå°”ñó)9ÏE¯$ð?Ǩ¡lžc|ÓÀá^iмz0 A ×îŽzs^¹ k—6žÕÞýšÜ]ĤˆR•=H8=¸÷s©_0ÀUÃâ(.wÖªQo¥ŸGŸ™ãNš¥R3§SKú5·Þz¶±âÝkÁ¶Òé7z³,®b‰áº–O&D;‘cÃJ°ª¸|Ås”8ùz}_Ç·:ï„mt¿IÓkzrß,º=¿˜ð‡)›.~}ÊQX ¢2å[, šWºö‰­øF×Ä^¼-.©k"j0ܤrÛ„­‰Ýû¢cU&3ó£8âºéòköë§ØØµ¥ôÁåûMÎà«"[ew ,C)%°FFH"¿ «F|“šÞçÔ³Š÷]ôù]ÿ [¿iô+f‚êrÏp’‘\C±@‘Íg r VÆõÇ.ð­¿Çïù^ kacÛÉ º|>\Q¨ª—!ˆÁfÀùJà(Å/ˆÞ(ðn»yáïh¦ GO–Y$ŽX¨V$ƒ€pÇLqÇ—As«ø†âFÖõeHžDß-ä&FD7IÚ¬ÀO'ë²Ë¸;Œ\õ*% ]4¹“_×G­ô<ª™§²w‚iúÛåýh}á ø[Ö ð–§bÖŸiˆxC –’$â6R9 ßwŒçSã¯À= ßÂÑÏ'ãÒïRóP¼-nد@F0x8óoƒ¾(¹Òµ[­Bø«¨XÙ[[OöÀºÙ๠꫰¸È|…ØûNÐEvëà{oŽÚ¬cÅ£T½²‚K½ÔFLŠaY#ùb8NyfP2x ùxüªžKš(Õ®ÒVwŒ]ûí{_ævÑĈ~åï¦ç€x‹à¿ˆ¼A`ž(Óíáš?-·Mox’€à³*¶Ts’yÆx®nóá7‰¬¬´Å„’·%`›UrY€þô?‡¾xÁ^2“UÑ´K« û¡—WÑÅpòƒ‚¤à’¹Æ{á·´O‚Ð|F¹:M°žÚçS½”XXÍ®‚쑾ÑÚÁA$…ŒÆ=ìWÔ¥4¨¥Q[vœ_Ü›G=¢r›kÊéþ‡ÊúWëVs&±¬[Æ€6à’‚Åh<Œö÷ï]…ðòÚmnmílÒ ä,®ñK,HH`]¸èppT÷5õ¥ŸüÛ¿ڗ·^"½–ÜZÚî[ëó!¹ÃmXŠ» s‘µˆ]  “#)Âk[Ig¢M%”rE$©,åàw\`¼HcòäžG=y¯žÇñ†m‹á?gÑÓñÜô°ù$"—:æõ>^»ðE¤º¼šl qp¾Q‘$:@>r •|¯ð²‚Fp>a†äÉÔþXÚí’6[i·ÌØh¥ Ë/,[w^09¡éõ¥ß‡ìµ+;hôoizc³î¹hà@^F]’ 6 l’OU×›|Uð³ÞjpøwÄG}/‘d,qòPˆi©!OÝúóáxÃ9ÃÔRUœ»©k{zíò±¬ò<4£ez2ëú-‚^É-…äkdùr8R¸ èIÿ8©‡oÙùQ…es*‚A$ø=BzW¹x‡öfY/óZ¿Ó™Dðyr2Ž +÷“Ûå'¨ÍK¤~ÏÚtZ‘Ã/D7™7Û)V;•@ÊsÀ9¯¤¥â gN󢜻¦×áÿóç’JÊoæx—ü#:퇓-îšð‰*d“ÔgŸ¡çü+¥Òµ-CCÒd{+mÛŠ£OŠèH“w£r¤gœsÆE{}çƒü+%¹_Ä&¸Ó[È·†îï-¼¬`lÆqÏÝÎÆiØørV¼Îå¡H·´‰n¥Ñ;à`ÆyùGËÅ™qÅ|~XhÒQRÑõû» žJ£5)Êö8;=i|K¢O]ÖšIü».ž¬cˆe%6³gæä3dÎN@Ù–Ãééš>½¨YC` &_±Ú€ÐÆCmy2ŒƒÐ6HÏ–SW¢ðŽ•g¨jIÝÆÝC{‰T!|’Ûr7ËÀ<î<ä`z¦…àüOÕ “Äڥ͜W¾\*ºº6cŒ P¬mÈBÊ˵›jå€pŸ*¶HíþÏþO¸ùSWñÇ4?Ý_YØ2Ù‰³N²0\Œ@\ägæ{à Ä_d¶»’ãF²_>YKCÏò[ßx¨É#wÈ$ðkòžGiFö,Ä–cœg¶:±¦øwXÕ :N$ØÿXÑÆrI=;s_Ð’¯Vkktþº_Ìù¨aèÂWnä·ž"×u[öÕuÝV{û’»|ë‰I vQœíQŽp;VmÑ9bYÎX—'?v:7ÁŠZá0Øø#QóB0=«<ðžNj†±ð§ÆÚí££KöVxØaØ’0ÔñצMp*øtÕ8Î7íuºçjSÖrOÖÇ63[> ñ–«á«Ÿ&­ ²ï¥ñôí?ˆõúV¶“ðCÆZâ£iö¦MêLjÎ0zr ƒ×•Çàã[“ÛÁ=¾8¯–¬*R©:Wpmz?ò$Ö¾)|@ø€²Cw‘é¢Ýãˆ}¡¢Š=ɳáUJ§Ì¨9Çl“X–¿g’Cy«\ùÒÉåˆn;r{Œay?tq^ëð‹öSñÇÄ-)–Âm,í]¡•§R_¼JIär@SÓ rs¾"ü ñÇ€üGwáKû#r-,c»–òØ“—$a•òpÄ ÁHÇ>„Õà±¼3N·ÕhÖ‡2Õ¥d¾õ£;œ•©fÞÉUtß+{êÙáöÿ!½‰’ßD¹”̤Æöч‚v®îI#‘‘œu⛩~Ïþ)²·žÿTðÅí¥º´‰™žP’¬Š69ò×aù£Ï^ýzBѼIká­bÎéd‡íö“¬¶ër¹”e`}í^Á¡~×OŠ"º´øÉ¤I4‚á²»Ò"T Œ§d‘3æ]Ø ½ÃÎcŽÂ¨ÔÂPURÝ^Òù+jLj&ªÏ‘½´Óï>fð×ÀÛ©Yn¬¬5Ò•ÝNè €ØgÜØè€£@Èšõ«[JøoðüÜ]j9/öÉaÈÒÅs,r¢àG/˜6Äœ"xnÁî¾;xGÁÞ.ø{ñÁך$Qi–7ouobr¼ŒWÖß~/øwÆ^ÒÖÿÄöwoyŠÁö“ºP«µ1Úÿ(n@\±¾S‰°Š¾b\/;¤ú6½5¾©ëÙŽ•7Jµ£¤S·Öþ ÍñßQ–þM&‘jí+ºH$· µ°Ø$å G ðïøkYð†¸öz…Œ›At¶žâÎT“(ÌpÈÌc$#¥zGÆïˆÞ?ðŽ­iWiW­—O½Ñ/Ìhа3•|»£‘ ¡¾îŒîÝÆ¶»©xòõõo[Ä÷zÃ;IzÍ„–G—Íf fÈ Ãäªä6s†0øü>5œ¿tÖ‘Òëæ¿ËÉ«êyØéPœœ÷»•´–ãN¦×¬­YÝ­n¥LÁÃÃyÉU(2°<šú—Añ…O‚´ÍVÂÀëm~ÍusZ[IWÎÅ ù³üjÈAÎà¿#kz> xŽK(â‚ðÁ>Õ¸]ò*²õ@J Øa°’ƒ”9ƽ“öñîðÿ—ö¾$† {ËÔ‘ž(f S…8Óå9VQ•sæñžW[…XŠ:ê’W螺3£(ÄÂog=4ß[#è-ÀÿüIj÷"·¸Is=ÌNÒ”‡Àu‹ï%±¸c ‹Á1øY/´ÿÙË5–Ÿ#M­uZK(Áĉ4@7—…ˆf |À‡Û‘åÚÅ=>[Ù,¼/ª0·–Wû=Í´­nò@\íùr(Ú8ÜU°Ù]ÏÆHõÍáD^/ñ‰`µ—W† ¬+˜•†ôhç”JCÚIiO<`~M:#UBW»éÔû ucìÜ’Z¥mñ{Áïg.‹¯kâ)mÙ¼ˆ.œK%Ä&‹™ À †PNìðÿî¼;¯i^9ðÎ¥4º®…(ÓnmcUk{™Gîåù—Ÿ `òrG"¾'øyâ[]KW›W±× •­í–!qu¬Æai`‘]ÙŽSÍ*]ІV$¶ Ö½óÀßo®nM¦±{{bí·’‰C ªLß09$îÁÎMs×§SY&Ÿ£G] ʵ= õh|%ª®ƒ©ÀÆãO’fkqîŠ «€¬£,[©\úã<#ĺ¾‹¤^¶¡w6‘q:\„ˆ©c¡2"¸ p2QÉ,xÊèþÑ.õm^ è³YÁ ”4ñ†üüC$„³;’ˆÛ?{,sÁð/Dújhê÷rëWK,-F"góË a²8|½€«¥ƒ©Qs%§§ÞgW nÇÐ)ðêÿÁw\j³¥½Ö¡åÝ Œ²PÌ›sÊe™² \•ddsšßŠ<¥)𾕣}mÆ\Z%‹Ì¿Úr¤‘¬GF÷m8…'°88ÿþø¿Ã7ïvŒ Ë.-áH¶ç ˆÉ/“±‰+Îï}ÕGá?*øsà?]]|>Ôf“K6í™pñÇj©4“ÆÄl~Ð|á¸ÞU•Ží«¯€ÿ­W\²ž{{‹€–­gªP}’L D»¶±‹nr pHiß²€ö±âgÔòì>QQb*r©++nßK|÷ò>>Ôôˆ5+fŠx•¸ãy8=ûsŠÌƒO»¶q ‘Æ7>XÚJ0ôÚzqßÚ·P•bìÃæìqÉã ã¦qÎ3Þ«\„+’‘Ý€éÞ¿«9T¢¥k3ðøÎqvè2顚ÂkXT h6(vSÉ#@ãžùéÁà>!ð®·àýF}#ì3Ï ±ÄsyXÜ€pø ž§§¯ïèöÐÎc?.qŒÿŸç\‡ŒªÝȺ¬´a™¤äc ò#Ç'û˜ä uâ·µ­&æ7û=œk䑸 Œ| Ž@$dô¯ëÍb·üIµ ¹m„rqÆkæ])Ò©yHªB¤-XÛ‹‹I,d“h`8ÆWŽÇñ5‘áÝc_ð5äzÆ€­Õ±/ÊA1¾~òÿuÆ2<ãÛ– »ˆH Žþ/CV$ðµ¬èím–?2‘•n¹+®®U­8½Nx×7Ë-ŽÃá¯‰î¾ -ž‹£Ëq5ì†Ýl¤„@—ó ƒòÌrIèÀ÷ç¯Ô¼ñ'Kó7h—K´(˜Ü[>ÝÙÜ1Áç0Î{zò Zjš³­¡)·»OºÅHccœcÞ½À¿µŸíðƒÄצ‹âû¸î.-ž(¦µO´-¢g*aóÃíp«ÝŽ*ç_3ÃRµ8ÆItw޾ºþG,°øZõy¹š'øÁQÖâ ö±4„-bÜ6 B…9Evß¿hO?¼žøâ»¨aºK„ÀÆTù‰6y¯CÁ`Š ;Ey©}3O ÉlòYº±õï“ïïVm/­L» Ÿ7ÜU§|W-<§ícR¤T§›ßï:jbk4Ô4LÙðo‰|CázßWÒu)İ\$‘«ÜH²° ެF}#‚ô=§íñÑôhì,´- ÚtV×2 Fß+*ì-º<@Áç¯RkæÛ}U¬&KÝŠá7”å¦yþUëÚíawáo +Á~ ‹K¸¸óàÈq6kE8 ¸‚Xà€:f¹ó|´ã(á#Z~råIy½[ûŒiVÄB/–§*ô¿ÝØgÄM{Æï­µÇŽ!Õ'†9 §Ùˆ1Fè–§å üÇ'qnk­ø(÷ž,œë¾)¹û@¶”Cox¾lg%³±p[²ãZ—‰µ/ÜÏ©ê×S^^Ì÷È/3ıSêI8ÎNryÍ}û|ñÿô[{N[_²5ÚÅæÝ–eó2¢5ÀVcqÆ?å“rc‰ªSÂð¤ã.ZvQJÚ%ª÷WËï°²Ú3«›FÉË^»ú³ë/ÙïàäÚ»Çâ;sl·±«ÅlÞd‡‚„¶v`üÇr8ÇgÔ-¾|I°°²¼Õ´í+‹I™ç[»·dš"üo$l¸b¤„nþ#Ñüø!uá/[ßø÷ÅÛîÒÛjA¥ÆCg ͕嶀¤ûp{CÔu8ôØžÕõÙn"Ùþžv ¼áT/Þ$ç$ú­;T®ávìÏÕ¨áÔ¢“<ÓQð¤w#VÐ-VìÀÆmX7îÙ´¨iʤ0HÈé]׃~h—^þÎÕtëHdƒ¤Ð3 žSóc×9è:ˆu?…zÏBEev°I§ˆî"¹‰°Ð2°;ÀÈèq•ã5ë ¼%¨øgá„W~ Ó,õvÏO–á­ì.#|ËBÀ2rÒ8ùU˜œ2O+ÆR’µìûðµ!&ÚºîxÅOٻúÄRêm£YÇ#m·r–jΜ 89PNO¹ÝÉ?/|VøE¦Ê.ìtO'PŠ"Ðs˜çk>ÌÙÆ ÇCƒ_ µÏ ÜèÚN‹­ÚêZDÚäÏj°ÞCÚÉå;¤t/l@ •$€ ÝÏ€xÊ„:\ZêkQXéo¥é3Ϫ4ˆž@%tDÛ'ñ3çËÉ,Ø8=kÑÃÎ¥“}NZÑ‚•ŽÀøsĆ¥tUÞxÞåí£¸*ÁÃ+"”dA…bHBÆ,íùË ÞðΕá¦MKO‚Fž1åÚÝ\ϾHShÐüØl’KI.p=|;âW¿µŠ)åX¤|ÄT'1ð0ÓŽ{úõÎ{µø}ah|Û[ãu€Bʸrüòí‚?a_ž<ʶÈûWNí'©ÉÃ{¶ó”"' Lå@'ä¨,ÌxÇ$äÖ߀­ûQÝN‰ ã« N ô8ã‚{{f¹[ÃÍ¿‹o5»—’[CjÑ÷ȎØé×#ç äÛ'¥ð¯‡ïn%YçÓȶ‘ÂŽ¿+=Çþ zVË8¨ksšQQ„”‘êöv¶6—WWZFµçùH£o-cHÓ*꘮c2 ÅŽ%)ò… 3¾+øcÿô(lµ{ÛËU…–E{ –…Ñ—•dÇ AÆ G ¬ _QÒmÚP¡ Ôð:Ÿj“Qñ4×–ín÷7&Ö*9?JÖxº”gÎ*|g4ÎDø;¾Ó?³­¥½½ò-Ùg¾Ô®üÙçÈ +6`g€1Ô׆üTý>|S³Ô¯%Ðí­õ;ËyÕõ¿²(¸‘JHå/Ú;,…ãi h m¯|{8äÓg³ýáܬÐì3cøF{žÜŽ}:×=ލ·mlÉÉŠæŽps÷× çôüiåÙæaJ»¯J£ŒüŸcÓÄå˜J”:RŠî~uü]ÿ‚]~Ðÿ |ž5Ñ.ì¼Qfó•ht¸…Œ`ŒnJNr©#²“ÆHòÝSöIý¢4½.-[PøOª¤RËå"V—v2s±qõÇ呟Öÿ;ņk}v>HZ=ñZ³Æ@i7)æ³í¼2ÓáæO*Žq”¢ŸDÓ·Þ®~+ø‹ÂºÎ…©O£kÃwk)Žki£+$l=Gjä5k »pDqíù~eÙÓÛ«÷ âŸÀŸ…¿|/ªøgÄžÓâúíÆ¶ºlΓ22‡R줺†R8SŒmÏåçÄ؃ö¡ð½íÆ›«üñé Ó[¥þŸ£Ë-½Ñ;£u_HäÀà‚+õNãü»Š¡:u¹hÕ…´rZ÷q½—ÏÔøŒï†q™á*mÔ„º¤ôõµ÷>b¸Ó|ÉY¤Sóò1P§€-5©B6WqùÃr9ü+Ðu¿‡ú–“}%•å›Áq”–Þâ&ŽD#<`ÞŸðóöý¥œëçx®—@ø}ѶšÕÃ! "’‡àûàçñÍw:?ƒlź(Ž<¦s$̧W$nlƒÜf½ç 6¶ÄÍB=Û±äOR­NJ1r~Hó›_ DÛZâ&àåF8ãúUËí2âêSqy;Há®P(EÛõ5é:‡‚aÙÙÉeu$Š¥ ´ù»Hé°‚nTÈYpËÎNd~}MåM³šVIÄ&b²à‡á° Ç\ × ‹ÊñTܨVŒ’ìÿ3š«ÅÓ’U ×Èæüá)5ÍVÔ“,ŠŸ($òqÀ“Ï¾ÓøG©Ãðgìmmáï2ÂÒ47…ªî ²0¦A•e0È óŸ\W û5~Ç_.µ8ˆ05£zõN[]YÛþ 9þÚ~øâÈ´Q¦ÜZióBM¹Mۄĵ•@$ç#w# +Ò| q¦kºõÄtnn­ÉkH£¸]à£wÌHÀ?Ôöç†ðoÀ|PÑÇŠô{OÐîí!t›F{t¶"ÌÂ6b‘‚‡*:r~aREàë]& ýsOñ­þ” Í!Ôs#zà`åq¹Ü ÛÒ¿ÇÖÃ98j¥×MÑpP¬’“³ª>ð…üóøxYj¾U½ãÍ$DE'’ÒD½~2~é率k-ï„l®o4Ï´G<˜žóÌg†pÊÇŽçÇ;^ë6·k{¨x…n$³‘¶ÛMvûÃà ¸!xü+Ôm¼Kmªx2âÝV;f¸)ç1|£æÀ9ç< ò:WÎT¿{ÞÇÐS«’î3â˜Ó/~ßüM†ÒCug¦>£: (jJòC²¸¶RI1¨Œ¥³€Ý«äÿ‹÷>¸ý¡lÏ%¤aíãê³…»¸éÐÿJóÛ#öhÖ?hù´ø*ÞÆÛTÒ¼Øï¡š Ò\Û2í ͵ŽBmÜäµô&mµB«ïfÿ®çše²¿µ¦¾G¬¬SÇ%üÑD.cîçµcø—â/t O…¤‘ä%U"PXŽ„ã#Ž@ü{×ñ+â~´ÒµëËúµáš@ˆó. ¹Éæ?—å[¡a“ÇsZá¨àðÑ´]Ûërç+¹¯‘¤:vù&eˆŽHGBœ“¾gÞùKà(¼a}£Å}â‹&wVµŠF-*º ÝóävÈÆ’FNŠ“Ošèã©yGKþ(ýš¾|z°1|MðN«Í4S}˜jeÌVû‹ýüyˆp¾WæÈÛÍ|ã_ø!äß,gðÅ7‡Â×D ¢Ôí·ê0m$2ÄÀåÝÁWlùƒ´ûKÀúþ,ˆtíB+¸ìnãK‹AxÚ6°B¤nb¥`ð_©*Ev‡T½3Y]h7W/bdcö;•+ûÁ ÂÈFs€éî$kéòn'ϸ}5ƒ®ãtz¯TÒ~kSä³L·˜M}fšmuµŸ£j×G•ü ý–¼ðcÃZÂß‘Ÿª]TC·Tn’cµrÍ’û‰Èä*¨¯N¹øwúÃÿgjÒG 1€cŽg8_˜ §æÈ*2¹Éû½ë+ÅwϪݹ´Ã¦åV;¨‘Œm!Ýà’À¶Þ£?ž+cá÷Ž5i¦– Vñd€gcH@`y÷Çp:Zñ«Ö­‰¯,EY9NM¶Þ­·ÔJ„cIZ)Y%²9kŸèê-­]Orßg™‹E¨[cŒÿgŽþøªÓÃVóÁ®5¯kAæü›WB•$•ÀÇ÷¹'¥zµöñxCH *¬'ÓUÓ ´.±åc!*NFÒzcyíüGÞ±¥Y9¤Ñ¢­U­âÿt½v×Q’?À×ËÍ%Ü‘ÌGçF§a“ïSx—â]‹É.‹á„fîîØ´rM¨_­¬ÆÒrVF6ÕÉ\d“Ïè’xH³[ÈÓUÔ¶]E±âG@ˆ›·|ªŠ«Ÿ|n8\“Š¥£|)øoáÝ*îH|I¨+\•"MfûÍ1ÈTciUÜ É“Óã5ßáÞ«s9bq+Fxî­ð»áÇÄY ÇÄOÙÿÁ—±Ü$6BYLjvÌa @Ü~›¸¯"ý¤?àžÿ¼y§ßjþ‚=U–ßu´&öSlùJ–ÆcÎFŸ§/¾Û¢/ö7Žl—Q–_ôK5™Þ'B2¤œó·¹ë\/ÄEðD¿³ïˆü+âÍùuæxÿ±î-îÞ[©.#‚Ý|èÝ]PM2‡^C) tÅwЯ‰œáMÔv[+¶—¢¹5©Ð• MÁ6Öº+¿™ñìûûCrú–»ñC^Iî-ï.í4øtÛ’#4rˆw7Ë»;ó…+ƒÁÁÏvøx£Àš4¿ ÿ°ìÖóMûl÷^EX FJ\$X\ùjÑ:3pSË*JãŒk„Z_…|2,µ¹ÏÚt¸ wÂ1nu ™e%äbÛ¸Ý&y9Ù…Éê>lðŠþ'þÏ?î|áÿi6×/./<0º„ ¿ýØ“EGV/0¬îˆW Ì0>ø¯bžæ^Ö1“ç…š_Ì–éyõ^Œó£(à#ËîËFû7³~]©õ?‰:¾µn4}[φæíã[©6DZãfB©W'<í89ÀÔî­õ6Ôô½6K¢—Ëö––,Ćáu9õ,IœpU~jøñÄ<á_„^ÒüCe{wâ¯ØÚF±H°[!á˜rÈ'h#uÛ—ÈP@c·Úüâ]FãAþËŸAx%Pßé³_"Å„.T°có‘ˆ÷H¨jókª˜<%oŠîÞWµþôþãÒ§âj5}­ù®Ö²]^ÂÊKBX*8àc ÿ!ŒïþÏ> ø£}—ÄqïûEÏ›w5ýÊ)\Œy1Șç½tž2ÕbÒõ9nôö–Vû;ʲÄY sŒŽüƒŽIü«Í®|Muâ½D¦¥z¦Kw.é%ÁP/¸?#ž:ñ¸ö¢•ERñæd{9s]$uW^øE?Œ#¾³(¿òÌ"²¬s0`—’:¤Q[þ+ø¿àoD4=^öÊ ^‰me2£¬cù?»òžxÇ=0Hño‰6z•¯Ùµ[k9›N[EŠXà™`g•ƒºÌ—Äk¹±‘Fðj§À_xÃâuÇ‹SÄ2Oiq¦­§‘n]ü˜ˆ‘|„`¬åˆŒ IúWµBŒ]­¿3‚´œ*;¯ò=OÀß>øŠËSñ>…âˆ54ëi¦9HÆ 1Bxo·lu­‹xtXI¨E~—2¼ÃH*KãåÆ*ùêóà5æ‡e,ßµô¸³»{ˆ¯l.P6ÅÀ˺¦Òê¨éÃÃy;H¯>½²øûáým¢Öçg,mqm·zHmó0A*mݘ– Ü×'*©ŠÄóÆq²µ¯½º¯ø'^T¹ewÛðùåy®éW2Ýëz~«¨ÝF&ÈÙ!xÓv £¡Î{ƒÞµ´MSìðKâ JyàM£ìñLΑ¨,ùF ±b œzcšò¿…kñçÄ /‹4ϵYÇæIg M²‘9@…äWpP¸9e~Bío]‹D¯+] 7´ŸÊ»k‹a¹'\È©’Û¸ÜÌT¦ 5ˉË0ôgÍmVº=>ã¿ ‹­4“v^{—F³w¬˜u]ÊIà¹b›i™‹¡9OŒõý è´Åž!Ónt™õ«²ÞF©¨M{fÂf@w>K©žC®ÂrÙ%‰jâõ=OÅÚÆ»/‡ôía4«h¢V:„r6é”gœŽ r¼ä0ãºø{ðëKÖü?w¤%óOyv$I—Vº–s4GpUmìØlmì@9$ó:~­¹Òo¡¾"J®üº.¦ß†cq¥Ûø3ûQ5Ó®õôÑ w>R#EŽ@áWqÇ0eb=ñàø¶o^Øø>ßSKÇ´Y-£µW•Ÿia UG”±b¥²F:„ð>£ákéeÖ¯üä3ô]!™¥rI,]ÜŠA€rH9ÐñoÄÁ¦i?Ù1xKRÔÖ;•†òÖÒÍ¥ Û02§r°Ú2å»rG] “„ïkžL¢œ“Z£å/ø¿ÆZ‡ˆBiëåßê,‚òŒ†pQ"EåCd/Êw3Œô¯³> x¶çÄú ‹j6’ió[[!–)b³…Q¹ñ¸í‰I$ W[ü-ðß‹þ/ÿÂO¨Ùû.¡$w#My¢Úù=±Š©?‡e­•¥¿–ûDblÂ?â$ú‘Oz¹”ùcc’”’‹‹'ñÝËÚ-'ŽW™×wËß<CÏÐô®;MÕ5Á∣³ÔüÕ¸”‰#œ©ÜsÐ:žŸáGÅ_ŠzF‰ Ý.ƒ$‹Ú\}”§‘-µÆXËR#a€ì_…@[ ®á¯Ä_i-³Õµ«KEÓåØåaŒÖ96° ”WRŠÝrT‘ÃY©Æ2OÌìÃá§,3gÐwKr •è§€qú×#¨ÏcopcÕßÊW/ÏT,À8Ï@9N:u¾•¨ÚêVOy§OŠGÈáò²26‘þy®GWÒ/îžy¤¹u)vL’Çn:wùçµk‘•DÎwN^ÏÌÏÖ<3cÜÏ¥ÆdžDSÄ)è8ÇðàWœ}j‡ŽþAãO\júdv–Ú¼–oo+m¥e;€ ´¬„8u‚ àÖ÷‡µ­:+(-¯µAo4.|—h؉\sÉÛ´à§Žõ»áÍcÁÖ¾#]>êÚi.'”VØâ'f$+AÎ@cî3ï]ô$ãY5ÐÆ1MYõGŠÉñx§NÖôx:æÖãM¼{Im.N*€ñܤ›Bɇ”a¸Ù Ã埊¿¬îuÉôN²ƒÄpˉ ·‘ë3î“æÚŒŒAfE,§’Û´ÿÁkßø–ü0¶µ²ñE…›ÛK©=ŠÍÄ+#k:¡ °,¤cfܪpÊß3|YÓ~&·ÂíJ?X€Ú}ÚÛ.§‰¶ûpòÁfŠ6ghÓÍ2*îe,ª­È"½¬-iÓ¯´škäÿȵ4é:SWÓð?1þ)üVý |-ñ ø·â–¦Ú‡†%—F†ûLÔLo,1HÃæ– ¯q¹¹29,Ão'hÇӲŠώ> —Ázωk1Iom¨,Ó¼³ÞÙŒyà,-+”hâݱÞCÆfìyOí³ð«Hºµ´øÙá˜-àŽñã°×![œÊ÷Û]–`»B"©$:36<Å'Å~üGÔ~ø¾ÇZ¶¼+²m²Úý»ì©uÆè^RFÀTg'¦ãûÍl§-âÎÕãÔJ餕¦¾$ý]þôÏÍéã±™.tÜÛqê®õ‹Ùú¥ù¦ž ¿ñ–“ñËAñµjÍ«jÃI³ßh­äU&äJìc!•‚œ.6’_k£éÿø?À nnå‹WÒõ %²’K¨.|¥1¸xÙ!@ûà`r€ãäO\éô+‰>ÔÚk}B'G|Q æ0¨íû³2ÆdPϲ2ë"2àí{Š>/ðÆŸw}}ã4ûEÔ†{ËÈüÙ„ò´‚9f;AV\Û£`B®ÝÇó–i•W­?e~Y+©/;Ÿ«`1Ô¡7ªÝ3êˆþ?ðì·ú~¡©ê’y—2\¥ÆŸt¦[’c]ÇɹÝòç' ?1R–]üm¾Ô5Ñ<'a »[©{8´¹¦¸Ônq–‡Ìhˆf3µÃ9A¶¼OGø†ž-øŸu­´÷ŧF«aË2 cR8‹%$Ú ¸c³pAÈSéþø•u§–×Z¼V°,+k‘$›¶yª£‘‚¤(ÜAÎR<øätð±JI=>Hô?µ%UÞÞ~G¯ø/Çzn¹áëŸj@·ŽÜ§îu)–)ÄŒ@Ød]Ãc…wVË€I\ÍÑͧx#ìvþ$°±´µÓnË:]Ù™d#<3.àÑžŸ/¯,ÒĺÍíÔZv§=s?˜¯ Û”e£c Y#nåM»¢çœ“§âøJ.ôÏì8£žöÞ[XbbW-ÁÜ9<¸a^e–ÆWtß.Þ–ÿ?3ÖÀcæšU2óïþ^FßÅŸ ë>$Ñg]P{KT1‚†p@ë÷ǵy÷ƒ>ø«AÓoo ÕÕÛ5Òù²DÛˆ;F6¸!H*Àn€ ”júBçÂzLÑ¥¹Q+&r§© ÷ý9®;]ðü÷WØh¶Ò‰ Œíùv’pOrp9ÏÓ5x*ÎJ‘vN' ¦x&âþÆ?^y¶76’‰o¥“|Ók~ÐôèmàÑ´ˆ¯ì¯-˜ÌÍ$²ÅtÐÆW;ã’Y2¨B":ÞmtOG‹N²‹G‚Kë–hÔïŠò0ë·© G\ƒœç½x§Ä‰öÉ®jö62éË}§Ooigg.©4,ïw*Äë¿çùÈÁN8÷ib£R{eJS”µe¯‡¿ðŠøwÄ÷Ïà«K; ÕnYmSËHÖ+pZ_5䕎\¼™.H#Aªþ,Ñt¯ÚÅ–£&½=Óè÷¦2ïQAsø^Y$Š6ŒUDK¸«È[„Úx [Á£ê isgµÆ§8f’Êy–›ü¹-Æ0ŒÌYP¼Y€À%qéúf‡¤xãRiЗm*ò(ÒÊÞIÇ¿(²FÞÌDÑ¡<¨ÌÌ7à”ªæ‡5âìÙ»‡³Z½H|Wð7Yðî‹i¬ø3ÅwWö‹>©e­¸dJec1.I ‚ Áä“\Wƒ¯5Ý?âÅ­õÚš¥Ÿ—˜V-ºW•¥(0òÞB”]‹*Š[é‡÷W–ž[Ë8÷Ë}ˆ"¸—Î]»Š”=Am„ øÁažœŽGâßý*òóN¾ÑâkHí1$nNóG†6?6ömÌbÇ8]ÀÄrËA½àÔu#ͱ•û?øÏÄÇXצ‚iäÔµû­yp²JU$emÀ óù¿.3ß­{‡ü£x&¹‚d³3sϨü¿Jóƒþ'Ò¼yi¨dÚÞ¦á{¥¤±ªÞH2¡Üí' ä’ ý V×ÄÚ"rVÓk6šÍãx§Q–fYÅ·–»Z$UùK³;8d9$(àVÅ—‹¼WâOˆ#ñEœú:ßNÐÁ;ŒÊ˜ÌHP~á 7çÃ:JP“\ÇkÁS•”=YŸã/ ê>*ñÕÔ¶Ö÷6ð^Êc’éïc’+”Y2a\äáH?0œñÍüG°_è1YêŽ.¦Y|«±bX°@Ú2Cœü¹êç×Ìñ]=ÐÓæBcå\ûž6îbé‚pqÐãÐdhž±ñlrß|E¾X,eY‹DÆâ_$ _0€J¨máCÀ £ šRŒ¤›Ù}çS“Xw´5¾^êr|+¶?oÏä¨ISòÇŒ¨9äc®¦ÄIâÔüû:¡k„ÜñÄò:…ÆsÁn}|·NðŽ³¥xÃJ±ø¨]+xàI'”´^@VVÈèÅ€ëëúúôEГì6èp˜™qÂŽµ’súÅ®sÆÞÅi±Ì§„¯-õ;ø®na1ÊÞhÚ5$äŒàd`Ž~^Ù­hv-û­ž9VX‰‚äc×½w–‹45ü–ÙXãØ«9Ëm^OO¯Ò¸ »ÝfÏcáéðÍi4fkk˜¼ø÷(•ºäd+tSƒëŸFŒæ§Ny(FîÇ¢ø«Á×ZÄ2xµuÅ’Ü¡ûAŽç)‚Ü9 ޹ÎOµ|uûOEqkâÑg°"¶½ÓÖwW»Ì12FÑ${ñ<´;ˆ N§oÑzׯÅðÖ;xÓU±ðôPLÑÙZ_\¦û²QH¹}˜,B`÷ŒŸ›<±ªüRñÄoi7wž}E­t'¾¸K–ºXL‘ÉwQ¨Š(ƒ—Û¸™Yciƒ_~…FœšÞß{ìº“Š”cøeæx‡Œ<;¤|Iø?'‡¼U§ÚÚÜÅiyl’Å¢­ÂGFJÜ\<(Iuw!©+ˆØc†žÿ¾ø£á‡ˆÛ@ñv˜öï“ÏÛt‚FO:<ýä%„uW뉣Ö|K§Íð¢õ´}£ºk‹»ÉÖÒ7 á–D‘ŠÂ±®íî@,ª> ý¼¾ øŠÇZÒ~.éºv¥yáÝkÃzsE{'ï`´•"ŠÛ`u]Š¬Ñ‰$±‘%«õï ³Š¿[ž£²ž©?æ]¼Úü…ã 5J㫎—]ŸOÀµûüEðN£ðÿÄÿ Ùn^ké À;1½’>:¸ «ž‡¨_3ÙS¿,¶=E9-QÖjÃ< qvùž&k!çÉ8ú“…ýµh“¿Ûç_1b?¿Œü©Üî'œpkÍ|sãßøBÞ'Ðï7»ïYòícbÙ’RÄ@F;‘phÔ~*kš«o¨izúq7R|­3Û¼?a.µ¤Ë¬jùG”hÞÝ•I ¸ ‘‰$üÀ`“ÀÍAuð‹Â,ºOx§Ã6×7–ÑyVÌðàÄ ±ÈÇûç9?—…!Ci*ɪ٬ž[1ÛŸà(ßu²yÈÎFJÚ×¼-7š©¸w>µ­,?/ºþf«);Ÿ6~жZÝ„.ÒgŽW¼»[ —H†a÷—7Ê’Hà€)š'†¯“D¶Ò´¹§’pÊ—ßéŽTòwc$pp >ùÅzž­¦éÓhøW]´Š{kÌÆ¶Å3¸‘€€¤œc¥ áҼͱT<3Lň뵎zã `÷ô¢­U¨Åí¹têò&ßÈáõæð4FÐÞ [¥š[–ƒ|Š”±ciç¦I¤øñ³Å¾ ø©xFÍîntÐmï4Í@Û³,6͘Jî ²FŒÄK2ùd²’4u}55­RI>úúyLTC‘³>üð=Íc|BøãÝjMIðÜQj·· sö›k똒(b·òZKJɰ6R7¼™$aROvTœýœ¾DJœR‘Ã|RøÙñ ÄZ­óI§I´±>šâ9mÚâ2©!8ÜZDpàä€2©ÛNîSAÕ~ßâY|GýÅí©¾·¾XþÏ0™¼‰bŒE!Q¶9$ €[“†Ár2ÜõƬøvæúßÄÚlÖš¶™§1»²ÔíÝ{¤@ nRž[. “(Ítž ŠöçÇÖWé†tŽÂgh„{ÔŽ±,ÓmbX®å_—sW§%Pz-ŽÊ4ãÊ”£å»’ÏáÖ»â:àËcpк«¨ˆª1È T9çƒÐ¶Bh—á½.Â×@ÐbŽïSœ´væ4(ƒ“4ŒÎPž0#9è~ûÃ_Û>]"k—K–@Í, ¼IËç ¤aO#p8 VYÑ|O>¹GH’H¤‘ šF#ȳ1Ücq•^°æši÷:)Ê 5{nk®•¬Þ[¤âÉPÙï‰í$ ¬…U¸É#æ<ŽÄŒó\§Æ-_Ä‘ø‡DÓü!Ú û«ôºùãŽÕ¤‹Ì—f0edT î@Œn+÷ÈnŽMNu¶ŠÃÂóEwòÆouÛ¹URC”ÜcPs´™ã @ɇSþ͸’æÿL¶åà!'µˆ*¹sİà Ùë‚qß:R©SæßÈÅÓö±JOBׄ¼Fm’ßÂvšò¥Ìv¤[Ç `ˆÔ‘“œŒ =lW¤[êRÛÉŸÚüÁå³—$c¯OÒ¼{Ã:dÚÄ^"Õ7i‘ *„'Ž {õã=+´ð÷Žà²I åŽã"ýè“;Xÿ>ƒþu­Ÿ7´hntœ}šgo¬xšHt?ìÈ&‘®¯—1”`DgœŽœÿ|סéGÂ×7zÏ‹5¥c9–W "^¬ÎÄ zòÇ$u¨îücqkk%Þ….ŸæO óLŠ\±|c=ÆÑ‘Ÿñà>,^k±–ÄÜǪ^É&§hÊÅ]#T`¯Ï1ï e—=3]:rÅb6¹Ë­O AÍ+´sšâx?ã¾·}âËc©Go¨²xfÖKÆ• ²hc HqÖàÄØ yecåT–çü[âX¼;à]^×â‘­\©´Ó“§È¿8TŽÐ›Q‡˜WªÛøCÂ^ÐoL´»²]@]Á0>kª7îÐg Œbr0 p~8Òo'מÿPÒì&´GÊF¶ Ó…Æ€1 •œ½“ÙŽ éãcËQò+Yt[}Ç“…ÄÔž·yÞìð=_ö·Õ5OZÔÔ¬´yFžÖwÚˆ]NRñ) Ûüèцf !(C¸²ƒÇÜëŸ~xXê¶éz¤’Û ë;åItÆIpÛ% ¢yC;Ž•P½Ç^øá¿i:õ­¼‰£¾©¬Ã¨YÜj:’-¤9ÄSMå³ Ä.v’Wfߘ7û\kÞ ðF£¥é'‡,î5m>ÏÍŠ[èÛì·¶Ë–âM¹¥X£8Ë® `3ýúx„ÚåÞúk÷3Ê:œÎRkCà_Ûᯇ>|RÕ4iòÙè¶VÚŸ†ãk3ˆku ~„G/šƒ©UA$ƒ[Ÿ°Ö¯¢¯íá›_MÔ.ç»sŠlfEXo$B±4›Ùw ,Tá¿‹”n“öÓ¾µñFƒà-bÒÚæ{‹Íö+éîl´SF#†5Ü@U7×>|#á·Š¼KàoZjÖnluéf°½¶˜$‘`cgœg>\ŠþŽÉ§ˆÏ¸Fªí*”Ü/~ªñ»õëêÏÍñÊŽ_œ¹ÓWQ’•¼ž§éWƒþM¤þÔ^šëU…Dú¢Mi©b7Ès‘€€gÔd2ÿ ôׯ¯pü7ñµ×„F„ãN°ÑcÕeÔFÛu3LшÀÊ’qûÃê|‹à?Úáí¡ÿß‚|Gy?ƒüxð)¿½Ô§E´Õu!ìÏžca»hÝŒž—ÆW"ÔõUðŸÅ ©¾Õ¤Éö9<й¤|;·$¸8 í°1Í<ç9>?*Å{,U7yõ·UÝ©e¹†Gž„“MýÚlüϪ~|D5ð¬>1Ñ4Ë…“í.ÿ`D òc·åã’g<únKªh¿­Î¹a š}å¦Û‹dŽ5ŽâHË:*É2=êÙV#îòà|¶Ò|9ák„}fÐÃ¥YC /d¨Šc26ÅFÜÛ˜”sŒ† ß2ƒ]$z®‰áÝRH´û-ÒÎ<û¤ž\(‰c&pI Ëm1 p 5óõª*7oFÏzšuìq?¼3aâ½b’æ8ìŠyÒIä‰d!#`Xu;O<ƒÐÁàÛÄ+Ö¬î.íX¥–7—bùirl¹SƒÛ'ŽñjwÚçŠDé-œ%ƒ}‹P‰ÀEGÅ’ràœ¶0ØÈàVׇ¼7¢xc~¯qâ$f§’‹KŒŒã$|¤tWܑ̪´·èw¸ÅlÏK‚ÖÞËOX£³ŽþídL’3޼}9úTS_h²Ìeµ†Ò7mÉóã­TÒ¡‡Ä|wvº´Í©¿,¦4+†?(n9ê2}2EP¼ÓlÅ¡{V YˆóVcGê®va°ôçÚÔàÄU”ZåzÞ#Õ£¬‹4´xc¿*A=†~•á_üQ?„-x{K¾[|ZÁ}¥ÈÑKo’"«I)1”ÁÞ Ü0;Ÿ¬¯žÿSÛ%´Ïå»íç§×5ñ÷ìÁðkVC¯øŽÒ’ñšDŠæÉÁEÞ» È£‘(“óµ<§YC¥#NûD1©’VlîOµÄ*3¯Ë™EOSšÁo­¦¿q™õÚ6¥IûÉ2ÈÄm ŒIô5 ÑÓô # 5*&Û¶Þ‡5oðÏFÒdûEÙ†&*FØÆäÿã¾õÎë~Ó’õì­/"·‡ÌRž\BO0»ÑœñL±ã¦7¼SâRKT•÷|¨<“Ðð3þ{W4z¥Ë±3ÜDÑ)o")Ȥs€Ù@ôÿõ×'²‹©¢be¤Ý‘Å|fð%·ü$GÆö+×-¬#´·Ôá·iì¦^ch‘ÕJɺEó'*ÛOš[ü"ŽÛx¯H°–R¨Žhî"(m‚Iêÿ#` Óp8Í{†¡àwSº{Ølµ ƒ*•ºß¹Ùqó³¶8ÃdgåxVM&åmMµ’[È‹¾yŸ!vaxØ8Úy>˜ë]sUiÓj[t/‹„l õê`éšÄšf–‘ßêq£H›ßÍ8É'hU ×ë׎N)Ú½÷õÉbðÝ„–£Kº¶Þ_ݹŠ)#û¢8Ý•šxÈLRÏÌÃ9ßðƒhVúwŸ­ˆüùq nÑ—ñÁF<òxžò ŸxŸÁšÕݾ•à¯ÏyŽ~Ýmxá¥d“aHË F*Û }ÖÜ pÒ¥*®ðüNè×¢¥ª»;i¼M¦Yyß &Ö¬¡ÖN7“ZÛ"Í<ìIТ’Ro•qŽõÙü=ðmîµáïìèd”<ŠFºVÜÙ'òÇž‡œ×àˆŸõ=6ãJÖt­;OþÑœýšmÉáX!ŒÅ¥w-:nF3™>lž0µîÞ–ÃÃ>˜Y1ynŸÌy$OŸ}ÒrIn¹ç§jÊxxP®¥{üô*x‰b"Õ­ùœÄ? Éœ<ûÂê¥ÈÎXrF0É=Þ z÷K·°— tÍqyyIn;ÇluÎ+†øç«xº/Ùéo›q%I[a¦—˜>#`2’ö wAŠûH‰ä—TpÖ—R7ž-ܾðÜ‘º0Ì;§‚£] Ið6“ªYÜÜÚI¦jn÷W²Ûi£Ì¸—Ë!ÙÚ0IqÆÐ6®q÷Þža†æöuu™Åõjê7‚÷Qoâ¯ÃMãL¹µ€ÚÍÀ’\,K¯+å|Ü#†*O HÉ5ó¿Æy> |W¶]_ N©lejÉq*í XK³w(a´: °ËìÞø©áéã¶ðòéóÁg=‚­¨•hVl„q»*FáÆ;{ÖÆn¥ð‹Ká¿ hí€VY¤vØA*’ _áÄ~bqÉZõ°õj+uØà­*lù/öŒýž|aâ_ƒ–:W„4Iç»ðÆ¥-úHbE-ay,®ÌÃ|«-º€Š89äžȾ"ðyÓ5ù®fI­õK&0K À«ÆÈYYsœ‚¬g¨ ×Þ_5?Šž ”k±Bæêi^ÎÕ¯æ,dÀØ®7ª©ݦFšóÚ+áf—âÿÙÖŒïáûk?ø{YH|e£¬B{IXª]2c,Âi#ŒÉÇ$Çæ_ÛxŠ¥„•,«ÂOÝ’û-ô}Ó{[fÏ„Îò¯l§‹¢ß4V«ºVZyØù³B×¢Wˆ°šÙÃeÁžFùâ¿@þ|xÒ~:üÒüe­”¶ñv”a~ðHnŒ1‚—,çùÐ(cÙË…,kó²ä¾¬Ns »A žzîúö#¦0s^£ðã·ðŸÅç\ÓôHõm>xBêÚtªÄKh4¸<„m†ò2¹8Ç&¾ëxv\C•rÓ·µ§¬oe~7æ¿Cš,§Í/áÏGåçêÑ?ƒÿo5/^@—:}Å©Eº¹àI$…¼Õv‰˜) ΙÀ^… ½kÜ>øÝüWyª.µ ²Áq ­e\ÄT¨¨ÁÎ~ïã_#éÏ%½Ž‘ãø™×ž!1Ý[˜dfŽ×q+*3‡Uo1IáÐŽ«Ç±~Ì<1á/ÞYkš½µ°¸µeY¦¶XŒ²^ƒÊ`~?Ë9†¬c:r½éæ´?lÀâi7}äAáßËâÝ[ÅþÕ[ùÑešîK¶HÖ@B´~XNARNpˆî ÇWgà7_¢¸m^ݯuR)¥°’Û˯uR{®F}·t¤Ò¼M§MfÛKtóð¡¦rËž…pA9à”`ŽýÞ•ã}Cû ÚÐYÀ£íJ£$ª6‘´žTd¨ÈÈäWì¤à›Ñô3x‰9Y^ñ7Š~ø‚ÃC¼¼kdJ_>KÉB¼—ØTÞàÈX–Üq’q“œU{ïŒZ•ô¶^"×l¬n|Ö —R¢yßí.ppG=ûWS5ŧˆ1ªßËlH1¤ ±YˆÉ rrqŽ€jóïÚ#KЭ¼/‰oÁ‚M.Q5“[Ä@'îl•mø<çæ=+*4¥NmÏgةԌãxît¶Ö–Ú‚:nZI‰UÕà äà¡ì@÷=G\Õ}Âð¥­ÔÈ%–[‹‡g„$;0$„ ð;v®Càw‹µ_øZ/ë—0EæLV–Ñ£Ì`íSË#wCòn3^ikm§-$רÙ|olÿ#Ó¿jÞpŒn‘>mÙ½à¨ìtxãh4ái »îP/Œã+Ð-¼a6iijnÞ[?|cŒšñ¿ø–ò1ç{¨ Þq)™µWŽs׎žÜ\çü-KÏq-ü0<‡÷0$›Y”àŽqÐçTß3gG‘ô7ƒ¼o©®…icâD7‰ó†àÈŒ~ò©V*@< uëWå›DÔnDÓ_˼€X‰1¸ŽÇzôÆFX£%Á$“ÀWÀå9en°WÅz†·¨A1¿·Ó|·+i"ùlz€Í––!¶«`ŽA_œŠšTyt‰êYüLôO‡Ú-¾˜éw{hË2"À‹Òn.(rA8 NTîUÏÊ0šÿôhG‡!È™BX|ª20=~ö8íí^M¨xËIÔôÅnÈ]¢“iʯ̤(Âõ#¶G8íT´ŸŠzn«e6ŸesçY…°Ìª‘°d$}à Ãà€q϶ Æeu'Ói½Î YÄ}­¬š[¢ø±ãŸÎÔõ²–é3E4·2í¶‚#RØÇC‚OLÖ¦‹¯Álf7î’EtÙaó7ŒÄ¨ç¹*}{ú׊|Gð5‡Æ…ÃÚþŸsš²ù¶·6—æ&¸øŒ}ÞwnÝœöàW êZ_†>xWOº›Ä¦g°ÓR%k©üÛ©e\ƒ#ã,@$õçŽøñá‚TU ÛmìÿFv¬Æueï%dŽîH¼á;T½¹»ºˆµÌQ7›†8 TŽ€í''½b°3tyÛØ)ã㨥¸ÝÆÏD¼{ kXÚÂÛHmä0ªî¸ŽFw+7ÞÎsXZÿtkÈ#¯G*8–2r‚Œqò€ÈO±éÐhx‡W}LÕ¯£·¿ÙÛÈšfµ³òà)ÁääàöêxÇÈ ñÖ§75 JÞúýt‹«Ã‰°"Ë2¤’ŠXu9ÁîkÑË2w˜9T––²¿~¯æy˜ÌÎ8XÆÖ÷vüd¿ñ~“q© wLÕOÙ¬K4ÑFË Î;’cbsŒ  üd—ÄPYÜø.Ú×U Ô~Ö¹Ä*ÍŒðs‚3Øàõ¯ð†·;è·3k˜‚±7tª«ÁÁrd§ g‡÷‡üg¥øhêãHdû<÷ Ÿ5QˆdÞ¥ÃP>_—9ÈÏO®úœaEÆšÕÅMÔæ›Ñž÷ñ6ËKñ™m¥k@Oct÷ÐC;‚cv ŒÎ@'°ô¯&{÷³Ò¼Kð÷Q·G¾ñv‹{gî­"ªI+Û¹VnÀÏc<ãÍi¼g©ëf;ë7Žòf¶Þ<¹î£-ј7Íô'ý®ü狼;âOÊúuÍôú’[3$’µÆéQäÚa`Äã’Ù]ÜüØÉcм\F¼&þËMz¦™ÕV0ÄRq]UŸµ?‡wáÏ>êêÖ[Ù¯ÖãEŽá Ä{xó`’T¾ä 7ËŒò çü!âwá¾¹ ΋¨yœ‹YÎbfãî²á”ä‚§*AÃV ý{ðçöfÓ~=è7מ5Õ$·´ðôßÏ5¤I ³ÁÅ;HÚÁa+ù`3¼˜>ñëöpñÏÁÏ+ûzâ BÖêV[MwO‰ü†¸Ø2|ÀbA€Ì¿0ÈûX×ô?ñf]ŸMáªÎÕeª‹ê»'³ô²gæy–GËaícìú¾Ï»G¼üñ£ì©Ýݤ¶¶°ø´E¦£¸—ã¤ÂìÚ H|À0ÜF QŸrøaaðßQðeŽ«ã?Ãq}. ¨äfþ8ã)•89$g'ä?Ù›VÖ$× ñ4Ÿj ‹,„'sOÊxè=áâ0U©Öövùt±TådÏhÐ&ñß…ü?â7¼Šò;‚ªÂúK»§Ø¤…]Ñ"(!ð¨+Ä`µy÷ˆ>2Ágwu{àý LÆÂH¤¿f2ÚÆÎÌÁ¶Ñ¿ŒŒ8ààr—4¹SKÏS Fy†ÃüNïÈúOÅ_bkÑ£šÕ¢6× Œ–ŒyˆFâË*ÛX†$0?\ÖñŸ‹‡­YøêbòT¹æ%6žY“‘ó„”mg œvªk³ø{Ä7Xìîcx™Yg ×v9=r2sÛ:ð’\jRÉoâ® 4v¨’F•cÉιû½sžjÄ:Äš¼B-.7&D‘ÝšN]ÀÜp õ<ŸO¥|í|,bïmbyË©;Üx‡X¹}Jê_³[Ú8òŒ™\Iמ¼p°Óð×Ä/6âdÖw˜@BpHûÇŒt®'âňô}!ôý"ɦ’›ßa0ïùÇ–Ø$cÇVÇZòüX¹×îãÓµÛõ²·b®ÑÇ€œ‘€ß6qÓ°“ÁÜED2ìV?Z‰(tîuKG ¤]ä}â¯h:Þ‰=½Ö©la¼)›kHŒpB“Á8${ŽÕò÷ÄŸ [økĺ„¢/Ô4Û}]ñuíÅ­˜O&Ð\7•\ãb!ìNدհ™.3ŒèGˆª¡8%ÒO™-T·VzëøÁÖÆá²’£F<Ñ“mkn^–ÛUØú?Åú݉4ÝÁ$¼•+å»äÈA¯Ý$õõç‘ÝÞ[^ܵ­õö±®½ÍêÝA5º2^ ±ä`Éí‘ô¯†QåVG—_Z¤ù›Ôî¼!4ñU¶¨Ó–iØ\e >^ÖÀàg+ÔµOjWÈ÷ú éU{GUHÀ¤{2NI#h8àûžMxÞªKáâšêÀ²;[ˆà‚H•‰'°ÏZÓ·øÇ©ÙûTÓ ´¸Ưqlø!ǧg¹Ï:0ªö= d¡NÒgk:êXD4›»¹¤dYY!˜6)!ÈÇ8àô<× xcã èð]Þ½Û©òn˜ˆ$ÜmÈ© ãšâ4o~—A¶M;R´gœõ6·(¼`•väätÏoHdñ—…`¸–ó@¹·’+™¾Ï"IjÉîaœä†pú×3Â'¯.Û¬q‘v’–ûž‹i¨êöÞ3ó'ÕþÕ –ï4‹5âDœ–ù…'s°Aœd7Zñ³s© 'ˆí£»œí]Ó”™·,@|§Û‰Àä{ãœÒþ ÙXéÚj–ZÞY3$—3È­,‘9Œ|Ć$± ÿP3\–µã¿×îu¯Ý\ÂMÉŽ[™YØ€=yásŽ:šäú¥ZÏÞŽ¨ã(Ò·¼z¯ÅÛ_].•{¡O‹ Xa‚å Ê»¤9rØbws‘€@ç­qÊðhÞ)¶5÷Ùµ.Ÿ÷¶Úš¿Ù°Ñ+â28cóó€g5%—Æ_iVtû”Ô9]<[¼ß5C[ Ó!@¡'­yˆø¥¤jÞ)»Ö®4) (þZ©f 2@À8b¤2@éÐèГv{¸¬}QM=}Omø‡á+-~ øI$X#}®åREYU’T²›XÆ…ð±CêO ªø¡îO¶¤°332(ù‰Ú~ë.ñÓóØW¨|CÕôri—I# o*i ‡çÆÐ8 Ë`œô qŠè5_i~'Ó´î-~É:¾ñM¦B ä㜎Ýp2MvR¡h¤õ±åTÆÏÛNÝLû¯Z^Y²[Èv‰‹„œäqÁí´žÕ¡c¤úrY[_]$ËqÁ.å àº"‚@ëÉ¿Nü/ÄÍu¦^*I ^ovU†á´.Þ™= `ñî*ÜŸšÇC¸Ñ­§€ï ä2Á( ƒŽ™ü:wëZN)%cž”§V\²Üëdº†ándo³DžT1Œž~c·°l`qŽ9$žvïÅB×_:M«e“2ˆþ`sÐñÆöö®GVø‹q™ý–Â3,í¸NÒÁ=8èúõ¦øœ[¼—;™2CeÛžý9çš—Ũxz3…Nz:ÁcñÄÅ Ò£¢‚ÅÊZgŒ=ÃnÝ— ýÑÆ}sÁï]ç‡~<^iVËuªøaWR2$­.àÍ4{”°Ý¸üGƒ˜œÿ:èþ$þÓºK–J³àé€ëW5Ÿ^\ÌÌd؋‘ÎF}:~ TÑ¡[7Qbñ SKséqûVø³û:íuŸ B­,æ8ü©OʬãÉÃ@Ÿ»Á¨<)ñ¾kÖ¸…µ¥¶º™m¥d“A ‘°ÀS:cŒœž•àG‹£»€[^ȘŒwçŒÄþµÒøF? x€Ë ž!ûÃBE‹:ybF°G“8E%s¸“À)8TÁaÜ[”EK'4ã/¼ëü_ñXçÐÚ5¤—ð›påˆa˜$`œ™9žyÈuy2ºtV®²½«ZdVÜrX±s`úž¤ŽœæY¼=£Á¬G'ˆõ õÒÓÊûRÙ<ÈÌÁ¶òÑ’«óR7dòsÐ6w.¬t¯!³¿¹KgGe·œ!i# …l€xnn˜àTÓÃSMF+üމâªjÞ¦–—{gyo$Á¾ÊQ$}ÁK3!C’wc$òFLšŸ­um Kï'X":{:J…f3aUp¤n9cƒƒÀéŒÖ/‡5iµ«d7Z ½¼2´FFŠl.Ö21 à”Îp>a‚Ùâx³Xñ„#TÕJÇ-ª¬R¬1…+…Æ6ƒ‚2:óÏ=ùÞ­+XÊXˆ¸ÝîqÞ$Öï#æ—̈0–fPÍ€ÉpxÏjætûíFÎòIâVºòÝœ8 C¸ œwàqV|X÷~©6:³@‚'Rä à?‹f:g#¹¨K{§¼¶†ñ2¸Ü£+åg»dd)ïØ“Ô Þ+—Dy/ÚÕŸ5ÎÂ}wE¹×Að4 Van-.‚…ûFq!‡£yg Ë» óœ€0ꯈ¯<2º­ãªÙn¡V%–ÚlÆrI݆þó« [¨CÝi7¯þ•8-P9òzmÎ ä“ÛŠêü=câMMY´ÛkK‰§´ie0±qEIbdò‡€~ðÁÉ5ug«…YϹî_³Ö©§é“Ü¢Ë «Üiò¶Ÿ"G*7œó[”' •gÇ!ŽÐz ûÂÛ¯xÙ!»Iìï,ìmÕÒîþðÛ±iwÊßhCó »sä¥K*<â+Ã^ÿDY&×áŒÉg6gýöˆš\:üÄdªñ‚Ì2[›Ú/ÅoŠÖQÍeÕä6×0yh¡’UlÊä†|g‚A=ÍqTƒçÏv…xF*œ™öW‚®~x;[2êi¦kƒÊ–Ímo$[¨„²/ïÎÏ•1½vxr8ç?ü]ÿ‚~éZ§ÄMKXðÅmIðìºïEòLçMÝ#yƒlqœÃ1Ê\áùáI®ËáÄÞ"²ðúêzV³q-xVá.%YËob¥ù_”³©çvå Ï²]ëZ]ß‚´ýsX×by –;˜m‘wÉ»+à›ïýî™n5†Š1Ü;]Ï ;JZ4ÕÓù>¾g|òŠÅ4ªÇHìö·ÌøB¯µ èmp²ÄUŽ|µ<œ•ã¯O¡ô­=L{y–+‹-þmÌjc¯Ë¸¹íßõúñ}σ~i «êž3ÓU¼ÁÐÛÊ!<‚¡Aù[ƒÁ"¼Þ÷ö§ð­†´×z.‘w¤‚ÀžøÎÓÒ¾— “f8ÆåJ›·w¢üO΢£«g¹j6Z§Ç<òÅ<ЬÁ%+û¼csýkÍõíu5ÙYàPÎAä#åŸýzåcý¨î|RËd¾XУ«L#9¯ï ïÆZÓ°ñ‘uy­Î›æ<¿¼L/Ë´œÈ?—½o‰áÌÓ…úÅX{½Zw±”eMO’Öf†ƒ£ÛÙN ´‘É$r6ìžãÛð V߅¹+;‹¡˜ã-òƒÉ wéÐZµh#’H®Áy ‚„`œŽ‡ž1ŸóÍiË–©r+¦mYkzÕÂÚÝ^,Œ²+0‘AÉSŸB8Ï®=êÕýõ¼aJ+HG*›wóŸ©ÿëW?£µÌÒ½­¹% #píéÒ·-4;µŽMBFs#·Ü(qƒžŸ§¿Z|œÇE ‘§bÄ[ë)"™cópIpT‘Æz0çÈêÚi³½-–g‰w PJõ<‚zÿõ‡áØc7›öV'®Ö(¬­[Mž $bªC »mç¯9?…K‚NÇZ­xݱÞ½[tû$Šø ÈÄ/#ƒ[7ví}fïj…Nì “ŽxÏå\Ö‹4QßÌÚ„èˆ6áOºôˆ®³L½b/Êç®Üã=ïQìÒ•ÐIÓ« KSoµ '<ÈJõ?JÒÓ|U5œÂ$š>S#A’¸ã9ü½h×ÓR‰UFݹ‘°:积JͰŠä’&—;GSüG­Sµö<ªÑT¦¥zþ•ñÏV77Z¿æÙ˜~Ãm/“ü‡l§dî9${W3âW–òqt·2,i2ù«6âÀ77é…ÏSŠçtAíXµ„åK°, 9ëÐóÓü t6^ žåœN‰!•Îr™±ÃNr9Îx99=(R·CHâÔ¬™Üü5ÖáðÕ¤.Ò ËRÒAn¸ \.Ao˜ŒÎ3»h\cv)ž(Ó'Ö5uxíÌ&hüÅY\°nWv9Àÿ>äáøM~Ë<ú~f×(/]ÅC2xÁÉèÀdãßj]2}nT·Cz×6¬Lb$£ù‡Êyêzƒš—(ÆWêt¢œ\zö<ïâdº€±|><ÉmÓÈiU–xË—pùFÜ|¸öéŒf¹ Eš(Öúýeˆ+2¡vhÁ97Ë׌ŒöÏì,ð.µ§yº-õƒÞ%Ų›˜,þfCÜÀ2’AÜ1ž î r§ÃÉ­<7>³2ù —LîR¡T±Ü¸ÇßE÷9è3ŠæŒ¶3Xz·mZ¬gO¹¹ŠwŠâhÖ?š6ØIlÂîɱ'`ŽkÙ¾é~´²¸ð&c¨Þk k4ð\ZÛÅ#ý E&Ñ÷·,~l;à ž‡Î¼)¥[Úø»K›ÅÚ'“a0ûmò[~êk„ $…cq¼!hÓh çЊç5ê÷úÕÿ„ïµ"ê[wŠÙmïeo.ØrcókK86öÈàÍZsœyc÷žŽVŠ”£¯n½ÏFðQ“á¾·qã]ZI5 Jp`¿Ki#fKè'Ëß‚AádãvÖ#ÔþxwXñ—ˆáÓì¬úÊI!¸¼Öàù2?ÞIAÀwèHÎMx7Ã_ ÜÁ­[ w^wKÖ[›Ù.Ùæ\•ÝÆîd8e?6XŒw£¿fïˆz?Áß[xê×PÕµxdK{µÀŒH9Ó'o͵²AÝÎ28Ë7NÖç~]ûê©ÍZ'¦è> ºMGÃËe}inÒZë ÏÈ^0àH6#cªûu®gã$ÿ |7yoykâa¤j+E‰æ ó†‰qœm/ŒqÉ<œsï7‹~ëú%¤šG…Œš}â‡[I®"‰;Á˜2Ç,NìäðkÃþ7ø6ÇI³Ôü-à i¶:tZ‹Ý½ÓZ´“Û·(àáˆÈ uÈ9¯“©õwYº²zu>ÆiA%M#ñàøÎækm“\´»,òÅr}ÿÆ«K­™dÈ"jJ¾EÜñ:(s$1ÁýkßÂâ°øœ3ÃÕWRVûÿ­<σ«ÎªÃt}WâÝ ÂZv£­Œt›»Coç-Ô7`F¬[nݯƒ¸w\d‚:g5ÍêÕc{Eñ.j‹ôó¤|]8eýÒmVËÃ=A9#¡ò­+ÅpB‰"C¨›†NÞø#üô¨ŸÄÍ~ y”À„4Å!@σÀÎ:™ïœq^8+óJ³kµ—æaõš»réêu ³OëðØCo&¡7vé Y3 Pá¶ œª“×?+t— ¼{ xŠ}/ÄZ/Ùlì­í5 äè¨ö×JÒÛùn óŒ°Ç!Gü±|däkBñöº×ñH­öök˜/Òßí¦E{ØyYY# ’fp™ …bI%ˆpx_þ çû;|IøSà_†ßµìc6§wà­JÛR[ýÅýŸÄ7qðVò m÷ˆØ;²f,ÖÊSò9ÎI,®jMÞø^Ïæº?Ðô0Ó¡ZêNÍ[Ÿ^Y"ÝÏw ¢K“,8c°ÁÁR8î:•V Nšö)íîT ÿ¼Y…çûסüiø“qû[~ÒRø‡AÓôØx«ÄpZiZb[Åm¦è6ò4p/Ë*$Q¨9UQŸ1±“U?kx#áÿƽ[Ãß |G£jš5½ÃÁ¥ÝøP[›yá‡÷B`Ê?å©F“˜áÁ;~íxŽšQÐ%•ÖÇ+>Œñ1º±¹Iƒ Œqþõ¨íÆŸÉ ÷)°RsòŒväà {UmêÊMUydœjVÉ Ú{ ÄHö™V9AŒüÒ¶$ ýÐ¬ç„ ³MÓ߯]E艡pŽ]©Fáæ3 ¸xÁù€^¬DamÐR§R¤¬Ž»Ã6¶gQßlê‘2î onÕÙÁ´—71c ¸³0ãÇ8ö¯&µ»›Ã—ϧZk"ê8Ûþ>!•€ÁÊ•b8#ŒÒº ?ìWUŽB²åcwÏßyõ©?QCR¦®µf5#4ù{1¶³ÔïmfýÞ2á[ õô¬Mp%¼/ Ôê—# g‰I?(8=;sõÇlçZêÑÂ9u¤ÚLCÉYɹ› B¨^¤üú`W)·Ú}ñ³to6Ýþ|©\0íëV¡'ñ›—/™¥k¤­½êI}æü»¥Q!Éüø=IíZ“ßi¶‚xgË’¨¡Žp9'ð®r]FK„]RuEiÓÊ– 'äݸ/¡ ñÔs™–!)· a»õÈ$’OZnJÃŒ¥¹ØØ}—QÑæ¸2mTcó¾0[ñß5Î]ÈËzˆìw%Šÿz†-^Iž5XK" Ï¹Ç>ßç­^º¼Óçv}"Uh±ûź_'<Ž9üx5‡$“Ô%QµÊÐë[…Ô¬»ŽFÝŒyéÏÖµáÖ'°òã–ÙÕ¹$ËÎîp ú1øÒx+DÑþÏy¬jÚ½¥œöL¢ +¨ Ëw¹ŠŸ(d.T ͹”à2ÛU¬ir_ܬ^dQe’L`H·¯áS.TaÈ¥²:¯ë±øM²ÖMûüò騀sœnV†ÚÛټ˜7ñ“žy›øjæè‹KD"T••b%…UŽC¨¢åF3“óŒã9=ö±ñ«Äžš×úÎkkL#šhUJ휕UÜÄ©' ŸrI#Ÿ1©)R妮ߙكÃrûòÑz«¦jžÑuýGOÔüø,,‰º¾W›>h˜âQŒ}ìÀ@À“'íKàÏ–ð|›JÝm¯^Ú14‹ÑUÂà°ÀÎÒO#Žùò/‰îíîÙ$S\Éd¼ËòÞC™B’FÖï(R:’+Ìô­{⎭â8e»’yãžåQD I,Ç?!é“ë×¥ypÊeVò}{³ÐxˆF˱ùŸc9éWmd,@³`uQ‚zŠ»e›U¶w69xÇëúý¦œŸ5œM[dÀ]çéšÛÓî&V ߌV „¸\lþ.æµ´ö/ SëŠö0ÒÑ}x¤tºv£t1ÜxËp+¢—Zk­¤× Y‘Y„2dyÆG^ÞßZÂÑ´2Æ}N}BÞ¶@Ì')rNQÕ‰8¹è ­=žàªºG,Xœä“^ö[C©ãÕI]ö;ÿ‡¶Ó´—‹j“Cä­äªÅcfÆ8PI=øñÀ=+Ôu_|*ø}á1£xšÇ^»Ô¯µX-áÖÅü keo q€¶Bî^IXJíŽ00ìkÏâ´±Óü5“}t±Aq"-̯sq’T›ªŽpzö>Ç'î?hxáÃïhúƳâ Cm¡ÃpÆßPºžKÁomivÍû¿< p_,eжT|ŸUÿj¥AÛÝWù¿ødg—ÅJµnËä}Cð‹àüá§ìKâÏÚrj>+ñìZ<Ú&™á¯^[æßP¼ƒìéw´*Ìʯ:È…Û*$Wç´ÖЇû"‚Š68)Ï篧nßJû“öËýŸ"ýÿd;?„?t=*ÿ_\‚N÷Ã)-¤¶·qYLòÄÛ­ŒWJžu§™p…öÈŒ»˜:¸øy,î5ë›ýcʆ-™æŽi÷ãÈ7¹c¹Q“É'©W’.ÇuvÓQjÍç„XÚÇ<¨ív™·ûÅOï¶6v‘‘Žœ‘¸`Ž*¦œ^ ÅÅŒÂ;¿4Ì¡GÊ¥F0Á={“ÅI y®R7¶GHÆ]£‚Ķ=ùí×:qgOÒ®ý¼Æ†m$¯p»c#c0P¤eÉmŠ gi`Ç9z™)ò»¢®d·†;„ãc`1Æ;óí“Z:>»k>£g§ë¡–ÕdÛ5ÂÄKªg8 Ìy dŽJ‚@ägˆ¢|Ò‹µA.9$ýsžŸ]°KK¨®&0Í÷‘`–£çqfBü(lŽ1ž\æº$³«0Þ?öL·eÜÂÙî Y n HÉSÏQU¡’ÞÙËE “¸9ç>¼)w4Ì|Ä·ÞU`Búã Æ$É ÆO»‡­äz5þá}Q€ÎÉoy;â`‰2/ïÜ~}³“BO™_Ju”šÕjz,mXBP¿õ¹î¿üY'Ãï„süðN­sáÍröØEdÐÛLSUÒ”l‰IA#K û:C S…U<žø0Ú|w~(´Ô¡½Ô#‹r¨¶œI«åÈYJ TRQS{v²¯Âðþ³ðÛÂü$V“›ˆ ž;{¸Š<¶ï — 'Ë*o˜G#Ä‚Osðƒâ΃ j÷ºôÚ“[[éÒÍÓî$[ÌeÀl“kÚ¸¯2Q©ÎI=]ßõØú8TStõNI-;uûüÎ7ÄžÔt½E®N‘Ê×fæâ#nJ«´{š&ß÷B†ùÜ3Éçƒ×¢ky%Õ#»»o·†žBÎà /Ï“ž>Q‘ž=@¯Pø‰­Ãâø—@ñ$šŽ­´< $pÇ` ÚîQX«œa€.@ÛXúì bðåæ¿«Üµõ³³InT-Ë:&X€2Oäc~§|o$¤®ìMYÍt_ð&ÖÎ;¹®µx„vòNUÆ •fÇNþ¼’EgÙøËJðœ_mÕ\YØek›‰Êeä¨ÁùŽ0@<Œv¬ïxÃG¶Ó.|]ãðØÃ H`_‘îß„S´ŽªI'•P[_8|_ø»¨xâñ ÛE¼H«d6ÁPHÉ$±Pı$‘øWÚäÜ;<ÉûJží5»êü—ùôõÐñ19”©Z0zŸÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?òÿ„z¯ÃÑzuoø’ÖÑÜÈd’/3Þ¤69~ƒ»eF|öȼø™ñ;ɆÂÖÉ|czÂÖ ‚h¹ƒ:îÊ ˆAÀ<°-ÒÏ üeðÞ•a±à;­&-FeŠÖÿTˆChÎÀ?• Á£ea‚ Ï•Í/øu|Wá[ÔKd–î0Ù¿rÊ]Ub7ÌÎ /ù¡€9ÈÏ.t!§)Ù®e{í¿[)ˆ­V­Ýhx÷‡ô-?EµòìÁbà3K!ÜÎqÔ“É­m+OðÖ«{öoê×–6ÛÖæÊÜJâ@§` ²ü¥°¤äààâªÞ‰tòëwFèå]Pè>õRÞñ%”´’| ×ôG°¦ðÞÆŸºšÒÖÓÓ§à|”ý§´ž¾¿©õì­«xëá'ýJÓÁþ%gÑõ+…ÔžóIÁÕc0üû‰UTó]p»$²ÿËÙØa\ø?PÔüã ËMA·\]Á"M]€ ìP­ó¶s€ÄéÈùçöyøñáo‡Z}炼{áëû½S¹y&¸µ½ÇØó ®èíöåØÈÊä‰S;0C ú7á¯Ä…ž>ð|ºƒîž&”v’ÝÞXO Û@ç ™CذÈÇeK~ ÄÙk–ãªV©*mÝNÚ;÷¶‰ôÙ_sôÌ‹—WÂB6£+|=~[»o…¼wñvÿÅ×M-Ö‘¨$ÓÄ–vì±Ko -ÅUñå¬[°~m€žÕè#kW×ÀËÞdp,WËysóI&2J¢ôÆ2 ã%m=[AÓµ¸íõWÊ“XÒ 6ÖWöâG3)uXÕ‹6–½È)wqZ¾ð޽qp5‹‹Ýתq,œñòô#ƒƒ×Ÿ_‘­RSwlú q„ˆÒÐ>ÙkQA©^_Æ÷ 7[Ü]8àœ—9Ú2OsŒt®OCým|ûjøkㆽãI­ôÃ×qYéײÇ'úd²Í˜öªˆÆî.ÙUéÞ«miâ7N‹RÖ-Á†»d0²(ìù8ÎO9êÅsÀ5ã?·ï‰¼#®Úi>,Ñ¢»ÒWMœ¥†%ÓN/Q•bœå“2ÀÈ;@`0>VØIËÚïä˜FtìËšN·ûaÞxºßÅ ý©©ÆÒX¬sÑA½B,DhW ääfºŸŽ_ühu¨´ö×ä¾O´ÅnXL‘îu”2ƒ´žª;`WÊž¼ñŠõë]Â:mͼÖÚ\Ú}έ©ÝŸ¿'.HUûì|°É(ÇÒþOÃþD¹¹¸XØL/. Ñ‚O"2Àc,’:`ú Ú“£—)F.îNîûêy¸|¾ >UdÛ6pãÃ÷¾#Ô%¹¸Öã´ee•¦K%~C‘€À¨’q£‘Ð ÅÏ…_ <_o¾ ñMÅÔ‹k -¤°É,–Ñ WåRd;°r7vás[I§ÛøƒT-¨G$Ñ‚£b  J¶rF=3ƒì:u§kZƒo<ÐZÇ8‚2$…Èžù=¨–b¢ýÓ²8­N'À:g…?gûصƒ^?Öi W¼Ó.•c…˜)ùw"€WˆÇÌ29+ÜßþÒ¾.ø™}iksáë+=OÉt¼ˆÇÛöÊqÛ‡³mË|®OÌA#Ö¼è7°ÆƒòíúV?†ÖëZkÝj:ÞÞ/d/° ’-Ü CrT—šÞ–"…ÍÔÂ¥GDô-Zøþm_ÄcWÑ“t¬>Ñ Þên‰×8òÙ÷eú|¤p3AÇo§xÛÅòZÏ+hºàhãFŽòÞù¢M¿ÂÊ"r÷ç±&¼ïÆËcâíbYµÓX¹Y~Ôºµ½«¥ÆP’à‚’mû¾U;x9$ŒýkâÄß xGì¶õä¶nR­2ê\¹‹ab¥·cån×ÔÜyýáSŸfw©ñ¦ëûPk$³7'&ÚÝ`‡j¿BÅ€\sÉËmç{®§ñSáõþ´/u ˜tö”wdû.a=~úî ³ÆAÃ÷Ú+ÊuOéú”³Ü¥í¢AªÇem|€(ÜpmÙ$6:–Ç;j¼?LÓU/·`#ó^Ùç ’pÂ䌎ç‚b9¤”eh£WR.6“=bO‹ú¾­=õæ…«¥é—%ÅÄmð-½Ç˜·C^™®o0•苽±òí‘â@p7qšÁÓüWðÿKÔnµ¯„>+è–×k ’[h¾LÛI D†öà•;@WbDœ*²ñ¤iIÓæiÛÓO¼Êxˆ¦•´ó;? |,ø¯aá+ j¾ðÞÛ]uå·ñ.¥aæ\\|Ãt&š@£‚øâ]oà©ð³^ðe—‹¯%Ýeu¥ÿÂ9ok©-Ô(îgk—¹!òãŒ*¹%vŒ0mí;àïìõ¬i·š&§‰~øÂ 1mfªb‚âá•^?Ýͼ¬O+ ™F[htEšt(Õ‹Mýèê§V¥ã(?—õÔêl¿iM6Îú=2 f 67¼’(’æ)w9‰b<"FÛ“k`2³gËs¸•;rõÛ^kV¾(Ðlô»^\éÚŽ™8ŠIðC‰Ò;—PV^22üÍ[^ ø}-®¿u‹¼áï'M°e†ëQ±¶¶ºÖ#–&VE—¨GŒ:²yòã8Á .½û ü9ñž£¯ø/âTUœè·³i>–i~ÌÒdŒ$n$ÉSw|̤4€¸, *ÚAÚæÿ\©%ìä“gˆCû!xâÄž(øWñnßWº¼Ò­í†”nÙ¯nY#-²²230#Ulg¨â¼ïÅ¿ ¾"xCF¹ÒüKáf°¶0íš}Ô‚ ^9¼¢< îHÙ\Kk!“q*»·‡¿ò¯aý’¼cá/ êÚî…®ø+[ñ«­Gi‡ôýÅ.Œ™çI"f•¿rÙ!n€œýwa>µ‘T´Üm$—tüúZíž>SQÓÇ(©òÞêÿי鳇ÆotÈ|#ãvC¨Ü^Ȱ\Ý@ì…XD"‰Y(Àù„‡1´“´ý áØõ+Y’ÎmV×Jݤ0¤×`“)þ;pXƒÄ^Á}áÍVËËðMŽéïÚI'O1\¸)xT4`He8Aã9;’øÃI¼kÝ?QE²’â†îHÀž=呲@9ŽwNãÁ üÙŠÄS•~hE«îÖ°TkÒèU’•¶d?µŸÃ¿‰_¼7á¿ hž"Ô4[‹-bÚúd[«‹Cp¬›bl¦ß189)€sZ><øwaãŸXxgÆ7Ý\é2FñM·–7lÃÈG©ù¸“Ç5CÁ¾2ƒF·¸ÓÌ—Hæ…61Fà¦zì' Ž çûÇ;öú‚žÙ-ážá›{6ÅÀõÎëùóšã­«ìÔÛ¯Sº–“o©â~,ýœ|C¦_ ¯†šôq“+e)Ø$“œ’ *ÃëŽy­Ï…:ÅWw±ø§¡Éh×1ªZ@_| );pX;aþcƸ ÷šä²iûŸ0š6]ËåȬIôÀ={{ãéIoxú•“™¡bÑʽ@=ú×*ÆU>Z‰?>¦¿U¦¥Íý:4mKUðíÌm¤Cot%È™ Ù3)ÇÝä€ô<ä{bêÛ\ø§Ì¾ÿ„RÚÚÝ$È<…M¹$·?ˆÅoø'FÒ¬¦³¹¼¹0J‘žœ-*•ãtÎlEXÑvgâ¿ .YZÛB{4Ús4²°Œ&Uc‚3÷Qéœ×“\xËÀ~*ÖBð÷‹¬$½RÏ%šÝDò¿#cÝ»Í}BÞ×/-ÅÙðf›pEŽãMó4SC9e,‰Ôàq‚qÒ¼_âW‚<§üBßãÃ4°°òæ¸Ñ¡¹XðòY› xÁè9¯Gû­%ø5¦¥©“§êº-Þ¿â]nÎÖæbY@²ˆóˆNÕ,v÷ÎNyÀ¸ˆþ,ñ‰¼96«àíVø„ºs¬1Ê$%Y‚î`Ë•E“¸0ùHPÜôÇž ºñsx[ñM힟swVÒ xáÝòÆåQˆP0À³0õ†Ü{qà…>¾µðæ›®Yë0ÛíXÔi²©™IÿGsçy(„’¤– ÁG!IÆÒQœÔ¢ýÏt­+Y1à{O­KÚ^Ÿm¤]9’{ùÓìö‘’Úa•›;0Ivä^Öµ¿ˆ-â( Ðu×.žÑg2i–¶ó”Eo8Äc˜¾ä%d˜y¡]™TŠôíSàŽ5Kuñ>…«Ûiés{[Í–—žD‡Ï'qG !±ˆÆ9l#ðÂzy¾Ò´k¶ZeÔ‡íVvÚ—–·ï ²0]Ìå︅f5ÅW0©ËìÜíèkP§4ÒºûŒŒÞ ðWÀÁ¯|LÖÓź–¾&eµ}a¬šÒ'îÌÆK™%•²q…Êo˜2b³¿f‰ü=»QðóiZ¥ÛÍ=Þe%á!;±p–Iü©ù²„ƒé÷šW‡ZÑlu-2ÐF#ÅÌk+²Ž€³‚̹=¥lhÌZF’ºV—jÐÁ•ò8EäœÿçŠá†21Öîæ²§ROH«vþµ9ˆ¿ ~júõljõoëšn©'ŸáÍmf–ÙÖbÑ6ß5m­î'‘W`åà×™iß>5üPÕmÇß'x¯JµðM§„¢šËH± ¿Õ!ÙqÚ4Kq;ÛD‰,ŒLŠr6 ÌUŠÎñÿƒ7øUiI­kzu•¾ž¶ðÞZÙÉ€®ÝŒIfX‚Ãn=‡~6™¬ëއñwRÔ<+¯ê¢ëNðΗÅu§ÞÌ­ÌÒHmÄq1º~ì±a,?tîdÜÒ¼3q®GÿÖ§ñ2[㸑b±¿×çY$ìïób™É •f.Fµ+Fœù`ïÍ(Ñ©VÒ¬yg³èxí#âxeíüO§ø³Zˆëj%Ó^ôIÇî匣+0Úrß4mÿ,È$cŸžïf»»¼{‹Ë§‘å,Ò¹$œ’IÉbsÉ5õgí)ð›SÕÖëÁÚtòK5º-ˆÆ#¾ØÎ†Þ6só’°Ø¿q‘F[o̺—†uËv’Ýü­Á5»‘z÷ZcªÆº§‘•9ãƒß­~§ÀYîO—á¥N¿»9µi[¥¶o¢ßsâx“–7š)µo]z™öd*üÇ »Ì–û¤¶˜«²áeF*ÉÈ'à>Ìj„p»¨xs"ŸºÊ3ŸOÓùÕÍ3N½Õfû„4®B¤q.æ$ð9ö¯×|?²ær\½î¬ÿCãÜ$§¢wüO¾¿`¿kŸþ Øxâd“kƒ@»½kinmw?”…c&2 Ø%ïF9 ç ‹:¦¥ÿ÷Žï|Sj·V–öð´úR].àža UÜ(埳í3àƒ?"ðgÄ_A¡jºf¹q'ØïÄBYmÙQ—ËG`Å‹‡S¹vÈ?)±ð}ÇÇoڳǖÞ*øæàë)ÖöæçÄèßfÔaWŒÉ)¾"ÈT6éw)dG [8¯åÜòn9­y´£iuVßK[ð±úæOQUÀQ†®M/_?¸À³ñÆ·}¨I=߆®>În`…–ó†f胨hÏã¯ðŸˆü)·Õu‰mFâ&p¿.÷Ïùô5ØxÃÀV6º– ú¥þŸ-õĈ¯j¶ðFò2‚£i·’l#2Ρ B»WÌào§ÂoêBß_ðýÜNˆ²ßéP ð‘à«. BN_r±*Tb¼IT§Uv=…°ÜeÞiÜÛ]p’åÓr*ˆ³’§9Á)èKÅZ¸i‹gײ\,„G3$aD''.Á›îƒØ~lŽ3XYM%ׇgiô²‰dŒë¨YãÈI &ü# «–§ðãß'仸Ò|oäFmî)%¤¨Ïë™Ãî\Oé‚+)Ón:ظÔÖËs³Õ®o³Çö„hJy § U×å$t9ÆáÛ¦:W3¢Gwa­[jVWsÍkæí»JXò)läJ«“…`ÀÜ6¶Egá©,|?&žúÔÚ‚‹½Ñm‘€ ©Uw;‰ÿzˆ¼K¤J—p 17˜¡Û*9êßxð­Üô<úéJ´iÇ–œß4ŽòçVñ_‹uËoØxÉ"··qö‹KïT³0»°ÇƒŒóȯ)ý§<+­x–ú[Ÿ\¦»u<¸·ƒætÞß+**…À>¡ÏA’OÍ·áÝkK¶¶—\¶ñµ­»¯”X‘#¤›sónÿXÀ‘Çdš±®é%×üG ~ ñ®†o§e½»¶€Ê%¹†=«„,C* |dç»ôÆW4îŽ7:\¬â¿g¿ëºF‹w¤ø±t 8RæÀIuçJîÃH2ÊÌb ª^Mœ‚Cõ?ÇþºÖl´ äC Otú¦œmdX£€È6ѾÃ@_¸eÉ;@MÿøƒÆÕ$¶ñG Òì]@º¼ZC4 H$Âíù‡Ë½T•ß)æù¼Ãã'Å¿xòîúþÓ[’ÚÚíüK£œy# ŽóÁVÝH\…äp;è,TÚ»Ðä©JŒîïý~oð{žñ&˜<&–÷æÙK=£Àc°ó|‹€’ÉJeG¸r©´ÃŒ—ý?ņ~ ðTúßÂû}SCÖL±ézŠi\Í VëXâ(X<2Ì¢UÝ)Ä[x“z;Ïßë:‡…ü[ džµžÚîù"+æ•I9WbW †zÜWÞÿu‹_h áÍcáŒëáÛ«›‹¬4è.®ôĺWWf)îEùãJípkóy~,¡A7鹌i*jì§ðßáÖ‰ñ^æëÄþ Òî|aZ‹]4ú†ÚŠËu,²™!g–ä„lœ3F$h›-…ÚÛÛ»ý¥~èÞðe¿‰ô?³i·7–C>›ö{y­nßÎO7dFy™šYKáƒ)–rß»ô¯_|Cð§Ú´|¶³ðÄ›cÕ5Ë¿4Û"fo&{„FQs– êÞPÆœ¿ñ?[ø­á¿|:ø‹àØ/õi.›ÚGö’mšwòÌ@”!.Ò)µÑ•_‰PÅFR”£x–êÓ©hÅ»þŠYx§Hð§„5/hºí=ƒ4kdnÐy'¼P#(RŠÊ™vG`>ð§˜} áo„¿³´Câ J(¦Öµ8ZKíF$jöÎÂh¢Tgf…Wsn$îË3çŽWÂ> ø…ð†è¯ü+»½{H»·ÊÓÖÚ)Uc|,p¡ÜÈ¡ðB« *J 6ŽGñu;ý ¾×´Ý*ÇNÝÞÃáüÛyaƒ/0É)7—!'¦Ü.óµòñ4뫨Eë×È郧)«é¦Þgooc-ͳ=¬Í#¡_·dàðqêN:óQÜÚÜØÆ¬%˜É· 1Ô)Áäú9ê+–¸ñ߈š=ÿÀÖún¨š£´Wö‘êPÃr‰˜yy#MÅЩF …Ëdšëô§þÍ´ŠÃXÐu 2V¶K…k°fŽ5‘Ÿ-æ£;í^ ƒpùˆ;ØT·3[›9¥+t2¬L—rÈÒ$ñ"Ü2©6™0y dü§œgÒ´Å«ùà0c•$ƒÇpM:ÓH¿¸WGðãÝÜX²©ýÜŒ‹'ðpÂíƒÀ5‘­K§iš[ëºÓRKmê]\Èìfã#h; UQœƒƒü5Å´_´×Båìw6v-zl.&*Š 8‹»¡‡°¤1õÊÆîÒ këëT²ŽéÛG4¡¤¹•†DJ°¶}±“¤xƒYÐC¢xBk´Ô¡Y,m|˜¥y—å%ùg°L»:ÕÏYjÚγy©Ë jš“4²FuM¤–ßËv v÷^kAެ»],,a¬È’©QÚö:SÆÖüUcáX¦Õ59î I5ö¦8<¦ö@È.0™Ú’±‰¼¶\‚A/£±Ð¯üC}¨éZ½»‹tDò4KX¦bÒüªdtb»wyGoÜr±;š¼¦çÇ—>Ðõm^In®'Hí’ÂÚ&<:2¶J¢à…Ø©‘–Àëáh|>³ÒtëÝRo&âf[…Eh®YB•—yˆ´¡„g;™‰óvšÞuTce¡1¥e¡ó†üqâ_Éþ—«g,‹‘§©vµa…Ú¸$mã r;€Ä]ðN»áÿëgHÖ¯5U™s{ ¶±ù*NϘ™"ýã+;²FæUïšà¿kO ÛøWO²ñ•o9YnšàH²à²H€Å!8ûØPpzdŽ6äù–ƒ®Üiöð“Ûx Þ\\‡’FŽW‚@ïË2¶úíÂà  3Z¼4kCš.ÌÚuý”ùº>¢ñç…tá£-íÊêí|Ù£bï*nw?#xó‚K|¿0 Õð¯¾kºÑõ˜|GqpdHm§Ñ¡ÏlE,„á—ØýÝË”ùvž¼)ñWÄÒøŠÉµ_5Ö•¤rÙ;3° óæuÎz`s»=¾§¬jº…ΕâHµm.(nm…  …I-„ýÛn©Q‚r(†¥8ÙÏ~ÆXŒõå'Õc_ M¯Á©^ø3÷öâÒR–b¸L³yŠV#ûçÏܤ°FVVZå,àžº÷‹£µðÿ„þ"jçW¶¸’^ÏY´‰–8T;$ù„#ñlì$በ}÷áü«xBçX×.õ½.×Dºx[L‚{‹·û;üè”_™ˆi rw’K?Ž âÿiÚU¯Ä˜T’Š]>Þ%‰;w  ,££æ'Çí©W©% éÛÀäŽRwœ¨Ÿ ¾þÎß¼iðÿǶšž…gcx$þÕ-÷:«n KE$Ó ¾âyÑÆ¨rû¤²ÆZþ¿­Cð÷VÕŸCh­â¾´·-a ~xøVù0–(vž8ä"çÅQZA$ê—÷~ðÛ¯R¹Á ƒíž:=+Ly.4Í=-æk;éUÙÄË#Àp»Q•N@ÁãÇMÉÚZ½ÏS–£îi¦Ç–x£KÐüC<–ºÎ›>Øö -ßÏ$`KI’ TÈÙb®§#^×ìu[ˆ¼5¬kW—h0·6÷…f†-Ül“nUÂã,ç €3¹}_YÕøk©^ÁáY‹Û^‹Eº¾ŸÌ í)e8/† ¼:œ Ç® z˜9Â4–¦5Óæg!§ø›C°ŽÑ^úîç”@ó[Û(ò÷c8iÈ= ²qØ×Ýÿ %?ôÆø…àßizMäzUÛ>£XÌ,l¡[}‰çys$qH Í)À$yŽÃcõðÍßè|¯]Yj~,ûuµÆ&R·%ât·(‘#jã'ÙÇ$ãþ#ñ6ieok ë—6¶r3$‘YÊQ•M¸Ü…#x(%—9U9 W£)¹+-:¥IÅh§n~?ÍðŸâ$^%ðìñh×ö’ÜéͨM$©sn$L3¥ÒLùY)‚‡F?D| øÍð (xÛâ/ÁÏÅ«k’ÿoêú%ôED¾EºË¾gD_.Ý3Äéò;6íÀ|ßšö¿µGŽôû;Nø{k£Üî¶ÔaµÞòl’B›c“-¼³€dË …‘êþøßª|Rñv£¬|_.µ/åÔ¬´›X-%ÅÓˆÑ,]€páœЏ?-gígIr«Ž“|ɵø¦+ûÉâóÆ¿§á™õx¥-lðG4-pÑÜy§iž5m¬]ÔF¤l’@|â‡dðÛI7Æmk_Ÿ]Ñd¾ŽúòK™…¨P Eƒª%Äà\¡*Û“pܾU࿳| I<;âŸßèWzÆ“.™ý¥y¦ð+•`eA,JpfN¥A'>[·UøÖ~#XG©iþ9Ñ|E'ˆ´õ†ëN}.+¸5 "WSuÑ´n³y†0ÒB º²q8«Ê3Špvk§èwÓÞÒ‰é^øðÃNðmÏŠ´ÿÞÝÅi©Üܾ­lÓ®â`ÛÝ‚O)7v31…gʧä;7?þ1ɤ¶‘ð×Gó4;»$¼Ónü;à¸ní¤ÛfTiã–2XA&$ÃA€ø”ùoƒ~'Új^ŸFÕ5mö±ê üN/&k+)râ.sRXç8Ú¬ C-hüg,¾é4Ô¼5ZœÚ„š-åÑ[í¨T_ÁmÈÂ*˜žO9>F1·FM¼_Yö‰ªÔý7tctã/‘×+T𞃫ø¾xªÅ®®Ež—>“ªÄ²ÇIÁå$HÆ~by;Ñ©ÜàAâ¯ÂS ”ž2µ >dÊÖ£‘ç˜ìÚ%1ni 1>Y‘Ç$m%@ aÞüWñÍÅΕ¢ÜøbêûÄ6zM”ú8Šê[1e yh q#HScùÁ˜¼r‚H¬m{Å>8ðw‚ÇŽõ jÎëUxÒÎÖ÷P–I®®r²msåÊûUÕAÚÇ ÈË0çÄÎj)COë±T©®kßS[\ð÷µMrÖÓÆ:F§­ß=“ÛÁ#ÆØ°HÑwåü"þí(R¿0`’q<7á9tÍnÓP¼ð{ Ôζˬn‹°ìRTî9fù€%‹.H/j:ÏŒõùt­Ro%¼Ê l“¬ö“{ùqIÆ(X™ §hA¯àï_[x±SÄ6š•ÌzrÈ4NÂÅšâU;ÂÈ‘LÁÄeVVË+ãp%šäN²î¿_¸éŒSÓ_ÐÈø£ãMcDZk~ …nd²Uº³±ŽÊ³’Áš5 ¡!* ±Lž Tô=nêÏW·Óc€ê_ñ-ê¢á­'6ÂBÙšD*GÞˆÜ`¹.m.·c£ë——i­ßiw:Må«Ãmd¨1o's$0Ê0F[;òUƒ€Û^d|{¢Ísvó­”7/$vÚÈP û0—ê®Jw'Éù× sÀoNrÜþb”i++Yž—ãßü(øÁàm?FºÖ-bšÖÝE­£2#®">\B3Œ±Lp½20Iëà>#ø ªøbÊK=gÃŒ-§¸Wòaئßå*·rîSó7$}ò3ÈTõo|Ô<-f|Uâ+Ûùu;y£·¼Ò$ ¬‘GÕ} (Úq» e·å†ýìÙŸh4ø`< £ü<¹ÖíáÓí¯ì´û//í—QÜ9]±LÊD»ˆR ˑɮªj¤-~òaV4ê&ç£<ÿÀúׄ¯®/,b·x. +Ü3‡~NYvza;H#°+g@¾ÕôÍfßL¹Óž Ûe†hˆÚå P d0=yÇ=M{Lš¥â‰)á½SÂ×V7RÚ[Iªér(ͳ(`%‰W÷n¬Ã®ARGÞ$VÆo†:Ð;If$D¸†îLc;BŒœ’Ù IÜON3·*¶çÕûô?iÚü£HñGöMÁßå^^J± ÙŽ×FÚ@À,£ ëÛŠÎ×#ñU§Œ.|5ã ÙCs¦ÊñÄ,`he牛r–p¥9$’ÀÁ·àOPKŸ³Oá‘£‰^H^5grØÇF ãæ$È#‚O®øbÖhw>›CÓÓU–Rš~ù¶1ÂåQIÚgh#‘¸qŽMg ÑR³6tÜ£r¾©jö:4>$¸–îh¡ôÉõ.#—*¨ˆŒ¥ÊXä±-·nâ­MñgßÅš°ðý‡•uw&žÂöòk•¿ÖÉcŠÊyÖ9ÞôÚ¬°yƒ- `!qõôÁŠ!B5cn¥¹:oM‹ún³}c-ņ«%ݹ漷»pÌîó;›€¬’6òÅ3µ²@œ×C¬|J»½³i-e6ÆinváÔ2‚Ä—%‰SÔ‘Ô` c†4½dië¯êncÔ!K‹K‰£y$ep¦2ƒrÇ•Êä†*¸ ¢·üá{½Ú·‰N²Žiå2Ø_yÒGn%–Xc6ÜI6³·Íœ´Uaé76ŒªÕJÌóo‹^ÕÍ«x•£H¡î!RîËnP…qÀ`®sÈÎy9óÉ5ˆô[äðÔ0_kàZ*ȹ¾Ê ¹ÎŒp ¯¬ôûM/HY|A¬èö×ÿl´Cº‹ -ÄK‚£å”‚Td»5çÚ§„4½Wµñ–›áåŸP2mžáJâ Xmlí·Ž23Ð8Â-Oa_™Þ'\xÄšŸŸ¨ë’}–v“ÈŽÉd0çq,~ð$ õÏCÈxùt»u± –š.f’wŽÆ4·2&àÊ¥Õvá‹6[ŽùÁ$}â/Hšòkk¸ríEqtèÈ|²I!Ws†Á€} y߉<ŸÜøkFµûMÙ7ââ=ï»g Hª 6K¼3Ô«¦ãSÝN+šH©£x<¤]ø«ÆpÍ-Ô–b;y­âòUcª¨Vf߯ì7S!ÏÝ5áúö­¤j~<ŠïÄšc5Üñ"سÜÊxÝæI‘™‰$ñ»%v›Ù|IâfÔ´¶Ó5MnæíˆS ¼` ^9T  äðÎ:W‘Ësþ"¶²Ò4CöˆîQ®d“k3G¡K dôùqÓu¯G MÑÏRòØ]cà熼;xªù„ÜÝÔ¸‘ŒÅß!Ô/ð1`G¨ÉäÖ?Ší´{=]cÐ<›¨Õ\‹sæ†<ä¸ç¡<äï^Ñi¤Éñ/Å+á­Jý›aj‚ÞÕæ Ê{» 7#*ö'’r<³ã.™¥èŸ¯<;áÉ^m@KÈàm«¿!˜’sŽ ñŽ6çô¦ìqÎvzœ 烮´íY|eðþõtýCN•.c‘5ÂÃæÞ’!VO˜Œ¬§¦3ÍÃâ=S¹ñZ>•ý«-„—m§ZLÏ`ë"Ê«PÍ|¸Ë©ž<¿”­ûíwGDŽÎÖ0rí˜Á!7Ü{ó×ñ¬™WYñ w{wÙÌ{Ð^"ìÏ|g<úÿ…)©=MiTLúƒÃß,¿mŸÃ}ñ MBñ5´–öVþ%¾Óaµ‚HÂH r[G—yO“æa]‘ ¶¦´ð7Ç¿Ù#O¶“ÄÞ/ky0–-FK›O†#lðLä´JhÑXá$g‡Ì@»üAâýoÅ~Ô­¢ðþ«k•hY’;8ÛÌŽN ’›v–?.NÒ7ß\è?µÄÏÛ3BŽøc"_MmâÍ#N½ —ko¾K›¥ŠÝ‹¹1„s+DT»% ç–­Ô‹¹× ésÒü?¢ØËñ Âþñ;ÍyytÉ ßZ‰ôýFßË/wÜM$Œ³¸7îŒ{7*D%ˆö?üEÒ¬ôˆ¼7ið¯ì—r­ÌQÅöja“pXÌ<’I……A‘êÿ$µã±çí­]Øxޝ]CH-¤éº ö¥$°[¨ØÖñ/™û¹•‘*Ûœ’¬X×¢iž0¶mJAáMPœM`²[Ù]#Nþdp´mnÚ I/ûÈÜåTíð*7u®¾Œì†M›_ø&—zM—‰´= Ä0.•¨­­¶—ªJ·ðÇs7H­)y&WòNT1;@;³ŸáÍkCþ×ÖÍͦ«¦jñ=í¤÷—03LìˆÔOXˆOÉ—_”«\ž“¬øÃÅš|ú–Ÿ¤èÓÇc®[ÉquÑ i]KG,lÓ •eUÁ8gŽ0ÞIÔþ-¥·üUâoxN{·[sáÿˆ‰ŽâR¬Ñ?—pÄ,Åü²±í,YUUçÂÓ¥R¢ÓV¾ÿó'ÚFœþóJ Ì:‰æÖl Ã#M%Ê[1uòʰ;ÙãP€´‘¼Q§ñ«P®¯sã}öÒoø‚ßHi/'mGS†H㵉fŠO,ÎÛdy#Ø¥„P²ªä! ¿#?Nø¡áßø“J´ðßÁ«sQ’ਲ਼OyN#Ûó @î² Ò·+!NÇŠ¼qðWWÓìt¹õ‹ûÔ¤M6æÑ,^HVäÇ#˜’Yž Š~í›pQ±@#‚¤aûå;rþF¼Ðïo™‰¯x{°Kyskâõ½Za=¥Ä1ÛÅ ™rèeÞáH(•€Â ئ¥æ¬Eááeu+Ød±·GHle•Fqƒ€ªÃ;ÉPÃ.V›þÍY³‹P0É&¯¯¤ÂêÅážÖÓvad%^9Y$G`É$`à~å•Ë Fñ…ã)#»—rܬ‘(´}vŒç q‚zŒóX¾#Õ†«—Sœµ³ÌÆèËÂí»÷ŠùQøb¼|gZœV®ÇµŠÃRœÝ֧Ⱦ7èüxúßÅ/Ke­6‹/Ø,¬­ßuØiáþŒ¡Ä`eÝTŽs‘#V¶ûI~Ï¿¼U§xáýû6£?†bºŒ\ZÇ\êô8Ö}ÒI89 aƒ~b~QàðROÙãVøMñ|}húÅLJõØÕlåÕ$vû ã%­÷r©·Æ å]€ÉV5óÍÅæ—t·Úeô¶÷18{{˜$d–!Ñ”‚¬:‚9µ~ùÃÜ€Îò8c½»ršvµ¬ŸgÖéïª?$Ìóü~_™ÎŒ©¤¢ìן™öwˆü3¬øsP„\ÛJ†éÊÅ ¦òÛ›k6Ò¯òç+ÆSƒgÀ×;}^ÑŸFÔõ`fóm¤Ñ™¼ØÕ•–2űœ`‘ѺœÚüÔ<)ûD|Ñ~9Ce=ÌÞ4/XK 2ý¬Ä¤\1páã‘Yö†br›±’ÀÙÑ|«ø@Ý_]j/ »£’žaáƒ!Ъ–RvÆ1»vÜdœ ùÎ;S ‰•9ÆÒ‹³^g×a1ÄQH=¨X?á1×$‡FÕfv¹bŠ-5+Ësn× +}Ùõ‘¤Ã—Ái1ÇüKñÄi+¡ëº©Ôç¶ŽF¶òcvŠà«/+*Âæ3Éò+¿Ôü âYí!kHítÒÓKq-‘µgŒ82éµÙT¢rÎÌ»p¬:/ZfM2ãÂc„éÒy—0ê7©#Ü›™\(i# >(6OÍœqÂQœ­c©§v8¹¼i© B×ÅÂ}Jm³µœr•›™"mîHFw•r; Öø¿ÄÚF­á;8­|«e(ŒÐ¤‘©YT`Œ2Û•~Vùq¸Ç|Cðݽָ±xn -–I#WxXNÅ›~J˵r¡Ç`@ç¨VÖt‰î<7¯ø‚Ùìž?9/嘢0F K`6Éà6QךëXXÙKc7ˆz­ÇøgÇž<“WÛ¬ë×Ùßê†"Y !ÜJ‡*@JB¹ÁÅ}ðWâÕ>Ý|1Ñ­`ŸÄpk7W·ñÏ}½Éƒdh!fÉ Á›åÛžùÛT¸ðî£q¥Gk©A<6Š]’é®W?)r>𠷆œöÆìÓÙÛ¼ºž£¡Égo iæj^)røù¶–#$žIÎÚ®HBV[±]Í]ŸCüEm@Ì[Ä:´ °ªˆ¡ÔO&0»U|°Ä©~ïtÍq’øªÓDI›TšŒ9±aÊö¶;~uÉø;Aø‹ã«iôß ÙN{dfò¡ùı.1"í8 äp on rÿÂ]nk¨5 kF×µH’9­#2«¡Ã+4Œ$Œœ8g ÎmM¤ŽˆrÆ7ެô)í®|g®Ç=¥Á6Q@Ó^NAÄp'2Hpg×ë\LjìnnôKKû ¹Õuÿ].¤JÁ*–!µ£È ÿà “ÎçÄ¿|xšÎ/ j~Ñü=csl––f˜íRŒ}ÙDjT€1“ê*KSá3¥øMîRæG¼·…¦˜‚Åã æAƒ—ÃF1ÐÃStnã­ûk ëMÔ²ìyçÃ]ßD{ëßÅuu=äÒ ‚a†ê8£¾D6×  F:6q\Œ<-gí­íVÑâö²µ²•L×y]NpFÜ`ôouøƒñáv‡ãðòK‰.î´ûéöñ,‘j½âÛCa” (~<k–ø•ã_€Ó&×´¹ Ô5»KrÖ––ˆÍ¼Åfs9Œ×vA9Þ 8¯FœªJvqÜãœãx÷‰¾"·€üu¨ßhhžt1Gš¬û¤3É•ù“*Ü7dŽ+ÏüAaªk6²jaÍä’ܼ—ËùLŒrÛݹä–$ñÎ~µîÿe-CÄÛ|UñêçOQp¦ÇL·„4“Ĭ´ˆÿuŒÁäœ7Þ×ão…š ž›á¶‹¤­•µÂ•HÖÞ*Å‹ù¹ á€9R¼ p¼Vµ1TiÉE;œ°¡Rq»>Ô~øÓKÑíu»­Äe…€„ÛÏ’Ê1#|À’Ø] óüXûµ†´Ÿ]Ó|?yAuYÔ ““ÏC×ßµ}•{û?xNKáï«Iˆ ˜ò¹àÀܼ 08À ߃Ÿ4_[jòé0Ãö@7¬2*# P»¶•Ã?¤sÖ±þÒ§)r – ²ÏøðkÀ^#ÑdOÚ`€/ÚR7Ò[ ©#® Ž„jž ñ‡ÃMPøƒÀº¶¥¥Cxö¡¦j ¢" tybdÈ |ßt6Ðzôú›Xð=Ž¡{púEÛ43£‹‰ì„&ÐX+œwÎ?‚d’yô©• R宼Èò’í ª¡@ä0Æ{µÑ q»gëbiUÑhÈþ~Úwš–ÞøÛ¢jö^] ¥­·€4{Kf½|¯—aãaÀ˜‘|óæc'‚>”Ðiïß´æœ<3áÍ{Wð6¿u£C§é¶6×–¶óÝßù°Ïo *NË&èþÌ l HD†(þFñ?€tíTû]ŒrÁ `n‹nÔVãr•Œ.wGsÓ¨ñþ$ø_y-ËxŸÂ·O$‘_FÑM24çÄ*¥dus³kIMÛvì§B•{I¤í±×O0ÕÁ»3ïß„þ:ýšlî²9LªIx¤‰÷îË–;©ß5cã;wº³Öâ›R.Mï@u¹–%ŸtÛ"bÌ%;.WpPࣘÆOÁ~Öü[ðÛÄ—ž0Ò>Éy¨jösÁªÝKh×rÍ#ÍæÊÞ[°Ã;ýäÁ!w|µôÂ?Ú£FÕ,Døµâ™ô²¦»½ η Æ–3ºÅ!ÄlÀ2íŒ.Õ;æT®j˜e'jzy°¯îÞ÷=OÆsÜhw6´Éj(/¥Ñ&Iâ1ïÙ‰Œ{0c •.…ä¸n\Á¥ø7Eñ<Ïaã»M)ä¶‚;+Xõ ˋǶ‰$›zÌ®’FÀ€ŽÎ¼Á€Ç7OàO~ÌŸ¾*h?| ñ ­ýâÇ7·H‹p÷‘-bŽ*y‰vÛÈ‘í +!emüIø7{ᯠÝÞ'‰u‡Oˆ176áe·Pdl1IXlWŒ.Xºýì3nlrJj/•]~&Ñ©N^ñçiÛ=ß…ôhí$šÖÎ+[ËíÚÞ(U™$YY•U’7P1ÙJ‘æ*¶46ñ®§¯Í¹â«èš(XËɃïò‰dIX |yÊï#i#¨Ó¾x£ÄÚ=‡Š>ê·z¦žöòÏg ÆÍþˆÄËÈüŽ‹¶¹8SPé¿þ#øÒkËJœÝiF(#Ó´m"0ë?–#Ff„yÇ…ÁÉ´4™`¹$édž¬Êr“Ùmë–—!࿸7]6ý"â v,.Œ\¶å%£P¬>\1ù@V—¼;á=J=4_]M ÔrJ/ rØ ±à•‘´Œ—$Œò34±kÍ?BŠDÔ.–ÙíŠDYÝXJ ñ0a…`rG«Pø«X¿u‡^?k{{„%Æ<øÂdVê1ýá‚;cù´iâ)Rå”®»ÿŸ™÷Õ´¹¢¬ûßíwû<üøõðÇXømâÉ¢°Ó¬à¸²¹’m%S¼²<‘m” f*Žã 7+þF~Òß³ÄÙÛÆú†¬èwÏ£Ezc°ÖL; ¾öH¼Õ]©áwÝ‚…Á?µ¾Ömu˜†¯qâkÐËlÒÁ ÕÞæ†A‚H' ¸à¹QÈ#ó/ü7ᆼuðCO¹—†³áÿxÂÆãâ ߇ ¾§£iïnÒÍ*á]£)’ùÄl*§}}ÿ†mÈóXeò—= ŽÖofúžïO6ûŸÆœ7‡Æà¥‹JÕ#ÖÛ®ß%úŸ˜Ÿ þ2üVø=wsyðËÇwÚC^öÈàØÑÌ@e ÑȬ„íf]ØÎއö?ì‘û}|6ñ|Öžý¡o…¬‰ }bËM-isòY|ÒZGŽF•Ü…X†IùT¯ø»ûê??d~Ò*ñ³Ô¼U©‘ƒ?Ì­i4bKSÿX#ŽY±ÁVM§ŸÃYNYF0x= GUÊøs‹0Õ*Â*îM9¥isGG«Ý~ üš–+3É+F-édù^ªÏúûÏØ³á¶ñ¥á}'L¸ŽÞX®m&³y/<ërU qnG‘#( ¨<í7Å}Bá߈5¿\›WÒì¯oΖèQšQnKy®BÄSÉ_á'ó'Â?~%xío<ñ [Ñ¥Ž5X¦ÒuY­BýÕÝ)Àç™8šèþhþ&j³^_x£_mçRSâ=JëXu‰VÜYäm¯!ŽW;ˆ1n7câ1žÒËbë×ÅER[¶¬ü¼®Ý¬}-.*«Šj•MÍùß§õsß­¾#ü=ñŽ™{â‚ú’¬h¬êmmˆn ¨äW°éö¿µˆ-u|Yðl°^²-½µÖ§WQ‚åýžFIð>P 9ñ^Nwõp5ùhBn›I§kî®Ókª;2ìÚ5£z²\÷i«ÛgÒæ†±áoÙ•ôÙG†ü\ºñHIJì ¾c±ÚœPãpæÛ–â¦ñ=€ñ ÓׯOao$2™Ý—‰1.ï”þé1 ·‚Þr6ÇöÇŠMÛwr*ªÉÁ<“€M/xãâ‡.-¯,-bC©Ÿ¶Ûjå‚*o~A†àŒã#0x­SöÖ Þ-õ¸bº’/2='Nš[‰¡@>Q#ª¤jÃŽ7nã¾F‡ðkâ牯×Fñ' ÉãœØôm_ÃÖ/¦5“]Ý&¢ÓL5i\ù±8*T˜ãÞ˜†Wçc9ô«­8‘U!6‰s¹‘bïÊ0s÷ŽAõÞ°oô¹oo8ä†7hˆŽ?´" <’KTdö8ÏAŠÚ¹Y„¡$½Ös“xžkw©K–4¸S{¦Ìñ·• +$f@VOwFÀ‰F ƒÁ_þ0üMøz²ü'ñͶºÔMÒZø‚Ök™o%Ú¾ÐX¯Jìë’»òÁ2I9zƒ5mLçŒ OCñm†€u;_]\M¡,E¦· –³x …vFo˜7àõ#dÔÚå#ëŠKUsÖ~þ×ß¾xOÄ^ ñgŠt=cOñ&‡”ðZ£>w7œÑ”¹ŠEhT3Ä ÀG ®XŸø«û]~Ñ6ž{jú{`ÚÄWϬYË5äQ§–ûÕÈR¢eDm‡KØÞ'ºÔäÓŽu¦¸•âà–Êð@ ã®qÈôô¬;K¹5½MâÔ®ÞæY%¸½xw«!yˆbØžO˜g)B +îsÕÌ+Tj+CöS°Ð-|;öËK $´»‹Í°¨ï÷_æ!~`FpAç<ô¬­#I±»ÑŽž^+]R(šm3}¬Ë'“æá“{ޮܸjØÒm쵇×04mlÖó»A$Ó³Ç :±'+·°Ç;‡©©|?áøa·_]ÜÅ Ã Œ4‰™™‘ŠüÁàžA¯ÇëF8jn ¶¯ùŸ³Óæ¯V2гµÈþø¶MwÅW:mþ¢–6ö*=»mÜ8G»~o›ŽÄŠßø…£¯Äßè·“½æ4RÃwk$…Væ'R¬ŒIŽ{Ö?ì÷áøH|Aâ «¨Rä9ø–ïᧉ~'…õY>ͦêZ|í œK˜ÛpUÜwœàOJý+ñŒð§ˆ‹M$¹•šív¿Ëä|V'‡f±”i»Û¯Éì|×iñkQµvm*öâÑÆáÌrtÊífœn{Œæ½OáÏüKö—øG '†üñÿ_¶ÒíÀÒfÔehüÈÑc-9Ê(U!ˆ9ƒä_¾ xãà¯õ/øãG–ÒûI»6÷"HÙUÏ8tÜä`2­Ñ‡"¹-¬[nÚû*•¡ˆ¦¹ã©Y«¤ÓOgæyü[‹^oüÏrºý¼ÿhó?uñïų±w“)¯]™¤2ÏÉÜsŽí{ñ·CÖ.¼A៉"Óõkçy/5='R–+™&s–g“~ç$ã,NO|ó^XŸa±‹Î¾|*Œ±ô­×W¾´·ŸO¶‹O´u%Œã'ø‡^™ÇlŽ*áìÒäQKM’_ä9RŽîýõlô_x»Æ~8Õ¾ÓâVk´'t²êW&y%ˆRà d“Øsï^éû=ü^Ô|y€í4k«OTŒïes%»¹D&5Þ ©às»€§æ¯ ÞÅ¢["ÇrÓH­–˜žüp9éÇã]Ö‹âgÔåŽaÙ ÚÏ+8€äíÁëøzò+»—a3L²XJËâòÙô#Ë•lF«Ñv·ôÏ»¼Lºÿˆ-Jêší“}†S2XÜF H‰c‚2N§$óótÁÏ+&®Ÿ "´ñ/гôë[\\ì &ð¦6B\ €AFN@É;øâï‹üâ8—QÖî.´«Òñ^¤÷òE¼%V. +œ…$ޏÁ9™â_‰ÚwÅ¿/‚¼{ñ2Iôß6¢YO©È"·)‘d*§fЇpP¸×๞K_"Ƽ&7[Þ:ÝwGÞàóŠ…mMÚ]ŸsÜõ‹ˆžÒﳪ\üë Í{¾âÁnNåQ‘ò|t5ÒxOÅÚ—ao£Ä·º‰º“÷v÷0G,sDX6²3¨Ç@sœô댟Ùjšœ³¸#{ Ä’ìÞ̃j~î8$mç'=j$×vöí©Y‹ÉYŵ̌¥U»qžùÇwqšÖ*øŽFê(¦Žº÷ÅÇIððÓtX’ ZfY"º;·ðIÆ3žp Ó–øsÆ括[ê óL¶ò±¸XPgå‹h€0É´€SéTon"Y'´·†Ùf·¼&éæ‘°B¶2ªGs»ß'×›n·>"IàÓuÈþΆie2›åÚ£iŽ8äawðwò)B3‹º¹”ªÎ›Vv;¿xÆÃÄwPj6°Å4P íïî®Z Ç;K ùŸ®0 Ôg˜š ô‹ÛJÒúpóÜÈž\ZR¬3L¹• yÙ•,KeBÙÅV«éºrA©iú›DÑ¿šÊÍ·iÚˆmÂîì òç$ócMÕõ]Nn%»Y’ €Â\²þ*8ÆÄÀqœ’O,ãË$–ÆðŸ2ØÐKŸÏ-‹ÚØÝ<0•7qéC]»†æÉäg;@Ë|ØÎMhãÄ0Cs,—±˜ÚY þþ.å'pAµY€ÜGpJ,z„u»¿á!ñ5ô;ã3º¡ ‚ë¨T®~c“ÈdŒqPj…59mì¬íoî´ÉäHìõx!2ß!@Þ[äá—æs¸’*~wr®¤Õ’4t»-ÄQK Ü—3B#K{îPŒ'”ÁxåA ·9ê¡úæ“u¦[ùkz‹O§Ÿ³¡¶º‘JîÎÕo˜¬ g5õôÚ*–ž¾ð­Õ–•uªÎuÓÄ)AY–\©‘‚D-’yÆ Œ.¥62ÁþÃU’Gfž9RD `í ¸é“ŠÖ3|«[('ÐáõMVÔ–k-KOY7ÎÒ[O •;ÂòÌNåbI8ÙœŒ“YšN™6“=³[+ºÛ\Å4EÕ¥PñÛ?»;pOB$#¡¯LÖôõò†¡} +ss6StGÎ åµ¶’>|çŒpW¦x¤øÄ22ÜæÒ ò¦RÐHÇ€¬£3Á=EuP©íUÏ3‡T¤—sö^ûK»ðî„Eäv’Ëmld€(iNáGažíÖ²õkvѼ)%ÍÓÛµ²È·§18O9UJ„Êà‘ó[éÐ)=³zª³ø“X±Š_Ý©Ž®6sÔm' =³^wñ?ŧÅñãhÄÅ Æ>ц@Ì3’6`à¶'òé_‘Ôj­eô¾§ìÑ~ΓŸÈ_‡ÿ!ð½„6:t!d¹¼yo¯$„’w0;W‘•QȆ>¦µ£µ½ÝÖ“m+%Éy^Kœ3™X ž?OJÍÑü}>šom´åŽÜ„„Ë*ãGÝã׎O©5jkËmˆCsÇgÒœ•Mû=Ì9ª(.}ƒB*5ë A]”«›oQׯç\wÄ‹‹É5k«¥_Ý—bÅW€ Çù×_q¨i°~þ'­Ïá\Wе7¿i¬í1¸uÈÈÉÃqŸnkZmº©ØŽUmÎ;ìWS•T„¸_šRŠyÀ8€zô­=ÁöúÌEôkûˆn&·HÖÙ”º¬®¤±¸ %¸êÆk¥Ñ|<ÓÛ:Üĸo$eX8ê[#F9Ç'ùz7„~ Åu!º¸XÒd#{Ää&Î3ƒôëžÕ×.zµcìUÚ„ù#M©»&|ßñ§ÁZÅÞ¯?…uMy`d­µ¡û îèK´Ù^„ôÎü*ø-á߉>!ºÔÇ‚md„jolÖ»¤žT€¥›‚¤Œb¾™ø i~½¾ÕôÝræU¶³y.­–ñ„nyÜHÈÈ dú/a_ ~ÖŸðQÿxwà×>øHñ –³©êͤëúÌñA8¼ÓÐ8x "Cä´“á oôpÇ!Ûé2¼4â)Ë †‹J6æ—H¦í?CÂÅæL®1«Rͽ"»³Âÿà±þ_|HÓ?g߃¶—­øwà ö—ñ¶'’æi”“n—8ùášDp¥™¾þé6Z¿XÙ ÜH0<´ÈÉä¤ñ‰îüItoïä rï…H×äŠ1œ =Æ[¯s“Þ°îo&W6R(eÙó†åF{ãûßÒ¿¡2Ü%ÁC I·-ÞíõoͽO‚­V¶2´«T²”¿/‘¡-î˜ÚÁÔì I¢ŽFû wcrªg*ÄËcß<ºÅÌÒ´·72HÎåö–ùTç<(àuô¬˜„jÿ+ vn=»Ã•Ï5ÝNr¾¦SŠNÝ >æYÜeˆÇl\}­ëà >VààU»ÝA€ 9ÜW¡N·$N:´yåk¿¦êZ~¥¦Çm{¨Âò_1wà‚N>þ½+Ót;ßø¢tÕ Òì-u8­‚I¦Ç 'ÚÏϹ£l ü¤ÆOb@ÀÀù>ËT¹[Èe7 ^6T…ŽcÁ ž˜â½·Ã×jÓ-/­e;–1²PÙ ú†Îæ°Írœ/a\'îÔÃ/Ñùw_qÇJ¥L¢·´Ž±–êßÖÇ«øwÃÚ›\ZXé½¼°¯î!•‚³ðÊ?y‰ôèv“À®¢]*ËYѦòE’5‡Ú¦ŸQs!YMŽÙz)BF:«r+ǵ?Š_4Ý=WÃI§ùŠ„\Êmq<àò~l•'ðîqVþx·â‹üLmõy#¶´éÅÂ;3ˆmL{˜¯l þ9šðþw“Öýí&à¬Ü–±¶ÛŸY…̲ìeZ~óM$÷¹èZ‚jn¤$Óm4íBé%&dyYJ‚Q~ꀕöYÓ΃od_PbÓÎè±£d!Ws¿(8<``ƒž:šNŸ>•uÔº„Ïg#;ìòK EEHFÀFs€rÁOP2ÉuÖ.š}ÊÎ`nÞ$+Ë#¶w0/Û°0p:ž½kÇŒÓnF‰·b ZËÖÍ&³wxÏ$‰pÚÝ&ý ¹Êô,I m¸÷­Xì´GŽ Áa½å´{ I-ˆÝ#c†`·ßHf ·¬ý6}FÂûìÚfœ±]yã|Í‘6d ŽtÈà u5ÖÙÞNØÉp«örŒcš'+Ô)\¬9ž€€%¶·èzKé—†{³%ÅΣjf!nÔò Ò1$¯qÜ¿Ì§ÒÆ&¹³§kúMLjmŒzKê†âÆÝbGB*¾lxòXí\òrN7¬u=_@ñ>­s®Enú¥¼@_\\2³zóßoÌ É^yå4ëÉõ)äÑõ‹:Ý$o´ßXMbÌ=ùM¥dÚ¡ˆ$©È%r?¾&x7NÓ®43T‚gÔmR‘áU0Ƹ`ÞÃx €3€qÖ»p9f'6ÆB…(·v“·E¥ÝöÑ\ËІ“›ß¡¿ñûÁíuq¬Z[HÒE)h"–"‹& #ðO‚8 £¢×–x—â;x«ÄÖ÷Ò¡òEêMäi¨T”Î môà ­þƒYRxÏA”—[i¤c„Mªï©Ï늎ÛÅ0Ë+.šUd+þ¬"äÀê3É?LšýFŸ‡X 5}ÌD¹^ú+ÚÝÿà-S:Ä×êSWGïïŒ- Ýj7~Fqß©¯7´í9dlI «Î8ÉÏ ãó¯PñÆŸuá)¦yÔÇ$`©UÉl©‰hnø«âœë¢E “ËSŸ’0ã§Ö¹˜5ûhÉ%®‰#…8“'w®1Ò¹ßxÂÓÃz”EÌ }{3o’$`UÆôç>µÛiÓiVú|z…º8i"$@W#¡äãœgŒpxâ½Qj6вîyÕj'+½Lcâ½FäCm ]ª)Ær¯·zWð_ŠßTƒOm#ø¢^ºønþÂæB'2 ¬å(ÎRL¢ ÎJa†J°Ü¤sÆßT•m9Úô1•wM]%ó=3áÞ“ec¤®™¬J“<%‘#ç#;±ÆÞzz×Q«øÏ@м0nm¦†&ÎÆ‹*YWiÃñÛ?­|»ã_Û3à÷äÿ„#Uñ¬–ZÖ¢¤G¶Í *®í~÷ ¶à~\œckŸø,6µá/Š’øoàýÖ‰©iö¶Vnº­¸7>\ꘊÞjÆë¹ ‚¼œWÙd9e’ÃaagkóJé[½ìïò>˜P¥iQß[Y[üÑõGí#ûs|%ý›þ2ÁàŸK¯]Ì,â¾ÕmtX${a"‡Š9LÓ GtÛ)ჼWãoí'ñ2ÇâÅrëÖ÷6šCë73[ÛÏp¬û^WxÑÄxPUXŽ ôäVÇÄÚëYø™âíKÅ>*²¸»Õu‹Í÷w7e@ˆ¹láUTµQTpyWˆïc¸Ô®ZIß;°,Üó‘î3ø×î9å¼?€QÃɺ³KÚ;»6µÑ>—oÔø\V;˜ây«Å(žM6¿•ˆú5¸\dħ.d‘íUn.þ×{-Ò) $¤¢Ÿá^Ãò§]Gåißh‘€ &ÞñŸþ·ãT„ÀŸ­z5'%£õ*0M\ЊA“ìjh.B·Ö³£œ¨ÂãÞ§ŽAÐ~9§ ²%Ö¦´wD qÏZ|“ŒðH§5ç7FÜZr_3MûÞ~SœŸ•t*·Ó©Ÿ#Nå¸îV)7¬:ó^ðÇÇF!¥\Åæ3åmØ#'ÜוMvñ‚ø }:Õ½3ZžÞBc—‘Åo†Æ:5.sb0ÞÞ•™ô|g̃)ÁÈçùÕïêqxwâ>•«ÌÌa•ÚÖé ùDn>÷Cƒ¼'5ç~ø„“ØEc¨!b™<Ìã ç'ô®Ù%,âѶ°ÃFù à׳™a©çMJÌ´õéøŸ=S‹Œ»3Ú<%­[_Íz–61Mf†K8§Ã‡Ì™;X’qŽ1‚Frj;Ÿ é:dPÝX\\C&ÐcÛpÒ¡V!™B®:6TðJ…<àóÌx+_y|FÒêñ-¾5…·ÚÕ#Ùå’YL™À‚’=IÏ5ì1|1€Ê¾!ð6¾Xže’ó2ó³:’yÉq¸¾~øÎqšþq•éJTÞ3ïiþö kTrZ]ÝÖ£Ÿk¨B—o£wPAÔ¯N+ Ð<7d4ò±J¶·±±¤œÆãhH< c¾j Góü]„vrÙ^*fÛÉóSž¸É=@É=8ÉÍu7‡ šZÒî[«Ø¥yÃ4PHªñ±fRÅöðÄ c;„нë¦ñn‹‰ŒMËÙO˜ ©Œ«1*8ÃlÎyã¬Ý>Ë^ÿ„Z+]ͨÜèñì讂‚å“ i™|ÈËþðr…m¡·q<ênýÊQTâÔºz_ˆ|9&{i¥è–í 7V÷Ó^î þ^ÆìÈÎÞ ±~GV®xèóÇá-~9áHVØÉÙ“÷pí‘›•p­Ý2„õȬo¯ˆ|OãªÒ´Öÿ¹Ó,æhжÀ ûÞX$ äÇÌ6í>ñçö›ñOŠx#×ëm§ÚBѬÐGI‚~_¿'#“œõ$×½“pÞ35~Ñ{´¿™þ)wg-|Êœ}È«ËúßúÔê~=~Ò·º–¡/‡ü5­ˆ’<ÂÑÛ\±y7 Gga‚Tã7rA¦° ¸‚CXåÙ‰%‰9É'­L³Á'ñ¯Øð8|6"£¾ÿ7æÏŸœ%RNSwlÓ¶½“xR'Ž{ÕÃxs•ϦsXñܲÙç’E9ndp0ZíŒô±‹§~‡ôðòöÂëÂÖzHñH•mÊñ9™J’XãªòÄàu]ñž•rZçUÑåÒ¬^ÿN0;Ü1R²w‘yÀÉÀÉéǾSðí?«|<ò<1­>›¨i¶« ÚËÊà4Ž.;}Q@''o²jÿRÄlóÒµ´Žxròk/é u2í[ytäòå<á—c1c#åÁ?Jå>3|xð×ÁX¿·|q¢O¥YZ^½™áØèˆŠ[årɶD+œ3î øóã—ü3Ãsjן¾]M˜ÌZ‡‰õ/7k†ÜàC  U 2îsóg¢¯¿’ð¶u;á©{‹FÛI~/_•Ï;œeØv¬õìµgÝ:Ž<1ã JétÅ×.ÚÈê4ió8“!!²~^ äûã¨üÏý´?m?‰¿>$_xWÂþ0¸Òô=6y"³ƒFš[: JÀî‘ÝsÎߟ޸¯‰_µ¿Å߈:}Ö©¯xºåbò^7³³Ûn®@)å¦î;GÍ»'êkÊÙ[ìò_jÐK%ÍÌ®òª ÎIäd€ãjý‡…x –GZU±Ž5*5¢µÔ~nÚ¿N›Ÿ›qój4S„Sïfÿà/&gëzŽ¡yxú…ííÄóÍ;O$³LÌZV9.ry$ÖDö¦@Ê Î=9=¿–?*ÕûZHæâ ž\m—(WpÁÁ^={ñÐÒ6à¡dŽ)7¶\£>ßxóø‘_téA¯ug5£8½bÞå "E*„—‚•"jñ¢2ØùH8çÞ¶µë; —–KXY_nñ‘°$žœqÜ:Àû¤»’€»æ;|©žIïÒ¼šÑ9¶F§K¾!Ö-A²Ó­ÙKµÄp}ÜŸr[ò¬´}àÎ:ÔÄ¢1¸±À޽ëÓü%¯I©GöIðYäÙÐ }ëÌü)lZÔ8B}¯¥u~Ô[NÕv²à?ÊsÇSÍ}^N +¡óXè)ß¹ìý•×ö|š…Á@%­Ì„†^2ín;(ŽAîAëá7NðíÕ«h¾(Ô7È,whÏ`>ð \ ä|àeAÀã8ùœ$÷Iim´·ùP•“nTÎNG¦{3šöÙwÇ:ü!ö×þ$½¶žêÈH Häó'û?Ë‚ AÊ¿ÌFàÚNîã,²Y>g9/‚~ô~{ýÏð=쓱tãºßäzŸöMÿƒuDû|Eµ‹»6ýò³¼®ý¨ÌRO›€2A½ô>,üM—Óëðе%ínu$@G‚KH©Œ®î ‚$Ç©càO üKWšÃÄ7†ò ¶³'ÛAò× K¨ K’„.ÓÀ*à14¾#x\ë>—$% ’†ÖÜîA´¨' Jü¬8ï–<ñ_ŸGB´Ôúß¡õ¯ VŒ%%³Úß×âfj:úÖœíÈ·¾!~Ô > •ð_€ ÿ„å’0M«Éãø`ÛÆTŠà~)~ß|I£O¡|=ð&‰á I¬VÎ'·ºšòîÛ,Û¤Šw*©+! ¹cFJá¾jñ»ù#¸€ÅÀ#ÓYƒL¸¾r`²‘À~ ‚BpGçÖ¼¬/ä8NV¨óÉu–·}í·ài<ó0ªçÊŸEùwüKÞ-ø¡ñÅö)§ø³ÇÚî· Wå¡½Ôæ¹_4…¥!ØüûWnG<(è9¹^öW!Š'uPb¹b^zàÞý?N„ø+^–¶.åCÜ*y̯†rFÄÝÈÉ8Ú½øp+¿økûü^øŸ­Ågmá A,ã–#¨^ÅfÒ-¬OÈ•‡ùrÁs¹€à×­^®IάãN+{´—ü9ËGž¼Ò„\›õ‘ä+¥Ï¨[Ào`;[3Ì…Û8èqº9ëÉ$sòò·p]]Êñ[A#¸Ù‚Ä€+Þþ?|Ò>êö: ¯Ž4ÝfÚk’ÞXtù Âdĉ'ñïIGæ6éÆx Å~ðí¬ž/¶ºhç³Ëy¶ÇwÏÐ “žqƒ¦XLf5èNñšºoK¯šOð2¯SF»¥Vqv·cÊuØ50 ¾°•7!hc“‚ã8ÿ?ΰ/5vWÝw—u„dØb½ßã/í»ãÏÚ£ðo‰M²ZHàÜÝG¤Û[ÍtÊ›YdD å‡Ó íŒ|ýâ/ûnâH·yeÎiÉnqž Gá^5Z••.iY;ì×ßd{a Tµ­×OɲÜwÖ·vâA”YÇú®2IÁ€sYÚÜö£|vlCÈ1È0Bg9íÉà vÛ X Ä0$Œ¢÷o¨¬¹žkédÕòV6oܯ*sÓ·Jâ­^rŠOwùt©$ÛDŒÒcaÇ‚˜Œ‘šˆ] X¾”Æ 7/ök—™\ÙBL·¡NXnú•#L«÷üjšJ¼î9úzÍýóù ¥4ÅÊú–üÿö…#\lêjçó¦4«”gëO˜’W”66ñõïV4ÉÊ\! :óÚ³ÚD=:ÖF’PwîiF¥¤šƒ³¹ì pmF#ªæº+³mke«?™ Èæ-´m+•8É,íÈÿžxÉøgwÖYŒ€½öâºEZuY LÙc#¤gî­Ž08ý+ìèÏš„Yó5¢Õv™ÞxoÄ6ZŸH$czd¦xúWI¥ê­áÏi³G¨½¦›y©ZÉw"»È6䉪žGÞ8;^UáŸA£jb[‚vcæÀè3Ö»=zßíÖI$^cy46#ƒ‚qî}kÀã,LÓ)Ui«Ê›wïÊ՟ݹ|Ö g¤eùŸpi>+¾ÐµØo4M6ÚÂÙ-ã[‰YÈ pÜK`–cž@væ©x³ÇÞðÙÔof¶?by.åÌ2 Úˆ Ú~i‚œüÀW„è?´$$ðXðûAçxšÑ +V"K¶Ú@x‘θ` ñ‚A‹ÅZ‡,üý±â}K9µ+‰¡µ‚îébY2±çnÍãç r§vF¯çˆå®Uýå³ûÏ¿xÙB•¯¹Ûé:^®ž._ŒZ$ÖòÝ^ËjÚ”Y£ÂÁß{ò}Ö|Èç×Å´…¦ñsQµ³Aµ™ÔH_-æ¸Ý’1Èq×i8×Ö¾(ñV¥ðßáD)¤éö–׫f±ˆ,­Â%¼ŸÄ6óÆãÙnNO\Ÿ‰þ"j¦±âYõmfáâ@¨Dy F3ëÉ<õbkõ¾ ÂT§„«Yü-¨¯–¿©ó˜šÊ®")½Roï2å˜ò úTŠø_©èj¨”dاnÁÀãë_`šD8v.DïΟj‘'d0M. µ"ÈÌֱ›±›·,¤Û¹$~U$MÈ!…W»J²Ÿá`+DÑ-\ý+ð_ü÷ög×<#aomñ¶ËSÔ/!`ÚÃê‚ÎÒißfÓo–ååŠ%K«ò°R„,ºìoàχþ<»ðÂ_ðì­nb»š;Ifd>je.•‰ó±‰U«’¥‚ úׯ™¬!{1cŸ´I–.åwÇ’ß6Ksóm< tíüá? |OðŒ3Ålm"¼¶yî|ݬ±.QTm@¥ù™•ˆáAltùׯœIŠ„£^´”èÿ+ZÇéxw)£ÊéÂ.Ivÿ=Î.Ûá¾xBºðìþ Ó.4Gí©§Ï©´šuÌŠ_l­J§ï&A“Ž1·$ïx€ø~-~ßÇúO‹."y®ÓÍÑåToÚÅ›j´ØùˆËï|/×&ðrÞèú¯ÛoìfoµÙ5ÂËöhQ¼Å‘C½ÀøÇ#¯7ã» |3ð¥âßÉq,:f›%Ýô0‘Ô\m]’7¨>b0Ê9RØ*â1õ£7)7k^÷»ó:ùaB›÷RI\ù þ YñÂ>ø¢³ÚÙ¬ðii—±Å Ē̳O9l©!ð³¢òóù@Æ~Ö|Jf–ku}°´û¾ƒ>µèŸ´¯ÇËOx—RÔt;yZ…ôó¿šû€I$v)ž2y>‚¼"ûVy\„ ð_ÐüÔòÌ®†›¿³‚Oׯâ~uB…LV.®"kâ“kÓ§àl.¿%­ÚÜù¹XÛ¹µmâX³šóûrÒÜ#4‘¤î@^¿(PrHÒ¸¦¾L€p[#'8Ñxt—Ó¦óYdp¯ÆHõëÿë®|=wRN,î«GÙ¥"ɵkÒmäÔ£ŠÐ°ó'RÈgLämP;úèjö§ci‹a D`L·œ™bÀª:pp çû¢¶¼˜ýž(-VWŒ‘ (RÙûÍÀ>ú/½iÙ[%ÜòY£îX‘f ùd ö$ãù8®út”×›ÐæOÀä¦Ó¦·˜í\…ç9¨ç¸F+ºÔÆHàõÒ_i)j.$%„ŽR³ÛÓŸoçY®aŒá†wqœgú×5Z¦›HÒ•hÉ«”ÁqЊ²úÄUu“a dýM5Ù÷mÝÓÚ¹®Í´-yŸíÊšì8ù€ÿ€Õu˜Gø4œŒî¥ípŒQ4“ì9yÖ3Œ¼Tª²¹Z=áöµöMJ%µ”ˆÈbcõ×µvÐÜÜ^Ú˜F+½F䆨¤•ëž3ƒŒ•ù>ƒ$–×É…Hlõë^¥¡ßMu¦,ó¹]§üšú첯´¤¢ú9ޤ£>t2æxešC< û²UUãäƒO=r;zî<¯\^Ãý– -±˜;7qØõ¯?Õ¥wŸ0‡sƒÔ×KðºóO·’[ÍFd €ˆüÎìp}kÕ ã*Îg£ùžv* Ñæ¶¨ö_†ž•òÆÝm'Äé}·÷PŒ0'#>¸Çùì·^#´ñ®©{¬Þˆå¹¼3ì–V™±àn³àôsÓiéYÿµO…&ñfŠ-|?odö®eòàŒÆ²Db„oË6æàgcŸÐ°´ðü=†§–Փ稔¯ÑKD×Ï¡äÒ©Ò¤ƒƒ‘Ûÿ­^ö¯)åW§yXÜK×½vE"Åj«[³ûÇÛ‚À’{ç§ ¬{ëIT4Ê +î=ðknÄ۾ݒžR¾3ÐŒý(Ôlà’ÜÌ걺¯A÷fä}Üó“ž•èN›©JíÜãE;#ŒÕ,¨q(v~[þª©5«[¾É†_oA]Ôéºq»ˆÇ–ü+3P´$4IfTÛŒg¹?ypü¯™*·²1Äy8<ŒóŠ ùCq$ƒÜš±uf D·3¹íÇSK=³ÝD7±¡ÿ–D}¿úæ¸]9£¥>b ʻԚ}´Æùb9 ´±'·OþµY}+Ê@ó0vhƒì‹’ ôÜ•-½¬ðÞäüªIÏðƒŒåùV°¤ÔÕÌå4¢ËöL‚áU\(’kÖ<)o Þ‘!ÖTh‰™ùÊ Žàv$W“EÜ޼šô?†W@F¶è¦RÎ|Õۻˌ/.'%p+èòɨJÝÏ0‹tîºjÌŸk1Æ *|¡IåG¥[ðÄÍÏ#ãåsëUõ˜£³¾šÝnüöI<ÎrdçïsÖ—GIJ¡qõúשûËž|•éájÖBúv¡2íp K!ïéÏùâ—âÿÅÍkÄ÷Öš]î®÷cJµH#ÞÃl*€ªBª0ìäg,=ë…¸½ŽE*N}x¬=GUŠÖñ¡iÂ/9vêI9«¯:<Ê£ŠçZsu·k˜ÑÃ>gfìút=[á«©Þ<[Æí;fET9Î~n:g®y÷ÅzuŸŠ-õÝZ_xµîa·Š&Šõ–^€2î@3ƒ c‘Ñ€Û•?>|.ø•¦èZ¹ƒSºÈÊGŸ,¦4Î}WœÔž zn—ñÛáæ•e¨ø‹^¾²’íÑÌ3iê æ3¨0¬À¶ÁŒãàx§ _˜R­‡‹“å¶mÝöèwáé9A®¿~ˆðŸ¾µð'Ä[ý OVâC$ 남Ìp?!Ú¹h›pÎGà+OâŽÇÞ+¸ñÖâ=à$k´Ø Úòœóô¬mÅx ½:sœ ¹·=E‘gÍÝ÷OONiÞqþçòªÁŸøŽ~‚žnê¿­k Q¹`Îã«â¯èL$‘[¹Ôæ±Ìÿ…lxSyºÞ=MtaåÍU# ÑQ†‡é—‹¦ƒÂ~6ûNšìÖ—N'\…LŒ û¿6F8éïZþ‡Å#ñ„oÃÛiî&½–_²yHÊ£= àU?yÏõÁÍi©ê:Ý·…t.ó\¿º›÷vð1–K†—*‘è[!³·»Â~ÒµÌ?|%®üøOugy®ëˆlüUâ›YdxííÜtËu“ éûÉW‹l%€lþ–p­|ߨÒZ-äÖ‹»õ캟w‰Î!ƒ¡Í'~Ë«þº™ðP©ñ[„~Õ-ït½ òinõHÒ=šé,²Î¬™-b]Å@ àƒ&Å~6²Vž!´'8ƒÇ ®‡Tñΰá¼ÝE¥ÜäŸ3“Ééí\_Šu«« Ó+m®Ã§Óñæ¿sxl»,Ë!„ÃÆÑ‚·M{·æÞ¬øšOˆÅʵWw'ø-Žrî!£Èã±ô¥²µK‰L“Ê#Š5Ý#qŸe¹=…6åƒ^2G@Ň ÷¨÷ï_-8PsÏzù×nv{‹áD—7Ü\»CÈÇ!9!{gÞ¤´HåM®ªïžjÐSc‘£l©íN3´®Äõ5m¬­áq»qa Æ}ýU©oªZ¦U!#'$óŒ{÷5‰lÏpƒ.TgAäz¶²¦3¹Ü£÷¬W$ŒößJ£Šº9§oˆè,õK™bØŒœaWµ­«öˆ—Í™Ùr@Øüzžù®GN¸ª¾ãµ¤²F}3ëZÖ`Í"—W-×é^ DšK¹ÃZŒV¦íݽ´¬Ñ²¬»C!'óÉPN Çà3Y—štÒïÊuY‡–Ì#À9$ÿXRI‘¬Ã¯CÄ‹Êýj³m'Û‹D—ŽÃg}£vVÆGò«¶JU–§2s†¬ÁþË7QÈÒÈ-ÿ+cÐcŒöãµIm¦ “¿b¬k¶޸ÿ=+¥E²žVŠØCoe’L;Bü½8äò{Æ›©iKkÈaÚ…wnNT gZ˜àÔUì[Ä·¢g2öËGÁ~®rXƒü³Ú›,’ìò˜ü¥ÃÏ|gðþu{S1« ‘YH Œ•Cßêz ¥¨Û$AL˜99Ø•ÑfòÝç8áÊ8õ=:VГOC9EJ&òHQRpŒ²˜ƒôÏz¿a¨Alÿ0 Hà7©ßÒ°ì‘I$Ç ¹fVù·¹«¶’ÂÎ$ó=vûã¯á^•­4ÑÅ:v:KmGdb!nqû眱õ'<Õ׺žkY"ŽÕ &a+Ó·Ï_¡ôôç ½È÷ ›,®FO°ëøV¤‰4ãmšÈ[ÍRK‡ s’OöëžJnemÎ9Sqwf6¡tñ£PY·îf#? ÇðŽ€zŸÎ‰ÀŒKøþU¥¨éãÍp%ùÕÈè@õÀúgùÕ'_(”ÇÝã ¯>¬g{³ª2V µL.e]¬yJì¾\ÜXß.§j‘3¨!U¹§­rEþPÀg=1ú×Yð¢[Õ"‚öð yv¸ Ðzã= t`úÊF8´ý„™ÔÝMlÌZÖ÷’ZæIbÛæHI$’v€BŒ’~^¸À®SÅW} »„ÀaÓüõ®ŸÅfÊÆòëû2ä̉“ Ø9ÇÍ×®3ÐõïæZÞ¹uy<†ä€C‘Ӄƽ exQ¥ÊÎ,%9Nwþ¶D£(bÐÉ»Ô*¤!1@W'Íš©urÓ’XävÍRÉÉÚqí_3S%+Ä÷aA8ÚF°½‚wÜ®zgÖ« ÕÎTI ¤õ©ÄcúŠÅÖ“ÜÓÙ¨ì[†û¦€Íݪç`;»ý)MÆ>êgñªM‹B}íýñùÐ]‡ñ ­ööó¢IÃci§í6Eë7‹íÓüËžW=k¿ðåý³Ú¥•µ¶Ö$ŸJó5›+!Î}+¥ðç‰o4½)îÒb¼+ÆkÓÀb#Nzœxº.pÐÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?Æ×|¯ß]Kâ ÜËîe½¹¾´,ñDkp×2³,œ3áÏ犼)?‹<8Ú†õ_êY bÕ[™¢òc_1¢vv1Œ’˜Â… ¸€UHÏIáßپŖ}Â_5Kkøeh¦‹P½&B þíâIòe;•OE`ÅFÝÀU¯ˆÁž6Õí<ñSߨÚÀ©$0l‚éJoUQv¼¶uHù»py¯Ÿ‹©«Oåùœí*²Z[æxç…õ¸¼mLÖšÎÖâàˆ,⿺‘.à`3…$ß³ifçhS¸}óÕßEã‹ 3§è¾.ÔmíV7·û˜Ò$j¢¢ùÇÁs'8ÎâzËo‚~;Õ4¹m<+ãê6VÖÿÚWºÖ£8kuYfŸ,¢Có³"‡Dòð l¨káï„5=7W’ _µî‘o'›¦ØØ›™±H£ Æ3Lcs³6áw7ç£Z-éo"’© $ÌM#Äš®á;«ø[F´µÜ‰®"‚å )$gÍLN îvVÊ©,¡~S^Ñá;†–pKg$ ¤Ûµ½¼º¶¹gŽ;•P†â,F[vi~VTÀùr³Wáo‡ž·ø….•¨ø*öA5ÕÆ£/‘,ŠÈ|µšá[fæÙ· yŒW{ñ á_…“áý„Ÿ…å½ÛÚG%̶Щ(vºÃûéÑX0 +†#Ë jÏÙÑm{Ïô.nwÒ(åõë½OÔÞÓÂz,Z€Šþà[Ãi –·ãw1Î2É&äBIV~2XTÔ^ ð¯‰t:ׯ+qñÂæ\Ãus…žÙ¾f]³v©.7ø ²çms+oñSÃzô:¦n!:¥ºYܘn-î$kePb9ê¨ù%Tãv1“Š·/ø¡âa}¨C£ÛëhËÅÔ¯¢³¼.Z[fGòTñ†ldmÀÇòÃMJÑiÜ錡É{jtž&×¾*xL|ãíKQ±¹†/µC©ê³F7”&iç$ìrYð~PTÊŠ¾ñÆ‹â8!MÅ £ê‰„¶¼ÔÔ$D|ÆFXÄ™låR2ÝÆ âˆ~2ñ‚Xx—A±[O³y/e Çykö•ÈÎcºgªï8ÏÍœ’ ’mÁèÖ°ØiVzLÖÖÞSÜ6¤ñ^*9r þè+²¶ÈÜBíf«9á¹W¿£î­þgDj¹/u]yõç‚tû«‹X®4y§€$rKk{º“i C4%‹ ú˜ç[=~ ¢ŸLÐü!©ZÄíû›øæc$îDhW+€ É* 89¯8´ø}âY5X¬žîK 1¾¯…¶0;q˜Èô;›‚XŽÂºŸì¯Cybg²Y¡½ `{ëy‚$TuuàüÊprÜ`ðje‡ŒvÊUe5g«âû´ÙëV‘Auÿ4îì2ÊäEòp¤–u :A ¬ºÌšÌÚÉáø™naŽI5Ê•?Çû¶$†7á·­ÈΆ“ Ê,°øÀqM ÈGØÊ™$9++µw@aŽY¸98ŒøÛK³‚=ž´³h@[ygŒ”gp@Q·h˜ô*9n£'žÜ›Fï¾–4¿2»fç‰-a³··µ³ñ­”²“$—qAtLçæ?ëmØV^qÁ< sÏ_Ía¶X5D‹å²›` ‘µv.lm •;‡vÅ[;Í?YÕN•¤£Ú,б kåªÌe»_ååQÛ°RNÚéúg‡&¶ŽÖæu¹·J~ÔìÏm3 À`‚øôÃr2@¬ùew¹I¦¼ŒÁ>3Õ4¸¯î…ó5¼¼Ö²,BÛ!w¢’UW sŽNG'ŽGRðuŽ;xÏÄ_mÕ¢Tigfód¹-·'æuÁûû†X)߀ã9¯J¶ñ í§Úµ NH$k‰ŒL¤ò6•e\r‹µ€À9#'€Mrúæ¡à{Û€º×Ь–H®ü–{ˆÃGd(îBÄ•ËË“ƒ‚w1®¼=Z¿ ØÂº¦ãw¹…âOøgCøgæEk-Œw+¶;6xVU“i$hÆÐs»€çÿì¥Ñc´Ñ Ïwauæi—WwÉ4±áP@§q?s“À#r¼t^3ðþ‡ª¢ù=¹µ– KC6© hâÜéH»÷ãi À$…áHsäzî­ð~Ûâ|özm†§©Š&šö)¤Úì~RÌråFðr[p#n+ÝÃS¥Ùî|þ6½KèÒEjÚ߈µ+k;Û³¦Í Çvê²4óJqäSû¦!7mcœ•ë<;ð6ÏÅ Úþ™nf•"µIô‡¿&äÈÛŒŒ"ØÂD22í¡rܶwðÎÿáæ©kpÿ,uýn­ µMxÞÜ•ÊËlJœdrèNOw7SøsögÕí¥Ôtø®ÃeßI¤[[Û<ÊÆ%T’Ý¥D¡—.ŒÊ…£ùX¾Ç*òNÉ3š(MóÊW<ÇOðÝ®‰zú:j:„Å|¨ä·›UHLŒªÄ²…\íd^2q×­u> ø©}à=?RÔ4kx•ïb+b°é­xö‘ İX—ïñ"©ýâà½aø§Jø{§éßeµø±©ÞË:¶ D‡í23êYÇÑ@Ë0 ½òÅOŸx‡\ð®k‡¤i’ÚmßåÜA ‹kŒ®ýÊ `mÇ?1ÛžÒ›V9ÊTt_™CâçÄS]¾‹Jñeì2iË%ù¾[¹%DCÁx‰ù÷eX •ÜUAU^#[»Õ¼KâvÔuÏ´+ÌZ=ñæ.6–@2TçàòäT^.›N³ñ&©1%C ‰ÙÄŠ¥—)Ø,ß3>NìƒïUæ’êYâžÛV¶³TuÔ·ªa :ÊFAàçÔ¦áw[ž\ï$îgx›^º·•mmmåŠK=‰,þ@ó#e+œsòüß.y³ ­Æ¿ã«H®¼b­ ŠK©Ë#Ï,a3˜ÿ|ª¿Ý^ÁôªzÍýܺoön…%Üšu½Ñžin¬ðÊçfã#£qN_“ÇÝChéÚœú–±§éú·›cmsÂŦ@É»k3"®NHÀ@tb°r»±äÍrÕq½ÿ"S­i°ÝI è,òZÉ8Hî~ÐÏ3%dF/ŽN>\çgÀ2kÕ¾¦o®Ù¬]fµX›;‚ÀòrèA8?ZÉÖ|7kö½NãI½XÙb"ÂE¶´ˆf+ó*’ª^-Ä‚Ç[5Ž·Oh̳^F"¸„D¯qz6>åê¡H pN8÷®œ.™Ööxhó?ëwÐÊ­GCÐþ5|q×~"ë“Ü^ †8ã‰a™| pÈ’ørFr3ŒMyMÜsK¨2Çù’ª²2ž¡€íØ€FzõªZçŠü5cr-ïõ›xÌ‘%_Rœrßt|ÝóϹÆoˆ>"xCö²Í©åâBR h.Y؃Û÷AÏåÐŠí¡‘f’®âàãmÜ´_{ý "§VJZÝŸ¯7šv£ª^Þ_èvòM‘nö×:“ݵç”Lªˆp$pˆœ–.€¦ Kž.ºÕ¿¶üSã# ¥ÔÆ/’H–ÞHÑ£F•›k( JV;OñaŸâõž‰©éú½—…íZËJ³F´†c•nq*½Â¹C±’9FÚ~gby Ëãº~§Gyöx®$Ëu˜#O2çäbp¬7€gî‚pJõ¯†úÜ!+6~Nœ屿 iÖ*Ð"ÔﵿµMm§³HÞ\ª!ÌŒUÃù£ Br™ˆª ÞT¿RñLJ4Ÿ ßYßøê;»/²¤6¶·’e’5»/˜0çrºüŠpCîÊ•MÙcÁ~Õ/ÿ´|KáË™®íÃÜY†’# Œ¾`W 2œ’»‚íà®puü ü=´»»ƒÂÖÉsnXi6·²ÜÝ;íM§Ê’r–FÜ „~\œáL¹Sp³zzy)ìsÞ,ðç‡õk_ k­­†¦sª”š7‰§DZá†@Gïwe yP~m ëìßR»ð—ö5ŸˆuTÕ<¨á]fÒñ%‚¬—ƒí€P\á@Ü0\ûÿXjpjuªéWñÝjrÚLe™$¤ÎUåBˆ¬cnì£/Q·Ž¼5â‹Vñ¥ Ø½no*K8$‰Z9þ]òI…·¦C£¨WŒ®6ô‰EI' ¢”¬õEOøCÂV¶“^ZëQ’yÐ }N‘†ÚZ6y­™äÙ"3±‘œ¨É«h:Õþƒquá*Aes4±Û´6÷2hÁËJY‚­ŒrY¶IÜrXé7ÿn>1Ñ&¸dMJK;1$ vO8Æ¡¤Ç˜ëµw#÷™>fá§«xâWƒï¢ñ¾•im¨Ëunî÷ §þõQˆÞ \B¸Ç0PA8ÅdåˤÍÒU>s·ƒáíýÕÞ‰­Î,”†’Òýlç˜HÎÄ·úœ”Î…l?Yë+iZF“rO¡µá H[ËkÆK 8ͱIóí °*¡,6(sÇ;Ú ï߆²Íâ”°rÚ$~xs-Ä2!œ˜–8ˆ#vâ‡xWbÅw;íP«mæéÒGyàÛxíÄÊå­máIâåY¹\+$ç–'˜_Á’j©e¯xŠÊú4[Èí/¬î¬\ÄìÛw+;FK³ ‰ù¶’+bSö³Q›ÒÖóeÙS…âµïÐí¬?mï‚“xvKí ÃÚ4·‘"Ç%ÄšTvτDž,Þ£pùœ"bY P|ÆŸµ¾³«ÜßO§b4/åµÍ½½–.™Òr˜8}»›£|ƒ®Îü*Ð|!}¢xkMnˆ»ªÀ†xäp1¼*ŒêùCò GÄPi7rêv÷767·(°Mj™‰. jC<ŠT…bKnÚqò¯Ê8Ù &Ú{´Þš]ÿ‘Äëcœ-)¯DC®ülÖt]·—×ñ}¦à€&mÕ ó…óæ(ÚØàzó—Çm)|Jš}žùnL$\½³íf@Y‚€{óÀÃ'=&¯ðÏá׈µ»‹– "fÞ8ï̦|®°pc.s÷™pûrT‘æÚ׃¼/¦éëàÆ+5HÑ–œFÅ7¨wù7Ì¡hÓhëêSÂáM#ʯ‰ÅÚ÷7µ¿6­>ùu…·Šõ“ý]²)!ߴᘞYƒ<Ï+¯øÂo·ÜǪøš,ŠI,Y¶3HÏ“µ”0$ |ÙV#9à‚ÍSJÓü;¦Yj׳KoÓ»Åql‚+‰J°.#gÁQ•d–b#e ‡;dñœþÒ4èï,µ&¸¹–Ù&žÞ÷J’VÙ´íWß‘,1¿+4ƒh'ºqvHó«Ö«-dÎXøŸ¨C§ÛÇ¢X\)¸ÞaÔî¥+çûÞYâôo”.qžp“O“O¹¸¹¿Ø×“C&ùíÓËR8à2Glðzž‹AðE—Ä KS¿×–}Â6‰âI/]Ý‘˜ÑILä(û«ÉãÁðÂ|Do&ñeÜÞPhšÑ¼9llƒÇA“’}H®f”np{kÎÍÜoÃkV¥íuƸkKi]l´ù‹2¹s» “ò÷=sÖ´æ¾ñ,—¡lüKp|ÖÝ +;ÿ{äù‡\'õ<ŒÓñ'ÂI¼9¤ÿmAâif¸†'–Uh\ˆa]Íç˜oá$ü½9>§Î¼WñgU´ðõÆ‘á,Gq0!õy²²Âƒ \„o•HmÇFzêÁdøÜɹaàä“ÕôA[ )ÊÏ¡è7¾#Ôô=fy¼OlV+bvÄc (;r Œ `àe‘WuO‰ZY¦¿ªL¢k„?fŠT1Ÿï·Þí…'²Aè|«àî…ãéü>ú½åè:\ŽóD³’IÛ<°n@†ù‰'ƒßÛ¿¶·Õ5)æÖµ»8V%ùQüî6¯ *Œ=‰àÇšŽ´ëºQ‹”“¶šþEº°…57-},dkú—ö†¯-ûÏ›fr«æ\30 }ÖcžÇù^µwí¢òÒ-<†’0K´>ð;I ÓסÆ+SL²ðXðõÜö.ŒjñíßE%¬f.»Õæ@Œã¦7 p@<Óu‡­¥´z¼z‰xÞf{h Ã)ÀX²Œ©d9ÊǯjèÄP¯‡|µ`âû4׿pÔ«N²´]üî`kºƒ#I§]»ÚÉÉŽÌU2Ç'9QÇÝ }[¬ßhÚ–™â‹}A²i^ö5[k‹fl«¶ìÆ·g<`òqýáÍtö7‡æ°¸Ô¼I¦M€ù:}È@Óåwo*¹`˸’Hiåücñ"ÒÃP›LðÞ–Æà[‘Õâ <·-é»ÊxçÎ ë]yvG™æ±ç£ Bör{óá°Ó¶òìqÿõŸøgUo &¤Âd·‹íWÑMûÖ`6¼@5¹Ïúq77 qqö½IÚ土;{]I$©'''×­jÝiαqu¬Þ<¦@ uw#;Q‚Kˆ±Àû»ˆ÷¬©íQ¥òÌÁ•OÌÈkôì8 ,i¤®—müÁN2•âf^^ù×O:ÚÇ s…Xã …(õ8¨ä,#ùBŒ0;úšÖðÏ„.üGª¥ ‘cC–-!ûªá“ïÇá]¤^ð¤w­£éBâöå*¶R2=p8®ºX:µÕï`©Œ¥JVê~×àx2ãSµðÍŒš-èŠHtëh¯æ¼šòdS'‘‡aü# m^‘ÐøWà¶”/“Ä:–©42ZÏæ$^TÐG•%ŸÇpØÁl`mVnOxÇ+á¯kÅø§T×®­ôÕ¹Š;³£$Ÿf™vˆÂ¶ØÒO‘ð¬7ïã‡ô^ñWŽbÑÞîÎ ¡·Õìïxú|ñ)bÆZ-ü8áddlðàšþj”Õî}ä£ZÖ‹!ø¿ð³Á1ÌomeÓåµ·Ñ„ÓEâÝÀÂI$³20iRRB‚ŠT+°Î3÷¼÷Q‡J²øqq­éúZI§ê³ýŽÂþÖÝ…ÌÓ‹ù‹´ª)Qòì_¼B!uì>$êÖW𦙮øJHMÞ ðÃfº3;Þ\—Í ‘“½ÙAÚdaÆ@9Ê–üJ½ðoÄOkñ‡NÔ…„Öñ]j)D豿 ñ°‘¿v¢]™fÆÎtO°sriÛîÿ „gYœF±âmâmß\±²ÒþÑ|ÒÚëš„k&£˜YÚÚŽÆòç,œq »q¼Mã?ßxkJÖ㼇Nù‚= σír1+qê#ˆÃ—€(Ò*“¹J¿¥hÞÓxòÚÊ/Üø[Q¹Ò¦º/&¯¨is¥MpÃ÷jí"”b®XfL˜ž!àWDøÇ¥ëž(øcys®ÏáÛÕ·Ôt¨à†¸¡•¶ùÁcóB\º¬€†")zŠõa‡¥V›—._cÆž2¾§*üO³¼)ûIøgÅZeÞ·âû ò1§ù÷ªú§,"VÆIFôÝemñîWÇ lŸêúÎ¥=曚Lè²icaºHÜÜÌÀ§pÚ¡‡ÊAcÕWäíGâ¾±áHN±ià8¬ÞëMµ±°Ô4Ó5¥œ[Ë’5¤Øå˜aäÚñ†WÍ&½ïàŽux*ÛU]kM7Í‚H­a…ßd#bá ÅqÐ[åg$8UÉR«æc2ÕFŸ53ÖÁfK4§¿ævþñ>·á¦K;mV{5¸O £_;V;²;W'¡ô=Myγ­ü@ñ¯ÅýJÃMÔæ·ÑíöÝKÔvÑÕˆ(k›¯1Iù™V@pU8ëŸ]¾mem&K;C-᳂ËQ2E-Ó„æFJ²¢`œIó 1² P_5¶‘ ÝÛÞ¼6×VÖíimqå#°G²…-¬ª®r²ûØ®<%9Pœ¥-Ú²;q“xFz'ý!ž>ñf¯âýQ¦Õ¼9­¼{ Ré#26[ç9E+†;FpTí&­|=³ðW‰¼Q.⣧%ƒ@ŠÉ{}%˜rÏØfŠ6a"T *I £<ŸŽ<ƒsdžA=ý+œÕþ"\ß$zö)‚(¢Dyšr¡€Ãdüà ÐÀÎk¢8jõU¶ó2úÅ rß^ƇŠôÏͨÁgà›MBÆÞ+¯&h®®ˆ“ægU,X“‘æàÅCol€ÀŸñ§‰u‹dŸZÒ®¬­à´¼x¤œÄ¿i¹d”˜”yŒÍxƒFK±)È\׳h^ ѯ|=¨k7¬†î0¢ÚD ¡ÜŒw ô9T^§9g­xSE YøVãã'Š|k.ŒúÝÄò¦3H©ä´bb¾p$ ›`Âp¬€Nq^ÖŠ4¯{>¬§Rýû¿µèÚüq¿Õ4ýJ+#Ì׸4]„… ½FÓƒž¤ž¤wšÂ"} OŠæë:¬¶ë|d»y1€¤í!OÎ܃¹€àóœW¨xƒÄ>.°¸}:LvÒ¦˜–‘n’IÌe_ 62ã³.âJ±=ÿ…ü!¨O è:F­t¶×—JÅ噼³ [ Äðp3Œ“·ƒ]WJÚXò*§ ¯©"xHÔK«;à‡nC"îŒJ„œ‘Ó$ñœeO*Ä/ øÃ:k ˜V+ûÑÝ4I¾ >b7¹AÎw ¹`ÊOx‚íï"ðœ3K º!_B7+ǸeTƒÉéØñŸ\_SñȰÕü­KR–á–Õc·µoÞïfnˆ©Rç¶9'Šç¨å(8'ºÝC–T­{Mñ_@ø·g§¯‹|O5ûX,è[¼(ˆÀ•rªvTqÐg¹'ûC__‡½=²BŒ‚;ãë_B\ø’kHº¹×´2Î{dUÁòØ#Ëû´“%Ì@êsÈ®_á¿ÂŸhº%®µ©YE¨jsÏ$"6c=¬@¿îÀ  Ÿ“»L:ýg ñD²<L6&.IYŤ•û§éÝœøü¾ž6q«IÚú5ÛÏæqz]Úiz!Ò48Ö)‹äŠi¤ÝÔ|ìB/¨@ ÷Î!Hc6ÇòŽÀqŠíµxDºdñ¼šD—¹Æú<&XP>0H§c\\í½¸[)̶‹1[IØÒF¿.O^;ɯҸo6ÈñíÃIÂVæ~í·ÍÔùŒÃ Œ¢ÿ+­–¿ k¡q‘%üvÍ{(…'•2©»‚Ï8c<Šö‰ÞÐì<7§hf·f"‚Ña–x¬ØGm‚½K0† óVâ·‘\ IP0ã=‰gõ©¼5®üKÓ¼I Gˆ¯gŽhš?°Ç( 1 €1ù›ŽG8,Iï^gdXüÊ1¯JiF Ý=>wô++ÄСxϨºì1é1\ÚE«´Ð—ýÄg;ðeß³ dÀ@®^Ò-ßÅ-5£Î±ûÙZ›¤{1ôÏã^¿¯èZ^µ(Õïõ0í–âHÖTòü×1®Ü1%T) ±ÎO9Û´Ww ½½„w‘[â‘ÆéD]S' ƒŽž¤¸¯ƒá¼æ®SŠP©&é7ªéê¿[n_kï-í¹ç¾>·–úÒßNÑõTD™kh@¨è­fj>OµûX„ùqD ’;à1Á,G¯JÞñl‡O¿m:ÊÙ‘%ƒsI#}åc€TޏÆsž§ò¡ii¡36­ö‰¸%bYL絎õý+õú‘„æÚWoð9)Ô”i­l¿2‚…ÊêæÚÅT €H¤ýνGJ¿âíG_ÐÊhºtÍc«Ì–ñ„y{·ÌFóêO‘ÎMužÓì´µÕ4èŒr¨Ë¹çL/Ó§^k–¿ðµö»ª6µ¯Þµ½¾v ‰Óïs‘{÷ üù­'FT設þí é×§V³“Ûõ?\>ø¿EðN›¨M­k>"ÒoaÒöèiÓÏqmivf17˜Â ‡”!ós:“·–H߃á/ˆ:…—ö~ƒñãÓeaY@çe©,ÁžTgG%ðØ+‚s‚Hc“ö?çjRØÖÊòðí)eöxâtÊäJ±£;°s&s’€àgµ|9¡ÿoÝéú…¥ÕšÏL’Ë%«4s–Ã1•¢±ê¤·Îà[#ùf§³qq’ùŸ®Âœw¹ÞøzûVðœö~ñG¾Ó[MKR "o16*¹ÛË—É+°Þ_Š^ð–™ûÝiþ(¼¼»¬†³™é|Äp¨Ë¡’1(æHÎJ®$=yN½¨|A¸ÐËüG&ÛO‚ð5ÇöfµwmˆK®ëevŠTÀUÈ Æyz¼ÇÄÿµK»xô{ÜËo5ëMwÓ"›‹|ym˜Ï„) ùg<6í§sUÒ§Rª²K×þ ň©J‹\×>§¾øØfžÃFÓ>x;JУ6ÖÍ-Ô ÖRÈAT‘Z$d‘^H‚”ŽMÛÜÀ°°~ÐcW0ø_IÑnôø~ÍŸ}>³ixå¬1É¢«Ë*`>DM` Ë*ßÙx—QÒ.þÑa¨nD¸ÿMÓn®È‘$fa³yt}»Kǘ ‚9Æz¿þÔ¾#‚KïøÛÅW“ؽ´–ŸÙ÷VöVÖ‘ºÈ¤ð@ϽÞ1+¶âŠT³MjðÕTvM}Ç;ÄÒ¨´Ðö_ˆ_¶_įxV:•§ÜAâajÐÇ­hê-™‘•‚â4ó£Q¤‘Fи—llœ¹oðsâV…«ëZwÃÈôOÙi¨êrè“ÈŸmµÜ¬b^|"oƒí$±,WÈ~/x«á½¶¹e§iP}ª@ÇJ°ºûE¤v£Ël±A'’ŠÇˆÁe%˜2­Xž2ñG‹eÔo.SÅ×—†MtŸÚù·’R<‘¤_!Rä«ÂŸB8襆j IÙÜàÅâ”줶:]ü8Ñ®5)ïõ Y,o¯ßGÒµ 2ÓS+ĆC$r1ãŽPXùY?½TÂ`°ïŸÅRiÚ~›áé­ìa¾¶Ð-Ý´Ö´T¸1˜ƒ+B˜;% ï ÇÈfLùãW† û¨®g±Xï-äh§žo9×j੎F[vL‡t‘gÁv>:ê—piVÆÊð-ÓYë±YÜAY?wöC´Êde}ÒF[k0ÜT’ÕÓìÕDpaóó5d}gãÝ*ÓÃúž›{¤\«Ï§Ã Ô*by$ '˜«62NÖO” ¸í × ~/Åmkc­“l²E,Öw„•BÈİ Ø„ù‰ŒpüçkN‚¾'k¦‡Ã}oK·Õ­¢°ÜºÖ£xÛVK£"–I9ù²Œ8ÉóÿŠ_ì¯õKm/ÁÖ’Ý>›t’¾Ûfš –7©êZ3ŽA!yÈÁO®ÓG¡Ñ·m>Æ® jWµŽyÔNNïm­üËSêú=”Z6ƒ{ @ïÚ‹«Ý«Híå|Ò¸¸n£s*UF+»ÔµûM[KK VÂêÖÆBÍ#9©!Gn`°á°yà‘—ák3O[ˆ!Ð ·±eŽäý’iPû€Ê …%w‚À<žk Å÷ÐO$É Ë4pËþ¦y˜™ |pwtrƒKi»XæÄs_™îf[xþÊ]âÖ`¶Š°›Ø¢p›+Œ0'ï(=:ŒœíÀÿ„rÊ ëUº¸šYõe†îGmêª ÊÛ)iàÃ%ÚZOy“ÛuYUÃ&w×> ûÕ««maaŽÕfF1ebS+ÊààdÐ÷úUrJ×¾¦PvÕìrzf‘©Ë§K§XÍxæáZH†B)Æ:°óÊàä•Ë/b`Y·²‚˃À ŒqGÅÓêF «ùd6íio0E]¤n]Ýp6à€ØŒž¤T:þ»w¯ê/u‡G–Lƒ)8‰#åøŽîý3ŽzÖu¦Ÿ«&©.£&µ,¯3(Di¼¨Ç'– q“Ç88æ¿'Àpno‰j¥HòG­÷]vÜúãpðM'vej~½Öuf¿™ÊC#ä¨ô'¹Èý*k_ÚB¡Zዎ¥G·lgè× <Í«æó€Øü2Mhé¾ñ>£][è˜epyÀn r®=r¼ãŒþ¯‹Åàr¼:•Wwm4»g bq´z‰¥KŒ-mæ%¸'2C 1‚Ã$8ëߨ¬ÖÒô·-íÐûS÷{•qŒƒÇqï]ìžÓ¬¬¤Ô/µÇu@¾rÀWf8 ›prÝpÎj·Œ<1áëí/,#mN-–[€gPÌÛˆa˜ùPXã’HÈÏ¿Ì>"ÍkVä…ÆïNfútß–çl0”#g7çcí*ÙôK{÷ŸD“S²¹žöágˆ$´¹•ÃÇ*ÌXÙ"`²,ÕXÄ’¼Üº¬·2Ar¼É¯¬¤»&E”Hv<ƒ;D{a‚K´„‘ÛoÅ>4ðN3è¶Z2êØË}2_Á!‹Ì‹ÍSq˜ceÚ/]ÅCqá¾5Ôï¦ñ‘«Æ$³…V/-#MÐÌ $È[y}Ýyé€ ‚áaVq´íoÄýGˆ¦´îzW‰!Öšæ÷L±Ó&{”Ø×"ÎØÌÒ n¬ªYÁä¡Þû™RAÜs¯õÈt/Ç{âÏE¨Ø]Oç½ì°J÷V× Ï)¥ ‰¾Uo,°Ü«¸3(º¿kŸ<áOüQð/Ã6¤ñÎuWZ6CN–7¸0Äöý®9‹6F÷s*"·~/~Ô>øíû6ø[ú¦—ö ý;R–Ö[D³_JÑ[˜níá‡Ê›*¦H¶I¸Êê]€ùý8a”!sÏ•UfÙóÖ¹§]êºì°iº³M=´wÛÁ"¾K4%ð»%aq•@3òðTyxœíÃ~ Ó-ÛIÕ|==¬¶†[»¨ïdÛy´©–Yã9VY8È(rX®Øçñ§†ntËÝK‰â;x(„q›‹°“xÊ K ûHp7; 6†ßÏC©|Q»ñï ø#ÂŒN÷öÿcŽ{˜-ÅÕ¼ÁÒ Ââ8‚µ±Ú#Xãâ6ß•![Zq¼u8%tÛÙœ§“Â#F‰ô[‹3¢O’.¢¡îƒ‘1,#PÊP9pX‡ (©/;¬iæú(5Ù]∢È"œ4†<„Nq·nFü€§=WŠSÃ~5°³Ð4 kz&¥ìQjq^Ã%äLËnJfHÕ¥…‚†hò¬Åb*Q9ßÚGà=løGYÓ£»·ƒA’ZqÒ»y1ðQÔ îIu®dÆÚå½ö0½IhÌ+™ XRßGÔ‘àY”°krÊr„ü¹ã¿#' ðqÈë¶î·ñZ3N¾0Kz–±™L‹ª‹tPà+q“ò•÷ˆÖÍ­íêxžéô*ÞÒ 0éþs^y¼µ¨+»Ïi%B ò»³’«óïè |kkãKø®Õ W7ì³êw÷±@.WÈyAß,…Êñ5‡|$±xzÚÚ+}€A º£Hc§ € Ïn=É{HÉ{ºw%*\—rôD¯§lh±_h1G,²Ç<×rß]–4ÆBDŒ0Ž7ûðí‡áëÃ`"¿¸»’–• a][ï¦:#“€zt¥¥ë‚ÇB·Ñ£-pBešñ׈ÕcPAÝ’9'Õ¸©u:ÆÿE·Ô$¶’âÖêI„S¤±ªFbÁFïM¤ãîäç&ªt㈦á$kJ£¥R5 õG˜~ÒÐÁ>¥isouí¼c˜ŸöŽWòþ•È‚dû­€5ê_ü!­áË›³‡Ì{w[PåÉQ¹Qò3÷¹Lö98¯&ÓÖh û<²«¼LcbqƒŒ~+ô_ 14éaëà÷âù¾OÈó8ªœêÕ†--$¿Zê3ŠŽåd1•”AËŒãê)ñ³¶K§êýfQS‹O©ò‘n.ä9‘Iž}ìÜ– tôŸ­ëréò[ZYiÿkžæe ™´$}ZFàðêG^‡Rnƒñ¬Û¦y$"&q´à'¯¯ëYÊ4Ôbío™¤s»Wò:O=Šò øãYÖŠÙåG>Ü—mÇ„ÎB’2:a³Çé^*ˆß˜îgKãnY%šØíEÜÛ²NÐ1È^1Çà*ÅÁˆéí !¤‘ dI—܇®‡©SÉ#äöÃ×~Ç¢øyáµµP_÷í>å 7Ê(ÆÕ|ô8¦ 6–ñ7™,œFÁÙŸ/+æ$,¹ÿ†^/ðßÄ4n¯§šRÍ4H—;¥ ‡Ô€ÒH§&'Æv‚:ïx'â‡üY?‡þ%ø^ãJ±º´q54³ —–ÞDr>"`²D…¼œØØ€…~_â‘ã]3Dox{Q¸ŠHá’†ÞÕ!¶’È*(®ÄMIÜyPŠ Å~4çÎ×7ä}r§k¤lðÇüøOg«êÞñ–•¨Ý/•e6´ Ä6m ¸1ÚÆÄ‰ †Tv ökiŠM® ' ã—Šþü_y¼_âo [G>€‘§ü&^´´k¼Úo$ûDÖ„K½ ‡Ý.Hîÿ%Õþ)Ëá=CÄÿ¾6Hº½»é§ÃÑ¡RD‘HÏh«Ì!3ïAP©#ÄÊ Œy|mÖ,?áÕ5¯†Iáȧ“gö|~I×µ8d´r&›ç’qç}›Ìˆ>Õ;eDÝò7¢§ÉšØóªWŒtlûÁµ(4å¾ðŒ®ŸCЧµƒWÓï$† ¡ò[Od»AžÊH$Ht‘"2.ÿümá}FñõÅŽ—sc§ØêJ)@Û°—sHÕL^\˜N#B Úa:ÿ‚ðPߊþÓgŸÄ7ú-ÕÅ…£ii¶ž’Z4g?gu–hÙ$;’t+±ømè7'£|nø‡©üMømñbçÂú~—}Z¯Ývò7§Zƒ‚’gÍ~Ðü+ã]cT’âïNÓ£ŠÖî5ÔoîÒÊ(v[³l ù!rÎHI ™w:–à¼Wˆ´«).쮾ÐßiœhgYFÞw`–þöTÙf=+«ñ®‡§éZ~›q¬]¥®Ë8„Ñ_“xÉiç}© Y[ãû(‰ÉÚ\-Á Ã’Üß‹<_«Fºf‰¥,Wvž»m¡œH-®æˆF)Ò€´®% prCöv†¦5ä™6³ám:×â.“hñ=Ø¿¶YïU¤Yäÿ¤6Z@¥“Ìp§ *°ÃF›Ý§øÏXñ6©«â]wûaìtèâE‘ÉA .ÍÛ€OÌÎAÚ1¿ø§wâ_ i~´³ƒIM/[{« [A,‘)–ådY˜3Í"Ao1b]ÄŽ+ûvÿL‰ô‹oÙY#4²2XY"²Ç#(ï>bª¢…_º |¼±Ê*ÐòñwæÓcsUñ.³â׸yf¸Ä¦T”‘àÀì‚’3ö»*壊ƒŒíÅTѼe­·Ø^2c,R—œüÌø89Æsž¸íНïnæû“§;Bìk»|+) 8Ü:œvù8Îv’fÍ-ƒS¾{F6¼ˆDvÛÄÛ  a†fq•Ácä hÁÙ€ÍÏßÃÝ]éšþŸà[ [Ë‚Yo&0Gþ’€4ªìÀn}ŽˆS.ʧ Ë`òšÿ„/ïí]´èm­Ræï{Å}q–˜ ¼°w1È Gr"©J-÷*\Ñè3PøsQ¾"­îmbXåŠá¶›V#h^AåNÒÇq]–â;[ð.›©âiZâÛT¸X&–Ü´0³±,‘íʳŠÇ®Â’* ]ü8´ƒþ«[Ëkûù- ™£¹—˲€Uw9g9  =@Éñ†½¥Y¶•¦ùpÛȯ}u¦ðìl4Šÿ)í'ƒü?(«vKC¦ŠÚ·…nt¿²èr¥Äƒ»Ë¸m»÷M³h Øß÷NŒð©VíMFæ×g—q©M4f#”*ìJãÐmÇÅvÞ+´_|6ûM¬ '×îŠK–YÒÙ²òdoÜrOi$ÉŠŽ%‰Upªû ûÿ ²uJ¥|Á7ï{ªþVoå²ÓÌãâ<Âu¨QÃ4—.ºiéóFh¦™9ù@?2G,02=ëõ³äˆo.’Ú$Œ·'½fY]-ÙÄIèOÈ܃ߑȨõ›…º¼ò‰H¾ðÏVÿ&›k-µœ2ßÜ\Ç D2åØ(UêXç·OιåSÞòGL`”|Ë2¹Ò¬ƒÜÛˆ¡…RYVhÈ G|’TäqƒIÁ¯!ø—ñFÙ~Õu!)wüž«rð3]wÅ;»mlZ¤« ÌNï"\"#ž9'®#/=ºdx^¯áÍCÅZ·—¦³:)Èe‰¹«c¸ëßñ¯™Íñµ ¹(êì}Q‚¥?ÞUØ’m*OLÚ¤ñ´¬¦Bƒå :`vÝÁïëY$[ÌÐÍÈÅY}â·,4SÁ71½Â¢yLÎ]›—±är:ãÒ¢ñ•ªkÖâm1TF ,Þ\[B7¿ô=M|ÅjmÒçjÓZµßÌúHM9¨§îôgÜŸ?kŸÚÆFмYñ u¤YØÅeʳÃXÀG`ÁƒÈ¡“sKdį‡Ÿ´ÇÇŸ j÷Úõ—‚m¯oµ`ÊÚÅþ€÷.T}¤!`‚PñnI `êKW| ñSá/„t¤·>ÖÙmÙŒ2Gsurìä…TÂîf½rØÁ¯®üPóY´Ûìí¢Õ|ã¨Å½o>Î'–[ÀÎ6ä‚áÓóe)§sÈŽ.³“ižy¯ø â·Äjzÿ‰¼=u%ÕÖùçÔõ;#.>ûÊîË6#S¿ånÇk¯k„o›ZÔ.£¬[@ÒD×WË·i#Taá#\*…rC£(3´¥aâo[ëwWíâÝwìóYkku"Îí6òClb©°3ÈÁr0€I$žVëRš >+«KŸ?ΚIoQ2åQ Í‘Ë36yçdÜŽS“²9åVRNÅ=wÅVúާjÆÈ¤qÈK² YòUÈ‚¹<|ÌHÇZ’ïâgŽ>Ûa«hºÍìsØiYiy0ÀX3Í$aU6îÉÏ®qI ðêZrÁ¤èèdîÎg`÷[ölQÀF]‚½LÔ‹<#®XèMg«ÚÏd&º ¡Úç$yÇGaÉ ž[iÔq”¡dŽ£ÆºÞ§¬êþ!½Ó4È-- ‰¿²t–I’.wÜ„1‚å~öÀ§€° ÁÉaOUû§*kòx¨]Ý×Ûò©QÁ•%ºò~µÉMË3ž­s¹ËFC†Ú¼àœŒƒ×ŒwÆ*Jö9Þú±Üj¾.Ö/´Á¨Eo&šAå,6JäœòW¹b:Žwôû a?nµ¶‘Xù^zÙHNÜ (ù@ŸË‰ðÞ¬ —Ó¤Öº}ÔnF¡0eV$€B®xPä×§øBçÅ­©XE§E§YXÀI[‹˜|ñ&3v·”cž¼Ei}nRÑÙ”|g¢ßZhßhÔ-"¸kWx µsµ‡ Ûp8ãÉ''$ zÕ Gs-½ÉŠê)®¬ìždŽÉP†ûÊ 3ƒ´ž{ޤ7•SAðö©©Iq«©Š8¥24—<·Ê8öíYOí_$>l꧆ökÚTÐ×ðÍ„wÓ+•“pn?9#¯#ðªuEð„³è·n¦rŒ¡beÛ:0È'*K!ùO¸îj•×4Í Oš (ÒY¥ó ³ÆwD¸l“ì3Ó¦9ÍxĝГëzŒ–úio<Ž{¶êÀ £ðyúcW‰™f´ð4¹eÿÏ[/Ëêbë_§äIñ_Æí® Ó,J’ ž^AÀ,Cë’G©ô8Âx»ÅÚDPÚCª\D±ÁVPN{€@'§=}é<'sskª­ÜVéu´ ñL2gô5ßÉ¢x'Å0¥åÛ­ŒÂCæ¥éXWrƒ_!b3 ºÜü²íä¼Ïªæ£‚Š¥Ëxÿ]?¿ñF±«Â°]J¬Œ’Ç·BrÎ*ƨ^·üJ£,ÑÌ Ì‘®X)Æ~™þ•µyðnY’[jQ\Á-çÄK aKŒò+ ] ÷˾ÖR ’0u†oŸß…ç·ñ¬'OFw«évÖÆÐ–¬}Í<¬~„§„lõ{¨£¹‚ÜB«æÅ÷"“ óä–!FÁßÇN}3âN£û>[xXxpø6ÖXí'ûv™z`šéܹwFÕd<©Ê‘Ú8År:¬Ö>)ÔtI4=7m½õÀ‚é-Ü4³·)òí–¤‚I®[ÄV–ÒÃ1vIYØHVDÀvîÏÞSÏZü×>n¤ý„,S¹®Ûh7:•ôñAuöQ §O[™‹’ÇåE|ü»Â’3Î:b³ø:ÎËÃpIŸ4·ws\“팑&\¦ÒR4e—Ԅ𛚜~%Šàyа1ä«$íùŽkÓ~üÖþ!øÖ]BqzLzTªu .ˆŽdòÖ?0î\ÈBÛûÒpTÜd¡بRf’êpš}¯Ä4ðDºœ‚G‚ÒÞ?ìýgP»Š;‹{0\‹kbü—ÜXá~uRHPšÀñ ƒXñzé÷Þ"KÓ—Æ¢±ŒþëaÛ¼Œ8;ArXo#cu´³©èší׃¼@¸’ÖæIæ´H|¸f•ù Õþ@‘ääŒ}k”ÓõØxu46ñ}ÜV¦ÿí¶ö¢éÖ$»U;fçfÐ@“°Çœ[~ñ\¶¨×bÅœKec~líÖî;½Qâ[ûte!’g>b‰BÈ÷Ï…qÌÀ¹jj²¦‡k½¦©èˆ$I$ çŠÿª(Ü ÛN ë÷Xܦ©qq³¦¤Ó]¶èÜLŒ%Þ?xÌ’läõbͻڲ|AmömEÙ<³nÂ3ˆ xð67d¨P:RI&u*«Ùû¾†Ž˜±ëÓÇ6¿‹)f3#B¡©MÛØ(]ñ«üØUaŽƒ­:ŵ¥æ©{k3K,7È’#³H±Â„²®ÝŒ%¾YÇ5Çi7 ýœÒ®–'±ÓØ=ÔÑC!hQ‰A½ù؅۾ܾ0w6+{Iñ•ü¶ÐÈ,£ŽæÖw’&šÑQ^7P[1Ä[%A6W=‡Yrº°éÖŠø™B =…ÔÓÝÙËÚL¯åÆÎpqŽ<ñŒñ‘Æ lë7ºµ–—L9º]_¶Ù§@¨ÊñäýÁßÛµƒÊÆ·ˆ<@ðß®n µ.Š%‚ULà\œòÜ`†äŽËŠñøªííÆœo.æµ²™ÞÒÌ*ò22¯MÇjçå•ÍgvÑÇVÊ|©Ü§vð š[ÅÈ”[c÷%²ÌPrAN¸Ï?(­=7ÁÚdÞ¥Át 3]EZ„Ý÷† /q!TîË àía6–Ö>*ñ ³Üi®P¶é¡Ž ¨ÈFÖÚ ” r}êx®“HÖ-´->ãöp´Wð´Ñ‰¯d‰£Š:†!ÃH2‘©\2†“%r3³ˆR¤äµ8^[Háð¦µ: 4K¦Lq + Ë2Èë†ÞÉ• 1·¦0(ñ¶ú•å—ˆ#+2ÃdÀ­…»ù{Õ‘¶ávœÈª‚=ò¸«þ$ÑtoL-íté.î@N£-»FŽç¨O¼Ý´ç'Óš¯k£ê§BUƒV¸µÒäʳºr±‡fÉq³–L!cwymŒžMEÝ\M·¡Ð› /b»¹ñYÜÛÞÂÿØ÷ 2Œ³+B†. «°pÙÛ’±šæn§Õõ@Þ{¨àHìÄwiÈVßËÚÝŒù‡q#9rÍÎáòçÓt¿…>ñ?Ãk{_ëð½¼×QÛÆbqò3o}ŠÜ38rÜÈN9 F£ƒñÿ„,<%Òî/­N¤³§ƒÈ–)…;do5Fæe/ •ù±€kYM$®Ù¤á:Q»ûÌ]oÃ×¶Œ/¤Ó`³‚[m¬af}Ä’û¡-ÀØ’Êü§,ľоϨ.¡ª,Á ‹L"KdePª©»ʨ8#$3Œ³Ö²M¥hú‚^xÂîÓR–u]µÇß`ÁöàaFsÉ?)À8aê~)Ôõ=9´4+ŸçÕîz'ÌÙ?*áxà€3«¤É8[2ͪ^Qä‚ÞOO¹u8kc¨aÛ»ìjx¯âŸªYC¥ø/Cm"ÌÆ>ÚAÛ-ËGÏ´à£pÅNA`3÷yç-,%º2ËÝÄe·GÄ?ä–1˜J†ÆAa‘ŸzuùxþNš4i¸Žõv*ã–$Ëœ{ñÒ¿IÌ)Ðá<†o v»ÕݽÛòÿ#ƒ¥šãâ«=;t±ÌøÛâF”lb¹¹Ó³íZçìð›0Fä;šbÿ1ÆAà §8õßgѵ›y5+=vm¢$y‚eaëë–>ØíëŠó_Ú+Ä×¶:¥…•µûË-µ“ùÙ;‘¤‘ÉsœõUxþáÉ5ç’øëRÇq>ŸŒ =ÁÇ·µóù6q<CyIÝë{ê}=l¢‰óÑ|¨ú+NÕþØÇÄ’Isr6³Ûl`Cq˜Ê‘ƒÏ~y4¾.ñeÂèÛ§ØÙŒCIÃn'‚@íɯgø•â™c0Zͺ`°¦1úõã­fê¾)×5¨–ßRÔ¦™PçÈœuëÑŸÆ4ÚŒnþäg”¦œ¥¥ýN‹â_ĹSÏàW–?ˆgû·S†Ä£pG ÿž•]5=T±eÔ¥äĹ;‡¡æ½ Y*0•>[©sÁJ¤Ôù¬Ñ¹“¬øe7ß]\E„2ÅâQêsÁžk2át÷³3Z¬ŠÂVÞ d®G·×ŽÕ5§‹uBÛß7™oƒû¢2¼Ž»IÆ}Æ hØx_NÕÒK;T…ŒQî[w-—cŽŽþÍ\ê4ë«RûžÿðN‹ºzÔü¹4¿Œžðî—+Ù¬òKålŠÅ-°ÞfôuÇËòüË×#=sRéž!¾ñ§‡Tñ"F¤Nñ²üß»C Ù$ Åœ•ÎÂppábñ…(ÞgU9ÉŸýjÕðÞ»¥}°»,‚;†…G˜‘’3·wÉL¦7êTpÕ*á«9ÔÝ'mº­:Øøš™µj´Õ)ÁF?©±¦Èš'‰-ZøÉåHß0Q‰1Óœ{sžz×ÓŸ³ž‡ãoü;‚Ô;5•Ó‰î­bo´-ò²œJªŽxÔuÃ)—æ;C|ÉâÔÒF©·á‹èu;qk ÷KlŒ<¹ ¡ 2…Š–'ï¥}ƒû#ÙxÆß ÛE¶–X^ÆÅntË;yÍ»ÜIå´xaœ:þô|Œ@9éœ2þk…J4­4ÓNÍlÏ ÉéÿµZúÛåµÏý§!½Ò¼e¤êב[Ïö½7Ê…‘I¹}¬ww‘Çíå24÷° VêÚE_0D²Bû¸p2ûÙõš#ÔôNÚeÖ’ïrÄÊò$áƒË·Œ#(=6É'æÈÏJŸJÐïõCû.Í¥–Ap‘G46ÅÔ–b¡q˜ðN:áI‘›_ü ?‚µ™4Í;WGå s Âí¶U±;A8^xçŒUÊÊÑ<ö¥ìü–ÿ2–‹¬ø›B¼¸mY¼ÓæšÍ­îÖÚíO6ØpêÀ ÊAÐàV–áûónÂÉÜäÚ()ó3Ã+oÀ!‡<ì>¤V—b"”­²/ÙÒÆpp ¶ÜŒdž}sŒã›ƒX—O–k8æ…Òw]Þcîi6œýÖûÀž˜À¬¼ŒÖ榓áGÅqÃg-ƒE¨\G!*Wk»ý͸',ÝÈÚA(m×3ø‚m­7<…J39)¹¿½ž2Jô+âãN¹T0’©Q+õÿˆž$¸†[wÔÝCd)‡ p{| có­/x·RÖ4ɼ;a³ZÉòÛ‚RF}ó^õÄ^^Ã!xÀ`Yˆn3ïùT ×níüL,,Øbà„,ܨÉü¿:ðjÖ…IrU÷£-,Ïv8Xû/qY­L¯Šz‡‡-üOat·K<邤“eB0nœä“õçz£,QÁ fGPqÏ¿ þUízF›‚oÖîÈ£I{'Ù XýÚ£Ÿ¼.Aw`q^Eã{ }?Ä/gjr«áˆÆìóýqøWÌg-U}«A–VRNŸk™K³Ìo,’¹ùK qQí#Ž£éO,»q¸R ÌwmÏÖ¼ÔM¡ð‰fbª¼ã4û±v–ñÁ, .I@dÉö#ñ¨£có#ƒê(•Œ¬ZlgØU]ri¸}¡¨8éÞ•NÜb‘P8ÆqOÞ¤qR!¨êFÆŸË ‚VŒŽ…)ƒ2uR1O¡]lM}©›ï u·ˆ¯tû”š 6„9Â’7{jËYœt8úšŽYO%°=+õ?i$ô> ÙÅîzσBøw®\Á©&˜²“>IÉÇåêzt¯¯akI<'ý¹ñXê²ÁJ,à3|Ò ¤sì¸wÜÃ)#ó¾;ÀPTcŒ­)¾V»Ùh×Ý©èd‘›ÇªÑkò9¿j^!ñGÂ-cIÕmZ]OÀ¾ ’äJWçKiËFà1È™#ã#b{‘æþ)¸Ÿ\Õ¡¿(³5ÞÇUÏ˹Ûç_^½«ßµMþ÷Ǿ>¿ÐîÒöÃÄð\#NÖ`F^gY7O»µÃŽ ;’Z¼'Sð§ˆ|3aÔí&äÛº÷yÎáÁ‘ógÓÒ¾•DÛW;ñTgIÅëoþGEø Ј¼)§ˆ-tå›ýeÓY¸.Qr®ñà‚„²ž¼Ž5gǺΥãn}{Q´e i–ònÔª3ƒ–#8+Sºü>oö6 °›¢ ¹–5àGÏ´ƒËr£ŽO+üeá½F[»rÒÿi¤qÁ ïEŽ(D*Æq´prKg«P×ïu<÷)ò¸ô9 =3Y¼xlt«p#l<¬èà‡e XàrsÐçµ>ÇMÖç°]RÛKœ[[ÊÉ)†Ð26HgA´¸8ëÌz_Ë»¸[Æ·ÖÌòʬ¬[w˜¼’`¼^qÈçøOYö}OÁ±Ã}}2ZÚÞµMÚùÑI€B›p»·).yO9ÑWÓSL6ÚGšNÈñOÝøZñ¦âx¥·2Ì‘G,R(–8 '9Qž úzá~ Y]é¾4Ô,oÑ”Å1XCwŒp„{`{œžõ{âÃyím‰t¹V;›¬ŒE·÷ÅK@ ‚¼‚7dóÑøK_ÚÿÂ.-`ÕaŽâñµ{ùJÂ-¢ܳaù<äʬ~îkë8K3¡•fª¥Dš’åoùnÖ¿†§7 )QtÖûú˜@äfºé³IáÛ{ËÃ]u«©mµÙ3(”9Pc*øÚKuPÄf¹û¸.ìîÎîŠhŽ$ˆ88r ApAjZƒ8¡ÚÁß8ùH çÛŠýc>ÊåŸeê•:¼‹{­T•¶~G‰…¯õZ·q¹·ãIü«é4›mVi-m&&ͤþåÔ8çø¾ðÎpxåSîŽ[Q×ô­-‚]_ÄŒã*†@ çëÄ:ö£¨±³Ó òQîsÔð_Síß x.ÞpΟ4Š?{/RO\óúÔäÙe,“¨aÕÛÕË»:ª?¬Ïž«²èMKÇtƒåº@‡î–?{éëÀ® ^øž.îg‚-5ˆY Ç3–N9¯j“ÅÁcm%•†Ò6µËBäyÁü:}k”·ÐnïRiÒå!¥÷;`mÎ8?äqS‹Äâ¹bzXL.G™—ÇW m-ºùÓhÜyŽkmJâyžS+€ç•WëøÖ}Ô¢9JE:Èñ!ãüÿ…:‹˜À=ðjÅ“’¡ Fs_$xÂ;MÕ㸻’`¨Ñô [’}zøŸZò!œG<Â>h¨J=žïËÈÛ*ŒèÕm»ßð8ôâžó„ÁùrH=vÚOÃX.lä‘çpD² ùW>Ÿ¯5‡â / BÖÿiÝ3yˆH}8ïYTËëÒ§Ï5¡íCF¤ù"õ1n kså–VÇÆCÌpi¤6âFIõ$üçù5Ât T¡Ä}OZz®Þù¨Ä…FGzq}ßpñÞj>°žô#‡¬ivÐÝj0ÛÜ$ŒŽà‹ï¥8§)$…²¹îIpW—JY%8ûÃòªž~FâÀ |)-ä«wl Q’M~ޤúj|_"KS·øIco5üÚÌ ÞDxŒçqàþ•ô÷ÃÿŠÿ to‡ºw…F¿¨éÖðù‘\Å<†Éùäa¾rrÁH ˆ6ä`üÿá8,´ ÛM{g·–`]„ƒæ'“è9?†+qf‰¾ë‚=gœðÍ û N*88]én»Ý3‚Žg_ˆ”é«§§É¥â?ÚÆòÞÆëü9si¥\Üy³IBË1£$ ï9œó—wñ[Gñ·Ã‘}k£Ç¦Ü«Í ì¢5;A Þbã«2äd¸õ® *¾A±ÉÍ6 ¦±s ´`‰YfhD@‡hˆ àr:ÿ|fqáþ(Ëç‹ÂJRœu|Î÷]z-Žê|C‹ÅµB¥”z$¶=öt_ˆüu?‡µ”-²‰Öå’uu àuì'Ž€ú;‹ÑôïÁcáX˜5›GpÉ0T“çFÁ•r¸ç2sœ“=ý›¼1ªßüO·½Ò®â…6k™.ŸËUÃDKíØAùºà©ÛÙøöþe×õ?DÒÍ MˆàBWÌ’3Àø·ƒÉ±¿:ÝVŽåö[µÔ«ð×Áºž›kq=Å»\Kus$° ÜG‚àd®É3žBr¸Ãq‚9ômBtŠÛP1j¦mï¼(vfvf.ÎÛpKnÜ85Ãøsã]Œº ]þ‹ogrò§—.¡lÐHîAÄ.Ì0ù[ªC‚1È ø«Âz£A¯Ü11 -—¹Y ÁmÅäÃŽ2HÜj$§½µ;cìiáÒG5k§dÊC„Û\¼Þ\»+Ê»Gól$òÊÈ9\C¨ëÚ§†Ö9êRç„\uf>§âÁñPKÖtÑ4«‘speHNþpB‡@àa‚œãŠÊ×4ùmã¹Ó.”o•ü¶ ùÔGPjm/Ãø–ïQ»X-Œq :€`\¼|ÎÜŒ ['€i>Ôn´Òâ!Í“^&FÞÁƒ0nrNHnï· ð_W†9`+;ÂZ/'åë±Ášå©a–"+Þ[œÍÖš`€K,ŸtåUO9ÇZ©>¡wÌb¸ÉXvÞ-ÂL3e#ov=;üÉáà„»?x3*ŽWÛôô«0µÅø¿T²u£|ŒÝqt_~¿‚b“YÓ#– SpTÄzIÏ.1Æ9QùôÅy°Ü~ó:dÖ¹–'JoR)4zØ T*ÅW§+¦Zx­žãrŠáÉ#A3UI^~”(ìŽ:v¤ ØëÓ·¥x’wèzƒ„ˆe;·p`ŽŸZfà*¶I#©ëH£ž”â=}ju.à¿.T® õ®ƒÂz{Ú]K©ß"ˆã·b­ à’0÷ëX ü}ÀOÖº-6{eð¤÷¦FyKl‘xP?‹Ÿ§ùï׃Qö¼Ï¢¹ÏZü–ï¡èí;(äb»_ƒ¶úrÅu­jq[xÙòË€cšóù'rãÞ½?À“[|5¾»’X#Y qäey>œqÿ׿¾ï 7JKV“ñ¸Ý(Û»Hmÿ‰¤¿Ö¾Ûso2ÿ¡FðÄbÃéUuKíKB²¶º¿ºA<ó1Åœ&Ilsõ‚¦ÖžÁó¬’8™¸–>`Âä¨ynzñØšåußÇ®_Â-`ýÜh>b ž€n*鎸9À®•Zp¤”ß½eÿaNŠ“Zhzg€õµÔlM¼³;²`å›9ÏSü«y„FXüÈãp¤°I‰ÄŒF8öïÓ½q_ c(“Ès ÷É®›U{Óqm%¤÷"”ÈÙÀg*7 î8#*1É w®êÒö™tœ×2iÝw<º°PÅZ:×Áo\ü9ñxÛaæ¥Ò{f *9iAÊœáp›ƒc$àô+­aãŸj4O$ö7’^Iì„´²í,£³9<òIà×™iºþ§u6“ª5¶Ë»9ŽdŠ0…Ð£¹ÏQZÜMy|ú‹HÍ#H\rÄ“Œtêkò¾áê9µLW´…¬¬›û2¿®éXõq8Ú¸hÓå~æz]ï-eÔΩÝÛ¦ ØÒ̆ó†+$¤ƒ‚C‚70aŒâº?_é×ú%´’è1ÞY_Z˜ï/í yÖ’*¦Ò¿1ùw1'Œ·jñu;ý*ò ZÚn^Úa#Z]ÄÒE:¼Œ¡”rO^N*ö‰ãÏxJô +Ä/œHÑNåÈ‚£·oçæç|9‰Èg7ÏMõÕkØô²ÜÂ8›Ç©­u¡½®€ú¾qînË4QÆ ´æ0Uf >RF qž Má :oøz=OÄgͳ³F£ÎÛø~v…eŸ#€Nìö¯Lð_4_DÓnuÉaŽ}RÑ­¤IEG—òí~¹ùAä‚9èâ_jÞŠM3GÃaç4 nWwïxrÊÍ‚T©Ç`:àcšœ£v£±ìÁ¦ÕÑSOÓt %nïìfH©»å W qÔuçמpG‹$¹ÔEýÂj·1ÂñC?öMÍã™nå!%aËqžœƒŽþ1Ôü?¬¼Pj1,îLSI4cÊPoM¹$üØ=2FÍÅW“ÃšŽ£I¬\x'êrCÖa4¾X*ìI$ìûÃþFxlvðä*Tϰü›ó/Á‘˜Ê+/ŸM×^y5‹–&D 9(¦CòÛ«#U×àðå³Aw„Ü!HÕ01êqžÀÌWAâK{¸u™¥–2¬]œ°Ï9ïØ·Üƒ^_â‹Û«ÍrW¹Fܹ^}8Ç·¿®köÕ5Hm§Ò¡’)U·Àò F1Ú½‡à^¡{¦é_ð‹|Wðþ Ð2ùÚ}í¬Ñ«Ç.Õ ëûØÎ•s”*6¹ÃËàÿ Gý›ö’æ g¤‡ Œr}ð­©´ëíCX¹:Œ äÚOþ€È6²f<ÏUçØ|¸ùŽHõå”ÁŨ6¥4Ö›-7~_žÇ‹W3H¸4¬¿­<Í?ÜßÛÛ™üU`\]é[M-'!b‡ ±®«ˆB•[âªhžñ5ÔZV„–ö‘ÞêökÍEâ·DÕŒÌ̤ ÎÌaB)û»›‡$¬špJÉìy”ŒÒ Ìß7Ó­=®sßÞ€¸ì?:¥MyG»q$HÈÇ¥ ýÕŒSÐP Ð@®#¡aòœ}+kÃöñÜi7rý‘˜¨Œ9UàõäŸÒ±ëKÂú•Õ”’C’/Í…9Ïo§NÕцqUm.¤ÔæönÇ \8H³0+Ö<'-ºxìväÜÜ[¼lUWäÊ|¹b ä‘Ç¡5äÚ°Ž5ò‘}Ï5éÿ üGm{¦Dìé…j²¼€x=?Zûì¿—ÛÊ ô>;:’[3–ñÞ©}mlšCÜp·r¢ÂØG"Fày<ùÖv—¥^yß̸Ÿ z–#“ý?:ÛøŸáëø ·ÖþÈÆInظØvácgü,ÒA%•Œû¡…@ëÁ<GN´¹ÄÏŸ¥­ó4S_Wƒ‡]ÎÛáÅ´k£F霶p;WM(vŽ<ÈÑ®ð@¹ëÀÙ$/n½óƒ™áËu±ÑmàX¶@Íž½=«BüËö–8Ú4gBç ¬ š÷¦Õ<»Ù7òGÎN\ø;”tAk½b‚YÚtg’åÞmà0#žyݞNJÚWÝž*Ÿ‡´ÃDDš[¨œ¯Í'™–a†$chû¤ãwÝ'åÜBÜ–ÜÛ\ËlzÆåIçž} 5ò|ÁÕÂJ…?â]ÊWëwøètfTçŠOmše…µ¤—\Hý¦¸‘ÈŽ,¬Í€Ù à ÜS‘÷çŒcÞ†L° öükë1ø 6c‡tk+¯ëSŠj”'Ï©ê> ø¥§Éáý7ÂV?ÆóKy ¹—IÎåÆ\ ÿ{¨›[ø‡.£rþ1»[èô‹[‡GuÛ´Œ•Yq€QÓ¥yçÃïé:µs{ªªýš WáFö“€"BÜmÙä=°nx«ÇÐêë6á>“¦MI’{£=Ìàžw9Q°6Fåyï_Žb¸f¶':ž/éŤäö}zµÛsë)ãaO ¸‰ZM^Ýû§ÄkKI-µ=AV¸†´Áý£VÞB¿tFÖIvAÆH9ã—ñ'‰µ=NiµßêrÏ.ÏÞO<…ˆ'hÏEäà9àSŽg…ãHšm:8F]ÒŒàðp çñ¿S˲·&¦Þõµ“Õ¿™óµ±¸œmDªKNÝÅÚöwn÷¦mÞh %À$mÈéß>˜aÅy„>Õ|A~ÞXL»2]ß(>žÿ…zEïƒ&¹¹7—;”cï2’Nzp{ûU¡§YéVEOTäØ0¿ç¶,gÚ¹18YbjóTÙÕ M<5%z³†‡á•¤wPý£QeFùœ`F.z(ôÏsï]‰Ñ­l"³Ñ `–—íJ¶8ÚÜ%Ùq€ÝAÜç'=‘Õ'–iž]± 6.Ð=ºdóÆyä´Óo…òÝ0y$9‹1vá# 8\œÏ^•0ÂÓ§ðF×h¹â%;s>†n¤ð«=ŵÄSÆbI&q*/Þ`2À(#’8õô$º¾ñ6³´[33Fçy.ÇÊŽ™ïœ×>ðèÆâålaš9oä ÐÅ( ìOÌ:ô#‚8ozí4 &ÏÃÁ$œIª´A¥B7ù;Ž3Œànä²Ð°ã=‘ª¨Òýç»kè’îÎ ü¼ÜÑøŸsm/O…ì!›OÔE¤öóÂm¥i±¸  yy܃  dgnAËãÈÍÔ¶–r¾ÇÙö”;–Fœçå'¿!pHãŠäõ©n5 nMNì6áËwÜ7üàŒ†öôè(kž<Ó4“w ›$k´j dÂñÁËzךž"q©,MgËueÉwîÂNhªq\Ý~g_«øÿJ²ñ¥<^}Üó"XÛ6C3Àvàm¡ÏÍzl:.…âÍ}Zd½eÌn!m°G3FïºiB2ˆs½Ór¨ †¾9Ô> kºŸáñ­}ç\…B!„\(qŒש9$’ÌÇè?‡|Câo‡2éú?†!‰ÍŒÖö÷Ó(ó*n‘”3¬Xú¶”tc›ÆKûGD#i'fï¬bµôÕï®ÎÇ}\ÁÂ)ì×âÍÙ|aªx[ûfHô­6]Usa& ú[ˆeÊ €‘”¼¥ He#­yíw §ˆ¼#gâÈ‘§¼KÅÝÌìY£òp£æ$ÁÏ@lWo‡|G«éé~Ëwqcˆm繘ˆ¢USˆÕ›å!>‡hÆp*OŠ~{„—Úº¬×ï‰âxÆc(Š4T§Î8c’XœcŽ©C a]ÅÕ©hÙn­{>÷z'ÓaàêrbaR/H¿–¬ù¦qÔzÑ ÊŽ{R˜Öi,åhÜ«¥)õ×Ï+Øû¸´PH&š‚Y$`³1ÀP9¡&Ý‘"³mÀÆs]lÜ5ÝãCíØ0áN1Ÿ¯&± ´¶£ ¸J_ ¤{úë¾ØÎ–7ó]mXÒ†K.ò7ì?ýdߤþ²¹—s Dš¤íätšÄ ©ºU!‡:U¯‡(‡KÕL˜ GåI^IϨéRk×Zt²pÒ:a’ǿҸÓpmuîFp$ã®3šúеe†®§x4à«Ñq’=ËÄ—¾'ð•¶¹*Î`´¸t ýë:²ÃãXuõé\×… ¶¾Õã"?‘e*ûG8V5½ö‰¥ÐZ m˜ù6ðM¹dÀJîdÝÓ¨â§Ðü*Æóþ]#hŽa´ÛD>á\ré»9Ç|^ß³r¬¥ÓKž:š…'¸è£º@c° ¡µ6Kq)O22ªÀgV žd¤cåçÒºÕ¢³Bù ŒŒŽÆ½XÅT‹‹Ù«MKBÍ¡¸±ƒO{i@R±ŽäáÎÜcïý?ÓñUšýŸOñ ½ÊMo¨Ù¬¡—pe98WR>FØœ…Ýžp2.RF’7ÆáÇã[z–¸ÇEÒï†X\¥ü¡#9ÎáŒaH*1œðy8ùÎm† çÍ0ð½)]Iy¾ßuÏKÿ´(<<¤µ^ˆÈ¦ºoÇ=(Ñ®?á)G½µ ¬˜?1ç qÅÊ’çoNOO¡µ}¾Mà³¼7µ õ꺧ýuØó18j¸Zœ“D)gËݸØç#¿Ö§ 1ŠZ+Õ…8S¿*ÜÁ¹=Ø÷MgkrůŸ1P±å‰aè;{ûV•RÕlÓP´{gfRà…eê§Ô{ÓšmhTRÔä5oßëvfÕ­DIöá‰9*£ׯ^ÃëY·³Äl!RÀ.édÄÄž>€c¯Zß½ðô°ç##¹Чeá«›éÈ-&[M¸P3ÔŸóÞ¼éÓ©'æzp8ÇMŒØ!tQ=é)†gU\–z{Ç¿ãY^!Ö#»»†ÇÃ26<­’# Ý»¡9Luè'ry«¾.¿š;çÐlUÔ‡ÌÒBã…ÉùöëžÝù­ßxâÕµF*‚rsè3õë\þÎugìã·VoíaF ¤þHá×ÃûË Ä×õI ëæsÏ\û±=ë®i­ªÝ4W1ItÑ¡ŸdˆÍ%‚©ÚxÆ\Žüuí݈„ÙÝ]<-$2ì[g£"6H=~ÐXghõÚ*9¼5§j’_i¢æ]ì˜×ªán_€'*¤g\€;×—Œâ «,Ì©`¥Ñêú&ö2T+âhÊ´ºìyÿÅRþÓXºÒ-[ÅaGîùU+– ã’F¦sŸO'Ö5y²Å®0òõ䟯ROã_D|Dø{k☚úԪܺ„Üœ)8$~'ߊå<=ðIÑ÷ëž%eºž2vDÜ.Åq–'¢¡ÅÉÉÆ$V?‰ÅUNœ—+ë{«|KŽÃQ£i+5Ó»9¯Ù·áž³â¿ˆþ!Öô ×M¶e‘d G*©ÉŠ‘·Nê+Ý4?‰_ >ìIyo¦›ô†_ìÍ*â+yi Œ„(èv±å\íR4a“œrþ6xWᵜÖÞÕ,¯ocà†ÖÎW1/ÌÑ2¿–ÊT`0 ’ ‘Àâ¾wÖ¼W¨êׇUÕä2H÷&iÜ’Í|Þ?‚·ÕÜÜâ¬ôm&Þ®ýúz…*XŒt½­HòôK©ö§„<`’óSÔ.gðå¼·7:^ŽÑ O4;Lα\¨òÇÊ‹À!Jð[/XðцÊìø§Y‘bHŒó#Dbvó<Á €#ÜéŽÌGA·rîÍqŸ ?hïÝü?‹á¦£|Ö÷msm,Ssƨù‰Ì뻹ؠq¸¿kº6±âŸiÒYK©Ë¤†K«™ G1ÚêÜpa*øä+WÊaòʘ¼ÖpMÅݸ·w{>þ†”à”f¬‘óo‹šÝü]©µ—ú¶ºfLÜMQ—Ê81)ÇO›¯Ö®x’Ý,µë…„€$"@ÆÒy# Ç9⩲ʰl†5ÞÔ£&ŸwùŸUrFÝ—äyƒ9Æ8­ Ãn>Ö‡¹êz{Š¥€: HÉóT 6Œ·¥:räÉ’æV7B¼º_ÜÂÓ;ʨ7Sø×[™?€þê>"›PŒ]jh¶¶–Ä6ÿ•ãfb1Œ‚PŒúg¶+:ÐAc¦¥õÝ⤠ex¤ dÈ QsÜàòk ÇZ®¯ªj>¡möx­íÑmlÃB¥U õf{ã=1^¥g5ãñ==/Ôä„e^i?…?¾ÝþïOº’¶]D7„äçÓµr:Ì›¤%NþÝ«¶ø‚e¶³W³‰•\mg,yãµp× º•/Ÿ|W«˜¥ r.‡›‚“œyiðF¯e¯ø.Úór kvŠèä|Üm9 ýâNs[? µjÅdÓìu9!’ßerk«©#Œ{×|*ñœZ©ý‰«Ý¬g“q`Äaø8íŽ {w‡Øj–ÐÞYÊ¥‰ Ž7¨àuà÷ïú×µ‚,Ï É'ºå’뵿à¯3ÅÌ(Ë Qé£wLè-..ì´Ó­ø’ÌG\yV¯ vÊ]ã`‘›q0̪œ¼E\Ÿ]Óî!µ½¶°¾Šå+Ê…ã–DÊ<ˆáË©®Ü€IëQ\øÓX‡ÂÓü:Õ"¶¸Òî/b–`Ñ)‘# Â9\…%‰dÉU<¬M?Bº\ ëèÊÛ(+\G<``¾$µO g“‘ŠøÌsÏxgN¤j¹Ñ¾—wVþVºi³]LéÂŽ2..6‘ÔÕ]XÏ©é°èqHª°HóŒ®3ÍŒéß â¯]è­§jÖ*\‹9vÒí-’¤à‘Ô`ŒŒ܃MÑ©§ÛçÞD»›3“ŒãòæZôhÙÎIz´¿1(Î_ ¹Yü-£}©nE¨»yÇF9$çëšøGX§Šú+˜ŠÅ…û9PäýF p\sMÔõ‚(¶Üùk$eÝq‘Ø)8ªž£;€s\ö¡×bêöËLo&îÒ±f™Â–ùˆ°éž[Ö¿6â^/•: –ÉiñIk¯eúž¾)®zËÑKþËq~ÍŸ?eÿøYð±²ø‡ Ûͪiõþµmmmyo$ÖÖiï¢yÚt{†-—9e+æÇåž?¸Ð£ˆ4¯éÖ"m6ÙmSMÞÖàÆî&¸Ã»ì"#c/â÷"~ksxFëXÒ¾ øjËOÓ¯¼8lÚ!HîeGÅÒLš7ghÛxrU\(9aò?#>¥sc©E4²ÁjgdŽH§G$>c|¨¸ဠÃcþ{B5qø¸Sz¹É&ý^çÑ:œ˜tí²ü‰¯¼I‚í¥¹ñ6¿e$* ­dãfdV,œ‘‘ÇU*Øé^Sñ+ãýÕÆƒý¡iööR&ÐüA{àïÛxƒMvV†Us°ã qÔWÕž ñtž6Ñìµg+±ÄSDsË}ýÉ?C—â#›a–µ>uym£ÚK¦ÀùœßðsUé;'ùö54Ûo³ÚZØh-Ôšœ7ö‰#Œy+o·B¨–8s»sýü/Oâ‹oøJŠÇSð¾¹&¼w3Ü-Â%¼q˜Ñ‘ãDPìåÃ/͹J¸#ø“ö°ð}ô6Ú—š>áíUn徿Y•~Êó9U …R¸;°\Àù¢ÇÃþˆ|C¬jVV–;nVÛMŽø4…¶H ͹Up²€ÁÁÈEä×ãyÞw™g‡ÖRJ:¤¼÷ÖíŸE„ÂÓÃE¨=÷Ôäî®mšçÍÓ÷½‡˜ ·+(ÈÆñ¹@Rw$íÙ͸4¹>ßö/ø† #sc5ðŠHd–Œ¡1Fæ,°,Tƒ’»XüÌb½/…¯¼ {âgд-ZóH³Õn‘–ÖH<ù®ò[†*ÄnM°¡fÚÎ;€wKÆÿ4Oiz¯ƒ¼öé}³W»†úéSû:}Ïþ‹ÌÊÑ+‡!J¡ U[$ Þ ïsµÓŠ3êu¶ßí9sûGøcá€øU†ìt Ë-“Ëmn¯yßÎbXž$öxV‚-ß6!$¥Myw‡üúºMy£x®ÕæŸÌkY/Qn%š8ã]Â)dðòmÆ@Sêµí áÏŽ×^Óôðòè6ìÚî‘|ó]ê0O&ôyr¢o7÷q"m,GÌ»+ÎüUâÝJöxç‚8 h,-Ò'²… E0 mî“.Irs’}Wfž#˜BÍ6Õµ¶»ïÓ¾æUkB-óê—ù#ûFü*Ôtiîƒm*ËÉ·¼´t#ÊppY³‚§<0 `þCÍ´o„!Öõ¶3/™#ª3’IÆ:W´xÏT—ƪðBid7I ycg20Ì703×Ô d ÑÓtmÁš[ÚÝDdÔJ?îÎT0RJ õQ€Ãuȯӱ8X8ªøšo™ý˜¾k´ºyY\(cêСìàöêÖ¶ó<+Sø)®éðµÂH )#{!#¨Ïõ¬ üâ&ò"±i›°€n'ò¯¥u¯8¶6 ¦‹Ó °Žu·2æB¹ µÁ]¼ ©ãò¤f«ê|ojÚuž’Sk1E¼³TÞ‚ ˆY¶’O±¤Ÿ&PÁJÓ£VŸý»uþ×K2Ç%²—ày—ìûð—Æ¾/ñ$6V:ëÍ4éœIlÌóÌX3G½ÚI®ž÷Wš%Šfc A’A\œtO?Lv¤“ã?„´]"Kh­&±|í W—9x!‰ãu’XÑ×"\‘²MÀÇ·®3®µ•#²‡Ê6å1!’ ry$œü¹9=«ÞÉ'û·hµµþ'æûy-íêpãJÒR’µúvF§†|"˜ç88ÿt«Û_ Ùx›ZðûC§<.––áB,Ó.ë… U}Îr½ áœ÷:F‚Éi;/öÎ÷žX6y‚ «7ŒuTã*ã²um^ÃÆ×‘ÿÂM§Éû˜š-6Òt-U¹J®Ìdà*ãØ(À±5ó†å÷lõ²º{ÛGå}4ÜÊ•HRŠªõ³z_™à²ëZÞ°­qd0Tp¤„†Ç­>ú;Ö·¿´”¤¡°« .à;uþuëž&ø>úê¬zk4p7Ï0VäñŽ„?<ø®â†ü+­Ç¢é—3Z[¬W[S‚IP¬=~ñ둎eŠÁVÃFõÓëß¾Ç~G$©¯’ès·kdxgoõQ!pNâ7‚ééÍVmB[È£ó€Zí 0:þ=jìš­•ý¢¢È‚A‚ÞqKsa¯ÿe}‡Hð„×3™ñÀI Žzg=?S^|¢Ü[Ž«É\îNò³ÑùŸÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?üÖš(ì¡ýåØŽæGóYWƒ´2y=Gr2q>!ñ„E[J‹Rìêÿ,pÎW#’OZâõÿø“Ä×BóWÕB›Ý?w jq‘€N~è$’sŠÌ† ¢aNªã>õú6S†¡•Ñå„o7¼Ÿ_$º/.§Â}Jòæœ@ÓÎ=Ðý­žc‚Ì#9$mÉ'j×ñ9ÎwWûac0—ŠI$ínn÷_…‡…ÂÅáýgç¾Þ‚kútºåŒFÅØ7š®ÅcŸbp3õÏ|r±øÞó[d”´‘6AÿHÉè„©é‚KŸ”p2O¹y ¤Fâç]ÕÄk-Ã:Å4ϱ$‚ò¥·1 žxà`ç+[øÉ¢h‹-®‘jnÝFæ—lL@þñŠã°PN9¯¥Âf9–1§Œ¥È­~oøþ š¢é®\;æþ»*x^ÂÅU¬í–ÙBcuFÀç¾p>ƒßŽKâÅx*Öêm>D¹¼É'–wnáÎ{1ׯW™xûö„ñ ³‹[mE‚†.-ì¥òÑ\ã,JüÌNr{ly–©«ëü­6¯zÅ ÊÄ8Pyè:w?cÏèQma£yí}íú/3ÔÁdu*5ãÅw¯¤Üù¶žiû>?/úcðªzM·Û5{VÇïfTäú‘ZŸl—âg¶]6îÙ6>Ög#‚Êû¼q]MÔx¾Ê—ÏR9b±7ê×~Æ ù=AïQ¬8N©Ä»žzMŒÇ¦03øW)¢Ðt'¨§Ô`”nG^)c8àž{f1ô“M׊ ¡'ó G¦ ¤‰d’…9#h>ðã«ÑüUàGÓ–îS$x}¤p@;“Ž™÷íƒÍÅ¥éâØÇ-³4…Î]OAÀþ½=+ô à]'ÊÙòpÆÆ¬y‘¡Zés]´šËJ!Q•Œ–lð:ŸZöoI$º/Ûíçaª’gŒb% ŒŸ ôî8MÀM©¡’"-,™àpOôükФŽãÚŠé¶í9“ aTB$Rí9àc…'“Ö³ÆRŽ*©R¤n’O¶·V×ËòêsV¨«×8½nM©]j¶îÆet-åÎñ…XÐ01Ÿâ|qY³x™-ãH.즹X¤Ü¤> g¾?!ù ¹c{¬Yék©ÞIm$SM²Xíš"ç=ä3Ï×­ax’âÆÕ'e¸,¬X-²vô«(Ì0ùÆ©%x½S³ôg%Z…~^Œà¾+|f67Séö6Ë ²#7”ã%Iã¯öàu¯Ô|A®kR³ß_y@ƒ˜ãA¸zžµâMľ0šH°UG$¿âkGUôö¯”ÌñØŒV&JR÷S²GÚ`0´pØxòÇV0"¨&Oriá[ønÔ¤3¬ç 8µæm±ÚÝÆù£û¦’&, 8ü(dwãšr¨^”j³»¡§ÑE„sééKEQEQHIÎ’OaE®*.Õl’y9ëN–âR±B,zÿõ¨xL#Ë‘B³¼AàTbß2yq‚äœ £­SmhŠIn³¾~jq@NIÜÖ‡n¬luE½¿Ž"Ôžœc¹=1Àç’*ox¿Uñ–©öíA¼¸cm­U¾H”1éžN=€À®¸Ô °R¦×¼Ú·Ë¹›§Uâ#%²NæqCŒƒÎ1ÖšëôéŽM:6hùL?‹š½ö7qˆL\aŠó“ê=+B3[Ù•&âP ¤dP©ÙŽ})÷5»2g  RVnéÙ¡Lò0NG›qÜÄíRl_îŠFV!A$ã¹=©;™îêÓÜK…ÞáÕþE–Bç$c<òO¹ÍtrxFïCÒRëS·v,P¶ÅùTs–=ÇSëÛ5£ðïÁQYê+­' ï!ŒA'nG9ãÜsžtÞ#·ñ ÝœÐKeåØI„{×b¡rc#i*Ar…7§8¯Ô°ÂQS­£–‹þ ùýJò©_’ž©nC¡éé%¤Q[mo½‚†RÊ1Ž£%O_sŽ™Vƒþ(Þ;m¶©§Èï#™ð]Ô €€>RXddñÈ4Ø5½>ÆÎ[í:ÒmÍfD3É´p»×å:‘Á9‘òš›ÀZ„~Lšž¿'—cžsÜ¥Þá1®HÉù=9ç¹|gçëM`è;Å;¶¯gm—äßFuà°R§?m?’4u Øhvv"ì¶¤Ü %ÞpÞ«HÁÉÿ yïŽî£²ÓçžR6«!-‚G5ÜxÏ\ƒÃúl_Úw0™–Ú5vLüÄ®Upy,jŸpzõ¯ž~7üQžþåôM)Ý¢dgù·{Å{x©d¹d¾)¤Ý÷»þ´# F¾aŽÓdþVGký§\½½ ¥^áöítçª:c(Ïf}­§ ²«ØÛ %bdû1]Ì@ä)à9žõÎ|NÔ¼A¨Mk4º%ö™iqK(½˜•–BÎD£„pÀ(Ç H×Mâ½kÂúVŠúE–œ¯¨ÜJÂå„‘ÜùQ7+µÊü‡î䜧aÅRñÄ?x¿ÃðøkQ³i- ‘ÔàOºªfù”)ùqž3ê§Œ–eÄß5¯k'¥úۥߩòhÑÀÅ5×[õ%ЧÔmü?¦ëÖºm¥ÊK©HÓÁ5²Ÿ™ÁòÝUT2¦î·!r7=¼#á H!Ón"´³‘±u,kjÂ0Ä‚r:ü§ 0yðÝ RÒuŸ'Âkmcéï¬æFg.ÁHß·Ÿ»Çsæp1šf»uâÛ+—ÃÚ©{Kf>L1¹ÿVT€¬áˆ'‘Ï<¨úSÃðæ*ps›í¶¶×_»ñ:*âáÍÊ´o¿á÷•¾:êö:MÅÀ[褅-ä“Î’]‡=ÐH!½±žkæÛûÖÕ5Ôdw}Ýä=üMjüCñ±«kÚjvË ‰bY=XŸ¼}ëÕôãÞ§6Ì>»ˆå³Q}î{YnêXuwvÆ™11®xÎÑŸ^õ äf¤–Æ,ÅÜZ»ð›ãRC)lñ†8Ç$d Z‹,y ž2}«ÊÔô$…¢ŠHÉÇàsA!L‘ÕÿJ}É.)cfyÎiÔPVèsN·uûBùƒ dÓ„<Í!pÃñ¦Ç¹ÛØëú-‡•%ÁNpy¬;™Eõãy3»oà4ž•“áû_c,ûH‚ôü¿oÉáEµŒÜIvK“¹‰\îby¯gý§îû¨óß° ôwlÄ›JºDÞî'Øõ“z‚ØŒy’Õ»â+é-”@‡oSžµÏ;;¹‘ŽI¯?ÉËά?4£ÌÄ•J8$P})Éó:zR‘y“Ôæ¤®Sf tRlÀÂg¯§Q@†¬{ˆŸ­u¿ þÝüK¾x­5Ø,ä„‚¢V`ÍëŒßÖ¹J×øâ½CÁúô7ön–Á •î8ÿ<×^áÖ.>Ý^&8•^T%ì]¥ÐµñÁw¾Ôä]BÝâi§p ÄœqÀöþUÏ”œÍuŸ|}Ž|TÓ[Bc‚Üãé’wޤ’yïVàÑ´]_J„ZJ’9@7/#8}kª¦|]HÑ~êzy™S¯R–ªÕîr:f³}¦¡Šß…f%ˆŸN}»}MjèWׯõÊÎ1ÁÎáž¿]½ðΣic$¶Ú˜|çFÄC*03ÛÿÕLðΛyk©¬—Ví¶8ÊÄX}Ü’©§F†"•XÅÞß¡5*Ñ©Mµk—5;g³·\>]°.´yî÷JÁAõÜ6•>¬  É Á#TúŸÓMµ7žc¬[À2òþxë^•L«GšÚ#Šž.4Ú]Mo|jÑn[lËqnSßi”à€Hù9ÏÆ}ùíoÇ:‡ˆ¢[? [Ù“þ© Ý€0¹< ã?OçÍZ[ZÁ›&ÐÊ Êzzô©­®£” {.8¬¡‰©ÊÒ²Rwi+8j4ߺ¶êÏGøLŸÛW .LyÉ.dŒÍw>Nwuü8¯FÔ¯¬4Ï fÇì`I*7ÉÉäœcóæŸ o°°IUefÊ;n}C2Gâ©®ÇÄñY›&{y?z<¬33.@ãåQÓ·§sõY|£ ›ž:2ž+] øÓ§Ç±¥l¨L€T`ÎrQ*JáLT}æ'¥u-Z…ãÀć*¬qžyö®I0cVÛŒ¨¯€ÌU³ éæ}– ß ô»HÅYØ…MÇ; PD™cE8 S"Ï9…p›·qÌô8¥1€\RˆÀq‘Œd‘Ôz÷çÒŠHÌ.DS&ÕÉùÐdôéÉÇòëLqHC&:.}}©Õ bÅúÆ*FòÕ#|ÙÃ&ý1KAX dÒdî Éõ¦?˜ý÷§G4t\ƒ×"šµõ‰eµ¸Ž!#ÄB±àŽjÖ‰¢\j7 «Ûœ$Ó Ô£| S¾:é4¿éÚL*ꨪ|Øçµzz8yÎòzõªU„m©Ôxo‰¥ÙNÕp>ï\Ÿ¯jæ¼q¨Ïö†‰fØÿ ã§ZÒÿ…‰¦Mjcû_Ì9UQ\‡‹µ¯.wD–$峚õq¸ŒNùäg'hÁ'©Àà‘Ñ\k–ГhxÞÌIi8'ŽBýk€ðn£(±»Š€2&æl xç“×tö®€]èX‚u6„£€Š™¡$©ëÆ}f¼¾®’Üð1S¬ÜŽCâ¡«e< +¿)ò’S“ß•ÁDF£ 8ϯ½zF—qþ#{‰t“»F¾`1Ï ƒÛ?N+—ø‹àËø‰¢fTãz0yÅ|ÆgB¤í‰Ý^Ïô=Ì XÁ{£Ý´›¾b´o^æ¨~A¯íAõ›ù#2MãºàƒÖ‹¡¤É0AE"ôJ7¯­àfîdp¥åþT¥¹¹¹»®/.$–CÏ+–'ñ4ݬ4FYOEü©ÆLFÑɸç¦ùÒ”§SÕGåBmÜE! ¬÷¤d‘þóæŸHYW©Å.– ‹€: `ÑM^(£;‰=;RÒo_Z © ¹$ ­ŠT@3ÇZqÈÁÆ})»ˆMùS“€s@ÇP6±ËÉ´é’~”›ÓN{qÅ5YXåÁ§z"HG qÔŒö«šŽu¥ÙE5á),ÿ˜¦Ù_J!ßÃ+VB¤Œ©ê8ë]¹á½Rзh÷m5Ú!¸gs‡#8Æ}òIô>œñQùƒ ‘]•á,-wmŸm RZzÃÚœvúŠý­eX¹©Á`Ç5ÛCwkq{oh2# ý¬Ywƒçó5æVÏp¾Räíù°+Ñ< §‰ìÒe™[<6vsœ×©•Õ•GìÎ }8As—`ÑßÃÿôÛ›=Ñ·Úcr÷ cól`F0AÏ{Ô?´×.¯æÅìŠïh+™ç¦ ÀÇ\~5Ðxª&­¦¥r£cË6örœnóò¨ü++âU´Ú…¼z®·&~Ñ*åAÃÍ“ƒœñü}G§Ò½ðN  #O"¶dS˜Ê§‘œ“Ž}qZíÿ€5}2Ó¬.,u=ãímÊúŒ’Àôö¯žÅ`Öñç\Öóûn†-W\ÊÆ³ƒ»v9øíâ%™îãCnĤîä 9?áZzw†t½H‡‹ì!—~ ¸.‘íþöâ¿§ÿª™âi:$Ëo§x²ÓQ>^éÝb’~è%FMp{)Æ<ÎÖõGJqR±œ8[Áo#4ÞX O#ï`ïMŒ©ÎÓDx¬í¨m å“ìò´Þpé"±?—>ô···Ú„¢âîBòÁr£-õõüi²\Hì<×$…àÛüûÒ9}ÅW’­Ö‡wªHΩ÷.FqME'%ÇZHÊ®h`JáO4´S|±œî4êܰÊøP€Wrp9·ù┌ŒS„'>)Î éCÔb²îÉÇqž´LðJ&Œ.T‚¨#ò46æ/¥$kºP¥€Ö€7’K’sÇJu1Ë6<¾}i˸=hÐLZ(¦•9ô¡Y€êFPÝih ]B8SÀÏÓéBð-]Òu{¸¥6$ò+-Ç–v—SÔóÚ©Ojð\m1)žã×=êCrñ_ù¾X]­‡F÷äsþx«zÜú´±\]$E’Û" òqÔÖß,÷Lz§êT³Œ†\K³/±ŽÞ=?­vßõIm éÉ1h•U¾n‹ßžÕÇAe˜‹N¬ryØ9×°õµ¦^­ƒ§Ùy6³g;}þµß—ÍѬ¤rbàªÓ±ì:Âi³éÖ—ñF¡¶¬1ä’Çe=ÉšóÿŒs=í‰VØÖê?rÌFF{ß8ü«³ðî¿§ÍáÉ´ø y.R óI€vÜòÁ9Ç^+ŽñΓ­£Isae$…[ç2&Ö_”œã=8Ï¥}6ezø9rëtx8ì±)Ë£8{Ïjz¾˜¶º¥ÃÍä TvbH$þ•š¡$Î*ö«á«Í:ÂFD;dÈeîïôÿYèû9aŒŠøš¾ÛšÕw>¢ Ÿ-á±6ò°IUÄ€pr0sÅ8ßÜ¥ÓÑc8%ˆË§¥FNF2?:trÉ,SH*È:G?†+8ÉßGÐ¥wbÆ›£]ê–óMd÷Õœ)98Éçð¨o-nln ½å³G"ŒíqƒÏCM‰å‚@ðɵ‡F¥=oß íK79;d¿ãUx8¥k1uàÛCd"ÀiÕƒ†ä.WƒþzQŸ–"õõcÜî¾Yb\mäÐà_¥hxxrmM¬¼M ež32ù€,nÜ9ã£ñ…¾—kâ‹ Ò{{så%Ä'+(^ ­i*kÙ*§}-Õ Jõ9,̼³à è;ÓË`ôãÔT¦Æ5S¾xØ‘ˆÖ' Iìx=?_j—N¹ŠÎÂêð5»»§“2ÄY†às"ö×ý¡Y(´ìʵö*¨vUuŒÇ ÇSþ>úÎ÷O—ɽ¶’Û•)ûý)Æå#´†%mÃ-"·Elñ|ùÔºÞ½«x…¡—T¹W6Öë XLap¯ZmC—G¨YÜ€Bé"„dG#“ÇúR\¾n]¡#|ªqÕGNÞÔ·RŽ–y¤1#få=AéR¼Ö÷ZtqË I`Mª]þð,Ìh²€k®Ñ¸îy=*I¼ð;R#‡à¯jV`µ@‡Td„\#=FiÌùùqH¯–.vöÏ•l h,aFvÖ—ÐSA*HÎiÅñÚ‡ j‚–œ ÓK•á“cœ…E}Êw1AäcŸÎ–´-t3¨è“ø‚æú x­¶Ãbó9€ éÉ8*—دÏûHÚIöf—ËYŠü»ñ’¹éžø«”%i¾¡döE4 U—uÍ: B’â`Îqò®9Ít……ÇÙ틲¤J©&0XulúóšÌðí­…íÛ%øœ¨Bc0€ßíÐc5bRÃÌq(êÄ36xí]”#ËKšÛ™ÕnS²d\2ýÐü–nséŸëV"áÁ_ª•tž•P[Û£I•'#åöÎo30É @ÈÉàã'ª ¦‚Jçkðû_E¹{‰'Wi+yà¶rFOQÏÃñOy-¿ˆM¥õľRíhâ·`HØîºõ¼ Wfγ§”OÞü+½Ö¢³½ð|ZÆ÷ùBÞPç‡P0GÖÃI3˨—í’Ë Ú®„}=ê i›µ&÷PþÏDMÏ<¨çhã/^Õ«¢½·#Õy=¼®ÿRFéómúù™·¶si—³Y\Fèð¹GYê;S1¸gÚ´ü@ÚIym Õ.ooÛn¹oõr¡Ææ#¿jËv*J± Ž0ErÎ*3i^FŠòŠl¼h$e·ÝcÐãÒ¤¶¸{+¸ï"Ù¾7 ¢D ¤Px#Ú¢‘æ•CfXÆŠ3@ÆÆ*Vš¡Ù»¸7/vÃæ™‹6(ç€8£G]ÙeȳJbÉÉbI<“H£kmóG[…î‡Á"Gr—-(Ž–Ù Œç׊ßð§ƒïžõ4EP•q!°=»Šm¢¢þS;†@t銕Z@%•H, F¤Žsߊ¸_FLö±jÕ±"Ÿ½Ø×q¤Ëq¨øfòÚâ#$vÖ­%¿”Uºsž£Ÿ®jóë[‡™Æ}}+Ñ<öÉü7©l-ZѲ̠© eAÈõÁíÒ½œ²\Òk£Lòñ«–*^hÅ´¼™`ò²Å7 `v99õäqï]•òè3ړ欫±—Ë$ªrwcóvîsÚ¹{H¦Ä‘œÉ0VÚ¯-ßG=ñéÇ¥uþ†âãJ6²-ìr˜ì' ø9ä('=Ï߄盷‘͈åJç®ø~Â].æõRX_Ìß—n1ž7d~<×1§ê—°]˨Gª½¬ÅKï€íÜÇ\ü…u^4ºòm%³*Â6}¥ñò™0ÀëÔþuÃB©ä©Á¯0q†&ÐÑ¥¯©ê๧A¹l]ºÖ5;ûöÕ¯.Ù®$Æù;°äJþ$Öî.ªþhŒ¦w‘•Æ `pAc¸«žðÍþ¯2jfÖÕd2'Êäó³¨ê<‘Þº )¥Ó¼/§xwìWu ªd`ÙÁÉ ç'õœ0õ%BU%+vól¹UŒk((ßϲ8qtè–YšPâ`H+×€:wý)×w³››¹ÞGaË»dÖÎ¥¦i¶z¥ä^*»÷Bïk[Á½ÏËÇ ÀçœÕMÂz¶½¡ÞëúpCž»®w8Rž½;VʤŸ*Õë§§sW8[›eßÔÎʱÀ=)67HØRHàÖ›•ÈÁàõ4è÷–zV)Üz¢KÛË‹ý8Ë"lÝê3Å?LÕµMö=GKº’Þx˜”–&!¿CQQOš\Ü×Ô4µžÄíÛ!¸Õoo•æÿU·/#–8Ç'ÜU¿ø²ïÄkn­j°¬© lÆdÚ¡rH®\ÖPýˆ«ºmÍݽÅÔ!v[ y 6à}jã:r®»ù…¢Úo¡ ¹J²gŒ9¹âO/S¿±Ôô-'k”C¿Í—qRÄx‘ùƒX;ƒdŽÔäybpÑÊÊr򿁬£ hÄÓrO±±¥ë²èÂÆóEŒH“æH¾g©(á²t#ü*޽z×Ú´·rZÅ ‘·yp T\óÀI¢I-Æ£Þê[€¢K­­êsïÉ'Œf«ß_\ê7ójEϘ]"ÚŠ ÆvŽäqJ¹ÍÊ’Mè )OBÀ’EGp` =½ëÒ|ðž]Aä¿’Åg·’0RCÐA!xÃ1JóVà„ÉÇ5Úx?â¾¥¢éð«Ë‚ ¢¡ÉèñšìÊê`©Öÿhù˜ØâeJÔw/ø¯Ã6öÚìZ‚4w­©W‚BÄ£åP@ü>œUiìÅÜìúV›âªÜ´ 0v\•À㨩œéòÚ1Â2R»Ü§wfÐáã`yÚŒNÐ02M2 «ˆm^Í29á98oUô=³øV®âðûÜÜË¥ÛÜ´ˆ¡ Äy †Î8#ƒý+T×eº•¥±ˆ[©”¿È»N}3è=yõ8+©kØì‡<¥kiÜ¡rïsrÒe·;“LY;ǧ4ÒÄçœäŠTTÆY¹í´Wœu[Bݼ±…(Ñ»°\0RËì}j;™åœìh`*ÐùÓìvÜêK<°’OóÿëÔ—Q¬s  ¬ÙÚ “Àã$Öû¢of.…t Û­z‚ü¦ÑîÑ­™¡¶ÿ/’9çõ÷®€ª}vÚ5›é~žúîåÎ+ HÁ²äœôÎÏW±–^rè“<Ìo½¼Ê4-ì.CB¡Ÿà“ޝFú×sàM–^½Ô.me-mk4ÐíÆäeBžŸ68ïé\f›eçêÑÛ¬Ù‰™Dx“©è dáGøö®¿âž½‡|…ô¤03*M?–íó¹ À—‘»øôé៲¥:Ϧާ!{IÂ’[þG•júüš“]A{nJÙø_•÷éùS¢²¯çYï Û‘´€‚o_éV.¡—ÎþÂTn²«+™—œu뎇’yãµ|¬«Juå­´>‚Ô ¢´!–K›T6Q^¹ˆ¶NÆ!‡|wëÖ–Âi¡Ô¡¸·y<Ñ*•1Ÿ›9Æ{úTad*Ž)À+œ¦h„Mo"É ”e ««`ƒê s©jŸcNåÿŪ'‰®íõWvº”‘]òœýÒGqÀü1Ú¡ƒRÔôÈîtØ•&Sð¸ààóÇb*¹RYžVÜXä“ÎM!dR åi6´ßñ$ië»ÐtkböîØ½îJZ¬¹•S³²öœzþUŸÖ¥‚ÛWñ&£º¼·WRíŽ0X’ØUGà€¨Ý^9)«#ea‚ê 9ò·x«!kk=ƱÀÎ)ÑFÓJ°¦2ìÉÀ¨ð6 “»æê;ZUSÎïÃ4®!ÒÆÐJÑIX©Áî5«à«MûÄ1Øø–Ù-¤:iøÞHàÿ#YíeiƒQKÕÜ“0;ùî¦8üèÓõ+Ý.gšÈ…y"hÉÆH 0Hô>õ¤'ìê)Ii÷„—4L‰Òº‘móŒHÀ3ÜñÚóÎ-m•¤vl(@Nóì;Ôº–›s¦þæhT#t½¹üéú ²\êÐ[I~-DŽÏgÚ$ “ØTò{ê/FÊm5t2Âö÷@Ôš_%<è÷.%L”$NB3UÖ0IÝSçÏ}¬7M_2I%ÙÝËxçñ£PÓ/4‹ó§j°´2#íuaÓœ¯J9*4´÷SùãÍ£ÖÄ2nñæ—d‘yRï!œR8#žµ6´º\Z“E¡Í,–É€²Ì0Îp2qØœ¸¨Nw’jZ³h[!0Çs»tÏZ–KéM]4[Äd.Òþw8Æ ô•øÊý(Îæ„ß@¹¥áéa–åaœ€£•ÈàVýÕ•¼A&fR?0äuýzV.¢‹ýSìÖ2|ÐD|ð\u’ãŠÒÖõ(ì,R/=Y¢p=Glz÷¯W %Nƒ”ÑÅ]7Y(”|E¶=ÉmAõæ±]XŒ-]ÖoÅôK$,ÀÚÊÊ~SÛžž¿•TòãpL“„Ú„Œƒ–=€® DÔê»luR‹PIî2qrH¾ëv”ëhšBYN ’V5KhüöpÀcÆrµWqRr<ÿõë>^YÙ–âL΂Ù\*‡,y°1èsR Yî“pUXÀÂ÷ç ©aÑ/¥±Šdˆ¾ö v!lÆ8è@çÿÕ]‚h/—µo^`™Æ0*£†qßÖ»pøyV“¾–F«*Qº)xOÁúŽ Âö[&ò• è  g' À?­nkn——Öú}¼²,VÌÅQ¹W`H-Ó§Ã=ëÿâöJ;ê f¸º0XPq’Ê£æÎ8$àU~#éíåxnÓlj²F°€8;²@ÀÆ}ÅzÅ`è/eÍnýÎ9PÄU—:WìvþÔ´ß êoâVHÊé±#@Ž›s)#h$}Ñê}±Ð’8‰?áñ=Ó6“–Ò’ÎÈ›@Ï\sÇsíœt°®ïõŸNðÚ¬Þ[ÈqJrþ€ßKÉH òHèk‹™W¯MÒ¦¹`ú÷7ÃàiÓ©í'¬¿!Ö¶SO ·… ÊÍÇáõþu6«eu¤Íý‘9ePD€vlŽÜrp{ƒžõ'™5ªÅªY§–ªÊ¤y§ælOPqÁéÅEªêwºÎ£.­©KæO9˾=±Æ=«Îjš‡*½ÿC¿Þr¿OÔ<¶Có6úc¿ô¥Q†#ØR  Š¹7†µ+ §Šç °Muäǹþwl3§}MR'5³ã;Kæ·Òµk™!0]X ·KtÚ¨*Tú·'Þ´Œ/NRµíø]‚•¤‘Œ[G`x9ëKNÓïžÄÎ!‚дDÍm ÿÏFô5¶Ò*Ö£‘Â8BáÆÖb›°)ö©r³H×J‚‹®î7pêkCú š­ÍܱaŽ& ÒS÷}ñןlu­/|=‹Âºn—<š­³›Ûv¼LÇ,1ò€3ŽäóÐ ãBª‚©mêÓsä¾¥K¯ê:þiá+¹V+`ãÍ™VÉùàJŚݭ¯Ì6ò’ܧ àõcvŸ,QfÆlô2™¸^6ñÚºMkCð}Õšë>Ô|°0¯mw ó7 WrØÏ_”ç¢LTyå+µo¸ÉÊ’ßó9­"þ}T‡TŽž Ž*M]ÔüG&¥}–fbdcΠ翽z5¯Ã‹?irꈩjòöXcÇïHUœÌqžO`k…Ö¼=wáÍoì÷Vþh“à6CÊ·Ä`±4)(ßÜnæT±+T¿ÚFCAX%ÊΚFSFÊà 8Ç9=ûS¶f7]¤psØÖá»Ô¥½ÿ„£MеµœJÖÍ’aŽÜɬ•Ž}Aä¸Ã¶t’’2q“øŸÖ¸gNÒ²:Ô¹£vD¤¨ð¹Î)˜(Œ9 @Ïõ¥*ʆÏËN¬žsKšÄz,×&SÅűŒ ’wß§Nµ›wq&¥9šS@;S]AàÒ•P/J·9:j%>n¢ }ÊÙDÑ¥´Í/îÁ˜‘»'Ÿl~ Ó]ö™¤FWÎ¥FÀ›F†¡ê7ÀCg1fb ÛŒŸ©ö …´o©¤EÁËä±èGÿ^º}›¥¹ë"+†òe»—(Aez1<8úUÏü9žòÕ¯eH­‘æ¸`Bƃ«¶q€yö¯Z9ךk®­œsÄF”Z}4±â[JÒÇNðÑm»w]’©…'Wo¯Ý>Ùük©Ñ~ ]Ç£Zϳ;\\Øyþ\l ‚Ë’œŽ Ïûݱ\äo©xËÄ’ø’ .ö{8\GÃk¿dk÷öäuÉõÍug޵X¼C­ÕÀ(¾S@ñࢪ@ô!GLwõ®¬ 0ó¬çU;7eéßð1ÅJ¼i¨ÓÑ­_©Èßü8Ôc¸žf•ØÆØ.ãvqžù¬+ý:æÊ_.Aœ÷íú^µ§ëÞ]½ÍºÈI"Ñ¢ \g®î¹Çò®sÅ¿ôòͤ[ƹ!‘‡>£üöé]Œš—³æ¡©… Êj|µ´8ÿ‡¶æmNydpžpÂlN}rjˆštÒ]B°‰>Ð|Áãró† ŒpyÿKO x†Õ¥¹Š2Ø$ªØæuÇzêí¼'5¶ŽÚÞ©¡_K¢¬÷sU‹tÀÇ™$Ö4pµ*á]=îkS UÕE+ô·sËeK¹âVevEclqëôÏëRÞi—ئ¢-%ŽùCÈ8v@#ëÒ»Vð(T„é—jm÷ïH¼ÍØ'Û '?Jê|gð¯Vñ†ÒïIµº·°²´3\ å32•Glc¯8¬!“b%JrݯÄÑætcR*ú?Àñ¥è>”‘œW¡hß4WÀóxŠoCmy ~`µšP­2ó÷¿ ŒúŒu®OOðN§¨jÇM„®ÑÉ0` g“ê_¥qTËñ4¹n¾-¬tCB¢•žÆU!8­_x[þ·WP‚à:äù¸)ôÎ1YDÔ×-Js¥>YnmFqæB¼ŒVÞ¯©§‡-ô ›ÐyÞ|Q‘Êq޾OCÚ³ˆH¥ °²‚6œÒŒ¤“K©J×× °üªM5ö_ÂU Ãå;¹¦´MHŽÞôY]Íet—°mß †MÀ{úнÉ+…¯c½Ö¼3yáˆì.-í®í"½A3Gs‚»º8ë‚yêÇz³ªø*m_LgÕ5íä·³kˆ>Ðà£DG8x$z`úæ¹[Å(Öì¬_ÄZì’nvhU÷Uo$Ž„’= =¦ÕüFÔêѰˆ^I˜ác ±çg¯jöý¾ÂQPmtOü7ÙWR‹”’kªÿ3òÒÒþÍk¨}¢0»‚Çž[¶þu>… w÷‘i‘Ý$fY/3aW$r}†j…ÄfÊîH-î’]’2‰bÎ×ãpÈèzÕÏ?‡fèœ1áÆ7d}ìö÷熼šsN²Z#¾KÜ5õ~îá /î³j¦0ãr(,öR?ɪw73\7›q+±ÇžEK þ‹ëC ‰š6ÆÐ Œô<ŽÜòqSë––)v¿Ù³/ïýÞp*äöçóÅvÞR»R¹ÊÒMhXÐmu‹{Çò!š1!YWvöÆå;ƒÀ<Î3šÀÔV kl[ÎÙ.wÆÑíã®x÷í]_ƒž•n …¹ã¦kÖ…z®Ÿ%ìžýßϱÉ:PæçjímØîü'q§išzXiÑ*o %e8óJŒ#ß5£y5´åÚö4rSo˜ñ£2ÿºÌ _¸uˆám¼`Žr8©Úîöëtꓼ @Üd`€úN3í^½ë# ÑŒm¾k–/!?,k5§Ø¡oµÏ(!–GPO•èÍÐíõ ð3/øÊÃT‚øjÉ5ÂÜ6écœ+ëÏȃ€ŠHs\4W~3Åd.5M‡Ÿô½±§û@õLT:Õï†ïÄšg‰í®Òx<Å )i|²N7 cÍ (K™"e„R‡-ÎÞÏRÓlã‡Cer)(ƒÊØänÎÓžý¶á`J)tX´Ç{FÒHbd·]‘–w`Jã'€MxõÆ¥s3\Ï#³•#çbpO\U•ñÔQÛ[[Ÿ(Ä~ü`†o©š)æ|·KD*˜Ô³} &ÒôËÈtm>f¹xáA5Ô›J6@ÀQÔcž¿¥Gà½.ßUûLþ8–ÞÚBþZiŽOʃ¹9öu¤ñ\z5øK¤šâ)LCÎiÀlÈrO#3žÆ¸Èu[‹M@¥œìpJ’äâjûEåª{Xô(Rö´l·6µ¿k3Àn–)Œ$mr3ƒòñÐû}kKlCÄñ+ F×Þ€àd3Óð®›Ã¦±x£O‚ù@Œ€Lr¬Ü~ˆ<#¨YÎæd~ì4{‡úÂqÐŽ;Ö0ñœZkÔÞ5eìäÐÍoÂ~“E†ïK¾?kdÝ$!@L{çd1,p‚Ç!G Sºk’ægln]¯³ÏµsPÓ£·x¤³22¼@ÉælóŒǧòªÍÜ™r;ñÒ¹eô{1’[Š\Jc!‡84¬äc œZæÕ2‡Ã4Ö²,ÐÎÈêr®§Q]?‡õK_X¾“ªM7*æh.\}â(H䓨z×(Ö©õ~ïG½²³Žü§îdû’«eIÆq‘ßÚº0õg Ê×KtEH©$›×¡»,v6­t!¾·Ì34,²¶ö”d ¨ã€rÞøÖ¶&¡{¥\è:e¸•/%…gHS.Fâ@Rz|ÀtáXÒøzÏOðÍ­õôÅ/g‘È·# åa66@rØõó§g<ÑÜÆ#¼h2@óÈÚ+Ñ…IEûËuùœ“Š–Ýx“ÂšŽ”ï¦ø˜òXÄ0×åëî=kzéüH¬¶ˆ4µ’âÅ(ºx%°K cü\à æçTFFFR$\€§‘_Ç5ÁŠ„a6ÑÕI¹GPÓì⼑#–q-†‘ºŠ‚MÑ9…Æ 1éOãw|ȧ\ º‘ ²‚A]ç'iä~•ΚpVFéë¨Á”냓Úõ=‰Í+>Ò:šVm¤_SRN¥Ë ,-Õ¼×Êã*ªÜ‚~£ëVíçþ„†F'c Qø÷ªŸØSHÁQÇ^ãi-Ìb‘Ïgnkº’¨´’²9ç(?‡r}6ÎÜ:à°ášB ·½®q)eäÇj©<Ë·qÂ6“Š»aóÏ'ñ®ÚjöH朵ÕO„<;÷K3`ùcs±û¿­kkÚ„jB«B€xãš_ °- ¢„H<“×ú~5ƒâk´Žæhœ0aÂŽžù5ô ¬>r­ÏÞ«]ß¡“~!3É,¬2XíÛÐñ¬­BXÓ/ÚÇËÖ’âöF™psPÆÎÌK޾õóÕªªØö!]KÚhÁåYüÍÐ ;jÔ¿³µÐ´¸¿Òã–òYΕ>[œ t#{W;ıÊ$RTŒišÍõÔì¦ÚBFy\g'…^0¤Ý®öc)M+è[¶Ô.µ»Ï'Q.Æ2'®ýÙl–œç=úÖ|š{ÚK½ÔàôÍTº[6Mžf¨»×=¿J¹&©sw )sõ¯w¦G{™£\sµpÀÇxÆh–Æ;(TpIëŠõã‡q•ÞÇ*ºX£¬ÙAyj‘íû™bÜe˜žrzžƒ¿s\ÍÅš«ƒëÍv„!`Ú‡!‡Ì+çN”gtgž‡µc‰¥Ìî‘¶£JÆÆ.ÍlߨÂpFþt-y±†Û‘Ôg¡ô5©ûc,AR9+6ö!#6õ¯2¥>EÌ·;a7-:7VFâV(bp½*°eéšÖ’­ÈÆj7_7·Jó]-ÎÕQ¤f>ÛÉ­m6Üë:âé-àóiY¤Y!A'Až)Ÿf¶il‰¾_”Íé¨K]‚rmy’\YJ‘—s`|¿.{õÁ?L~QÊß*lµ …ÁÚÌ}NIçô­e•94˧ŠLl£&º4•ú{FôNÒµrÆãI´¹R¿,žC6 Œ2£nzŸ›¥ssÚIk;BäåXƒšê<Ž¥âûK-OR6<ã͸PIŒzð ü¹¬M§]êÒ.Öd8&wØ÷$vúsõ®\D!: K{›Ò”•W¶ŒÌs‘€:ÕJQ-ùu9(öŸm åUØ ºœö¥›n;·`î-õ8ÅpY¤u!K SŽãµ- l1Ö‘'T…9' «Éc(rñ¦sYöšë Š\ §?)'¥l[j6ó*.ü–8ãšöc:5–ç¡:] 6fC*ªFsµìbvq=O=*kHlæ˜BªNåË?‹ÒµáÒ­­Ô4[yëƒ]¸l4šæZ£–­ukXÕðü‹m`ÌíÉh¬OÛÜO1aÎá÷ÁúÖ¤R$qªg${So‚OnʲckÔª¹èò1—%^s¸·h™œŽ^) @3žÕÑ\é–Ž~Y-٪ׇâefŠT`;)é^ðÓ‹ÐõcZ³1ŒÊÀRظ´ñN–$#c\¡~˜+‘œç¶ëEÌ1ÚHȤäµWSÞ°­Ôráã`TŽ£é\u‚¿U¯ÜuSÕù;‹â;iRöS:‘,r‘ÇèU‚‹Ëv*C®áƒÛ$J¿â‰å—WMA˜1™#r1Ô²†#ó&³m Ksåļ±%Uœ:ž¦¹ê$«?3h):'YáØ º²ÿI”¯÷EtúH”¤c*Ë»ž+Ñ/±…”qЊíü=çÜ ƒÆó@í_I—Ê2²]œS¾Æí´+´:¦r:Ó¥·'–AŠ—H²¸xTÎÛ¶ŒcÔúUçµM¿-}`ÜSì¬{}cr<ŽõP:Q$ÊíÓ÷¦‚ ’é^|­#¶)¤9‘›¢ƒI™~L…xÍ=,eŠÔ-1¿!D¬·» ¹ “oR1DÓòÁx÷¦2a÷A?•O-Õ¶Ái‚=)GXÙ°µÒÔ›Ã:jZ¬6ÁžW:–$=ãSëú–‹­y[\,qÈ–Hö30p yççÎ3Š©¦kÓi×ðÜÂbÌn$9ç‘Z>)„Y_ŸÛjVJ÷>}µ¤N\.â\¨ Ä€§ NsÔÕ¯f¨Ý+Ûp´ÝMzìr:°þiR"ˆò·až:Èx™ÚÝ “¢g þŸÌQqªÊñ*.Ðé(‘fx¯×ŸÂ¡Y¥óØÅ(ŒËäp0zŽ;W•'S¾)ò¡ˆXŒž¨-ýÌtæ‡#m<ûƒN¬„ÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?üŒîfozst?JÐ)Á=zSÑ™¾õ}ÀËeˆÔ%1™„`&K7J®¹#•ð °‰ƒñ‘Ó"§´Õu(<µ*ÑoÎ×\®í¤GB@'õª\’ŠOtmݬÒ4dÝ„g×üš·1Ó½FÊA“ŸJ–ÖÞâîaokHíÑdšWlz5q†,¼V“iE&öêzg7ŽîF3HCÂNPOä0Œœ ã=þ§éK$•ÙEF>ffÉcý)2ìw<…Ž1ɦ¾€ßZè$’Hü(G/Ÿ—»×Öëë@…¤##CFõõ  /nšîDÃlŒ(®Àê}é°ßI#¦1IL!”‚1T¥+ߨik–ú£Ãw à¹Ä±È9s€WÓ>i5yc‚G¹š ”É&c‘ŽASÓôî+"$²f ãq©/dº ,fv!q€ÜãØz éöòtßáêeì£Ì¿­Œåä.™žæ¦·¸rrÕ\>: þ†´,<¹Ë3¢ŒŽp;Öt½çkê\íaÑßN¬q'ëJ×»°#\c¨<ÔS ¹Dl}) ©­y亙òİ—®¼9õ©!º‘Øà zU'RNàØÀ¥Fm Šj¤¯¨œF£D’Ÿ4HxþJ nûàŒtÁ¬øî$N­œU¨o0¿)jè„ã%©—,‘=" c5Úx9.Ç„Ò*²žŒ8ê)æÞ:­ÎANOµ<ÇHÏçVKMl:hR5U¢¡¸gQ¸J­ì§¥1dvê­ùTIêTnÙŒè\ä6(Mª1»ô¥-ƒ¤ýG¹çyGv䀃ÐÓ’ âI>Îî>òœ'¹ã¥Fœ‚}iÖ÷FÞMÆ0ѱº¯ó¦­}A"k„Ó¥}ÖRȪ°‚Æ|e¤î;g¦j+VL²›‡M¤ñ¯#žÕ±<*®ñŽ2›¹ÎëS¦§|4ÆÒržI˜HÃÊ\îÁæÆqŒñœSVRÔ¶´$¼¸Y­wEr¡QÌq¡UŠdœ¶>¸ïúUm¸–'Žôð/µ´EV’WÂ"*äžÀ? dŠÑJñ²à‚A”KÞÔ‡°ƒi$ÿ³O°’8nQ¤Ea‘÷‡ˆïA š“O³kË¡7(9`8¢œdê+v‹l×>}LIq£ÊvGwŽ@qžáN0sÛõ¬«ý*}=ñ S‘’ä{õ [YA£^³8ò¼˜±ó¡‰9ç·jåõ´ð|þ%–-KRxÉRû¶pFëÓ¯ç^Î'/¥Q’i7çcÏ£‹©*Ž6m/#…%œ…9'é»6·ÎW ÷‚õ«:´vWŸèWМÆÄ`ãÞ« êÇ×(¸¾W¹ès&®*$’cˆ°UËaz Pr3HÍ$*H“n@R¡¹ ó@# x…! .‡ êØ¢¶*xâ[ÕiaòãG–óÇS“Ôûu¨¡©nmµ-"Vµ½€Å#G†InŒ÷éMi¾ÃVdDàfíʃÿ4”4.Öþz¸*8íD.ž€’d©:»cú™•J†uà”ã­R?ëÝŒU¸îmÂ39% †Æ>¼sZÓ•Ö¤IvHMãï ~4ŹYØ‘˜ú(©`û@Üþt ”#Û>ÀjïÌ…Êúˆ_gµK9\( ÅC6qežIòÌm™çô§ÄÄ‚±Æ@'œÕ§b%µ‹ÐF~eŽøëùR±‹¨Q“踨 lq»=xÍXSçHÏãZÁóhg(òŽxÃã=½ª2Ç©š»²°;ŽOÒ¡ž$èjœeÐQq¾¥E¸œ —/ýêj@PççÚ,ëÀ¬[”K÷[ÐË#ÌïŒzN"àsß4I°<¢qšz®ÜóÖ¸z;!i¬W8 ð0{Ó©w.ÜÐ!]÷Z*´7šv6ß¼äíÇæi:ô y÷!.ÅTá<.zý+GVðµî<)<Á–X–D–%m¥NzzuV±¥9«¤9J+vgÁsug0’ÎgGþ`Ó@hÝ„‡æÏ9õ©e²s+@²– ÷§ÿfÜ2bÛ"¨Ëºä€qœg½KŒ’Ij=Pÿ0\âµ|,Ñ àî;v¥Cc¦©µ8*¬·V=~§ùV†irŽ£ËØ¸Äj1’=HþuÕ…¥54ìaZqTÚ¹¾–дF5¹E2áÕ†ÆG¸ét뱫Io,Fuˆ“ndÏg§ØÍ¥êÚ‰Ú7Q·<@ªZm¹¼¿™¼ŽM²©`9S¸ãŸ¦*ôñ4=«ŒZ³8°õ½’“ÜÅÔÒêÞí\èÑ ’)©žØß׆÷¬Û¤¹²V°½„点ÁÇÓë]^££È×[Þ3¨ðóÚ²u=*{«¡-Ü¥T G9®øZ‘“h飈„’¹ˆïü gñ¥ €FzÔº¥´vWÍml }þ¼Šp=+Î’q“LéѤÐÑwsØO%™Œ’9fc–f9$ÑBÙŠ¼»:íÍ-X÷ ³i™ôÛ‹‰2 Í¿6×óªŒr1‘ùÒÁ.ܺ¹VèTwê©É&º€ÝOjP€^)\¡pË Ú=€óÜõüh©…‡f?…/œÃ£b“ úR‘‘ŠjRC%°9?Jµhàuj„lªÀzUÈœ°Þ‹“Ž9é]4Ìç…çdj’Þ¨êj8NUx®‹Â6UåÒɪ0§2×,G°êMz(ûY¨£Š´ý”ne&@ù×סtVɺ-r žáôí>æÞ8€¥À #œà’aF0zžNEb¼lvàw­«RqV¹Œ'}QI”®HZ‚í}úеs€µV”ã·Ý®)­,uÁßR-C@•&. •<ÜU-%VØ9"½‚ÿÁ–÷:<ºŒ€ªÄ9<2öÇôü+‰›JxØ$–ÛUÛ*̽yë]X¬ªTß©… |j+v9O°]¶„äô½hiþ¸˜ºÚ¹nnŸãÿ×®¾ëÚf–Ñ;êpOº%rbè™Ú}ÇzÊÔu+h˵²ãœ*ã“ïYýFj?‘¯ÖåQZ«€„,QFHær}ëjÊï#ò5Å’áa¶1Û‰&Á’Wx“ŽõÏ6¯y%­6ëÅ7àßÛåÏä(UðÔÖÄû:Õ:š:Íž—`mmJ%WyÕ~þ2ÅpOã?¥a̽¨¶KeÀNsŸaÖ¡ÔnoåŽ)g½FóT¶Ä|”äŒ7¿‘¦iÒEâÍtØç~ 'Ò¸êb#R¥’±ÓN”¡ ÉÜÞ¶ÓmÞInxu>êŽã$õöçëZÖ*ºK«=º´l8 rWÓŸZÀ·ñE¹I#•pÊe~ÿ?¡¥O–¸ŽÙÁD Í'!yç€yÝO†¥fž§,èןM§Z¾–Î&á™ ¨ ‡ppNOJo…-|²û‹ÿ`ŸÌf¹é-îîµß.ââ)a\7™ ŽƒéÀè}³Þº]X“T6ñ9ÚÜ¡?È~u݇¨ëWR—¡ËVš£K•uÔ»â 4Ý[3F£wPA®7Vk˜]b1¢A㌃޽4Ù‰b ¨éÍrÞ5²€ØHTŽÝZRìçŽ8Î?Nõ¾a†½74cƒ¬¹ÔYÂø‹ ªH¢XÛiÁh[rŸ¡î)¶z­¥®‹w§¶›Ï;'—;/Í$/8ÀçÒ«H@•¶œŽÄw¦gPì0B;×Ê:’I5×õ>‚)(¤ÇËqÁËpŽd(Ê`ãž1ϱ 94R‘ŠÉÚãnàjK{˘%º‚ÙÝ MÓ2' ¤“ø‘Q³«ýÄÛòŒóœš·¦ê:²ØÉ¢ØÝ˜£¸;¥¶ïÀà_§­iMEËPÔ¯‚&paWó¨Ü:g¸©/4Û«F¸Aó®G?ÈÁüEE$rÃ)ŽD(êpCA«o<×öûç¼RU‰`OÌr'× J1”Z{‰·} [³ÓùÒ9qè?Z°‘ø®T‘ÆGzwÙøËŽÝêU6ÅÌŠÍÀÁã4è.LG¸© Ÿ ü¨ŠÍYö¸ãÚœc(Êè\ѱ£Ê!†çÛÚ¶¼=«I£ê^G# Œ3µˆ8Ϩ®{ lÃÔ»i3Näãjƒ÷sšôpõ]:‰­ÎJ°çŽ»¡mâñe¼V6ÚkJÑ}œÅqn¸S#Œ2¶w;ŒcqõéÍs0ð÷‡/ä´ºM¥8È$ddq‘Ó5“i+[\FÐK´‡pxõÿ>•·¯ø®BÆ=8Ú£Ë m÷¾c3ÍÏË×…'Ôž:t¯YÕ…j^öèóÔ%N§»±ÍNˆ21֪ɤcËÝÛ¥h0ÜKI²!ço¨ן(\댜v=GÄ!Óu(W@Ð$˜¬—`ÜÌHeçxb1´îè *õ9ªZ¶—m®ÜÍö­_K²ŽÂÏÁd f+ÐI.È­ëxtÛ]û'KãÝ€=ûÝ þuÏkþ ºž5°I µž`ùªwŒò8¹Î}ýëêkÒ¨éÝûÏ·èx§Ò^ê0.|?¥§•6«ª2y n ˆÇ¸ÈW3ý—þ°tùæ’ÄVtÙ–n›‰8AÐ’Z믴=cÁúTú†¯ä^’|¸9SÃ=yÇ·ïšæ4_^i̾'[H/.H$É©B³É…n ÀãÐv¯¡Æ3»ú}糆r”\¢ïÛÔ¥¯è¿Ù †Ô­ä=„r‚Hþðõõ‘ Þ>ç'ÔVÅŽ¸Ú·ˆëSÓ-®d¹”e·HŽ:W~Ÿ ~xŠÏû Ãé¶Õ ˜„ê’¬i1*ÝÃ*;޾ço yîŠÄ'(4—Ÿõo¼ê•eAÆ3NïÈñâÇo&&;öÅt—ÃÏÚjwzYµböW˜ ¨pqΨjþÖ´;Xo5 'Ž+…Ý Œ¤_ïQ\Ãb"œœt:£Z””µ3|‘ýãïI´î!˜ä}ìÓ‹dÛ½"ª¨ÎzŠÀÖæ®âCg‚ùYÕGÈÀdœãõ­ÿ êqj×» Cº7dã±®5SozÐð®´º³üÊZ ÀJ«üB»ð˜ÉÓ«7îœÕðñœ$âµ=¢Ù<Â*3Šå¾)ÙÚ'†d•¦!‹‚ 8ó Ó´oË|’^Ü[ªÇ»!cÎgÓùW-ñÆ â ¶ñmÔ¾¼÷è?#_GÆáåv{«#ÆÁák,ZºÑnrädb’0Cšu"® 9ë_}´ÍížX~âè:µ) rh Vâ‚}(ƒLù£œÅJ‘qÒª¾à$ó\Þ\=ÕÄ­$’6éŽI=ɤ’#‘œŒàu«º}ÍÔ¦;7Û»ånzƒÚºkφZšÙŦÄÌ¢Ü3ü‡ ó‘úu®Ê8:µ åÜÂxŠtä”™Åä ,q÷É^†¬%êHÈØïZwF¦,f’+bB$ù9Ó=ºU[é­ÖìÁå£9\òI8æ—ÕëAh¿•JSÝ”âºBØ|Ô³Kr†ó¾ðì{Õ‹m*]P³6:: »ý–‘\·´L®~y:èsW 5\nÉ•ZiØÈió 6bOñ­+yÊnxY³ü©’ŽBò+31åjhzN£{Û ä´HGÖ”)~òÛ™Ö£q,ã‚Üé¸ã±À©Zä>Qh÷pvd~,–²ÆYü¶Â÷Ç©¼«$AúgµvKšæºcÞeØr3Î@òm`¾gךyÎAïÁ¨-É=j/r¢zÒÍ ÆÂ"Iê[wN:`w­0,týº„÷R½Äбüò–ÁÏÊÃwCÉv«W:&‘{¥­í…ÆÀ¨Nc‰H,p^=ÏSÇ瞦ðm‚ï 1ùñvƒÆ8äð9â¾É.U}î|²jkBMCK³Õâ:EÜEƒ`2mÆl~+çág…Än'ÒYæ8G ¥HÚÙè\ Œû Ò]Bê]F8$µ†UiUˆ ü¼r;ö­%y# ÌÊÇxbN9êIúÔJ• C÷⟪5§Rµ‚Lókà=ùÑçÕ¼<·Bâ;†1®rŒ gb‘É|c°Ãi÷ëXî¯îÒLU–Oõa08Îs»9íÒ¾Œñæ¥i¥Gqh …³>BŒ yn; ~^õó^¼LºõîåQûÞvŒz×Ëgx: •kîºöSŠ­Œ„£UÞÛ>§E7µ+}5ì$½¸ÆSËD”¬x’@#'Ó­dk~3Öµ´kyça˜Y V"4'² ;@úÕ–^M¸bO=Í F0}+Æ«Š«QZúœ(›½‰./ä¹´‚Ïì± ‡wÏaŸ>§½FHM:H£ŽÍ + Y‰#i†0p2xÀ®io®¦îò3Šc>~á)X†zSO’ÕÙ -KÖZõݦžÚ\+6ç%ºŒt>ÝêÙÚåÒ2HD±žxëúæ‹e–}ìÀ,csn<S.Kq$Êß}óÒµ“›¤®Ä”T´’?‚©ëÅ#cn=)Ðì1Ø``VqÕ‡Bì¹1€À¶q€(}6kYDw18ÎÖ5nÎy-fŠê&ã`À°ïW4õ›Ä:ÒÜê:œP‡Ÿ <ä•RrI8Ï¡®ÈQ¥-:˜º“O]ŒäÒe0µÄH\gÝ“ƒ‚‡ò®Šò#I~ñ+@ò²ÄžpcoÓ)Ú™¡ßݪêWŒ±ï\¬hK0,2Æž};ž+¡a¤¢Œ%ˆ²»1,æ’Í’k`É"u`zã¡®‡Gø£¯[êV³ß\´©n¦6t'$7¯|g¥müAøe¦øb.t›áqñ«f!²Ûˆ* ÂŽHÈÎFx5É¿‡æEYü¶ÚyRTšéTñxYÚnÆ\Ø|D/$z熂¼A¾¤ù×rÇ y˜ãæf «–#$©/| ´W¶<~`C#Æì©Æ0Y[§PHéšò‹]cWÓmE”DˆüÀù_¾0À'·=+Ó¼ñ‹OÔmàÓní&KÖ-¸ „c÷@%N03èÆ=ýÜ.2Ž#Ü©díÕisÈ­…©AsBí_£èW‡C’+C¬iñÆYÛ+3À˜`sP~8DZ®w]}÷NmËÜŸ•@Èä×>¼W¡®»m©LÖæÎ,Aû’®•÷çjŒ€€c'óÍgÜø_@Ô„w>BÈÓª‘öV%ÎFF9 ž?^Ç΄jFÑÓ£ØÊå©À Ø^<:}¬åä1âYB»³’ppHŒú×Ogàˆm´Ô´¶˜•#æ=Ç·ùêjëi©§ÌÉecLé凖3À=Oמ2xëQXx”è/mæn|yg~r3ù~540ô)?y|Ë«Z­D¹Y‰â/ >›içIºã'júv®WSM8´RXÚÌä7œÀåû‘€0=¹¯L¿¹RRØ\:| gó9?á\ψü"ú|"âDS¹F¡ï\ØÜ#’æ†Æ¸\E´žç¥Á8ãž)±ÆCûÕ\¼î[Ô­ m]¾§B&eœ–ƒØó^$ÓŒ¬ÏZ’¹ô~…sg¨hñùò‚ ö‰-d©Ú¸Úp%²x§¯ çPê÷öúAÐÓÊò]÷¹0©lñѱžÃõõ5ñYî/ëÞI=!séò|:¡…çKâ"¹xå¸1Û ¨8SŒf&O(J °ÆNNÔØv‡RÝ3È•±®jž–ßÉðõœñ D—/’HDÝÐô߸Ž:b¼˜ÆMÉž›m4’2.`–ÙÂÜ‚ƬªNp¤d}8¢Ÿm`ú„RM‘§–77˜ár0Oú~µ9¬äº÷û¦®hú0Õn–Ú]JÞpZIdùWëïTÈ$có¤”}âSƒJŒevƒ[hÉo­âµo*Ëdõdv¨¸ÛxÅ) ê¬%Ë€þ´b!YpAäzSošW°YØEÀ€«[Gå Ãq?s¥Z·¸Ò/^(níü•U òB¹f瓆8'èôMJOž+ Y0J¹ÈO†kxÒÖñÔÎRÓ]çÊL«‚=ŽqM´¼šÊ_:Jäùzà‚?•¡Œ€JœŒœžÕ'©ó^ëAhÍG¸‚âm>öWwŒyáÓ œôóØÿú©öm|ÜA *ó° Ê: #ר¥¦ø‚þ×L¸ÑÆZÞ|3ÆÙÀ`F{ñ¡5¼*EÏ] gË¡Ðiº²Zkæy± ½ºrsž¢º­ WÐïô‰m/íÑÐBYÚ,ð1¿yºñÀ8Îq\ÝiJ±Kk,™ 7,‘‚Y»÷àÇ©«VZ…¼r4†t\¡Ã³aAúÏà+Ô¥ˆå¼[ÜóêÑæÕ"Æ©½ºe´‘DÀµ¿^ÜU$»Ž8Ù>Ëí…<ÆŒ1çëÐûÓµmIvšœS´Š3¶A¹sžê:~™5ÁìAÕZ‰LÖ”-ŽŽßÇ×i jˆª!9·¼Œ&psÊ® 義íüe®h7±“¬¼»¶¬§r²³'Ôä’sœüÕÈAcs|ä[Äò2B Ô‚éžÌÚÝ»4‰þ©‰û£û¿OóÞ¦8º×¿U³-áé^Ë®ÿæz?‡¾"iZÛ\Yë!t¶ÌWŒ0 (ÆÐƒ9É9Î@äñNÚKMlË{$#µBò¤|Èê?»Ûӓ޾Õçö×7šTÂêÞBA8 æº=?Å6W ßI4ö—¶Ë£hÁU×®áŒmÁ^G 種šy„êC–lÂxHÂWŽÆµž©w`bYî±€ [85µ?‰¬î4§ÓSËk)y<¥.p0H$¦+‰Š=BKôf–HÐ’]Y¤KduÀëJ–ûÅ–ößÙ讆Y¿pç\ƒÈ'q<Ýk¢ž5Â6fSÂ󻥩ҿ…›Qµû\þlnÅ~Aœ3È\Ϋ᷶”˜£$ U7Å–»%VdÁÈ(ä?ç½hEâ YÈ{‚I=Øäþ9ª—Õq¾Ä¥^“îz?ƒty#{yçº-²GLëÏ^¼þ™âôó¼E,Èòñ.:ç'ëœ úé[¾¸··ŽMÒE¸U\’} ëíÞ¹{›¤›T{©"–3=É%eûËÏÛúWÑTQÅ.g^R%´±™c‚)_2ÈBùdœöçžÜõö®Öæ=ÂÞ]BòÒâÙoíÌP¤òà¹Có²à‚A;I°;\ÿ…â‹WÖ£žçy*ɱ;?Óóéø çi?ˆâ|?§jcbŽÐ:ã$/#+ž½x`°r¬úS£<^*4—ÌòOˆš´zψBÊ#ÉÊ1Ÿ•ýk9-Å5…L³±,NI'­?9\ûWç¨ëIÔ–ò×ü·Œ#Nš‚è4‚ÿw ÷ àü»)ø ¢)%†A"mÈï(=F;ÖvOr©qu³ÚE6Øä ¸ÈÎ?E³ŒÿZz)^¦€00hÖêáp'4*¹b2Ã8ÏJZnÜqž´tlÉ*²®9«Ñ[ZÏ!@vnœ*˜Ä‹°Æ:ÔÖóD§jŠê¤£9¶Ö„·š=Þœ©%ͳªÈ3dÀ` £ Âc¯ê6cìö÷nˆT¬ª­àŒqÔ{S%»v;$mØ@þp=ª2úlvS ÖC; *FÕç’}}kÍÈïI½ëËß¶\=Óª«Håˆ'8qŽj"J …ÍU˜8ßίXÍomz“]Û‰¢Vù¢'‡¦GJÎ2çz–×*ЋyßóI«Pb8ÉeÏÒ¡ò`i¶BàÜŽ3õ=[»´¸Ò•Vò2<Ä …H;†O#GkHÇ©i«iѤ©4Aq 2 …³è_ÐU)dòYd™Xsžþ£Ò®Kg«éöTE0Ã4x’ýàIl3ƒÇµg3¼‡ Ôšª•%mH‚W¸¦öé¥S#™[pBxϘô•M-óÜÈpÎNÁP\Ûµ´¡ èÄ/;E5ùŒTcøXf³Œ§kš%­/Q6.|¹BåJP{Q{uo$êédÈÞ€HúÔÜi¦.Qƒc© ’7³hw›ˆ÷‹»šÞ2n<·F.6•ì2w‡Ïe·ÞÑnýÛ:€H÷œlÔ¶ÒAoÑ,¿)SÈ5 ù(à“Á<šÓ²Úuì:”QÃp!8I(ØìÃŒjtâåÔ%$•¬;úäÚ,Íkx­&ùdMÇŒñœwã#èqZWø^öíu=.óËiÏÏF 3Ž>§¥fù¶7R .abÆ]Ï´…\wcŠÑžëJP±YClTå‘LÎGM®zôë]´¤Ô-&š9¦¯+­Én|/­Ú[Iwkiö‹d™­ÁeÁϯ×Ò©4S7ß—¼VŽƒã}WGd;cW-å&@¸Á$ìA©uOK®1Ô-¹pB£ Ç,ùÖòXiE4Ú}ŒS«{;»áX~É`ó¬kÔË4‹ó?|ãŸÒ¹ÛÍ9o^yὄ™'#È ƒÇãÆkoÃú” ¤\ÜÈ(À’Y™B¶H2z~u‘akyfV "yRìclü¹þ¿ÈW×N*¬cæ¡7Nr“áÅ›Â>Ôuë¸c7vñ3BÒ3m`c…<žqzùËÇ#¹ñgŠo/®nYöŽ„äãŠúâÝäú7Ãé´ó(S~û]¸8sõ8\~>ÕóMÄrAw(œ¢éaÓ÷V¬ú,‚Ÿ=w»ÛМEŒ/­-#.áŒ×Ê7sÞRE 2¤Ž8â’‘T‚Ib}í@$óŽ;ZZ(¢€®Ìp[†h\;“Øt E‚n”ä@ ÐVw†§Yù›'8ËtÍ6»¯OÐU)kv-Õ‹r!Á<à žµí¬ÖΩ4-* ¸%OCô5”ƒ’øü)òÜÜ]÷3´¬.çbNÀö®SNâI¡™W ö© ˜7ÊHüj ãÞ¦²žÎ7cw¸)…ÚØÁõ©ƒMî7¢|F#Îpݽ*»«—o™ŸXæšg€p=Í1Qœ–<ô­%+«"#WvNúä iæ,ƒ…ä§¥jé/áé´«†»ó–åc²¨V óœòxíXÑ[3ç{cð©Ê[$%»oþ&f~X­iJqwzú“8Åè´,iÖ·¬æÖÎÏ)³¸{d÷üj ­:îÞåí\…h؆9Î~•¡­pú|vñÊ ÙåÆC6{“Nò.‡—q5³´lFO¨ÿõVÊ•9%»d{IA™ïl‹\ä÷jh$}ã[úõ…ÔÞ~•¥µ•¸M©Óoveá˜ð1“Xoo.â; U(òJÁŠKR%Êçq"¦¶œ#c8ÏQBB mœõÅ:+eGË|ÞãµDbÓºÕ‹¢B£œþÄR[vFIÏJzS£@@Püc­tEÝ™nXyÚ}™ER¨áqœù÷«¾ºÓ4ÍN íJÐ\ÁªÒAŸ¼üPBÞ©£xÁáõ$WL$ÔÔŽf¹£cÚ¢o+ÁDlÕšyï“\aêZÃw:œx$ÈX‘´t $àñè)Þ$– _ Ùiöñíi#;†X’Fxý=ª=*1a§Ï.£8U·\x!¾:äWÚ=*+tGË«:NýYÉ|lׯŒîÏw›{hqåoÈ r?ôõ¯)Ñc]wíI,q,…ef$¼ŸN éþ3ë±]‚Øa–³“þs\]Ù¢ºŒÝ†ò²Å:íï_ ›b\Í­ÒýO­Êè{<èÆ¶QÚ=Ü©ëB9Þ1Wµ]@¯©iŽóX™vÇ3`s€Ø'8ªg‘^Dá*r³= ¦´¬†n{w¦(,6œõàgŠžáàšÚ(¡Œ†MÛÎ3’qþ£B9 8šIÙd žç·¥)=Á ¶=³Ö”€zŠB (¢€ (¦Çåê•»H¨¤M£!M!*98>¾´¨¤u# P¥&@ùPª’;Òà‚VÀ7 Ô±¢ÇОH¨ÙCrGN”èäDL媣k†¬¶‘³È8ïÅ82¹ ä WK­¨R ¯tozÒ'˜ûÁOÝ®´¬bÚ'’Þ8ehRQ ‡CÃ{×iáwÂ0øhèÚŽ’.of23Ë6§É…Ãv“Œu¸HeØf«V·OÂÌ„©S‘õ®¼.#ØNñ[èr×¥í#ftö¾Žî&šÓR‰™t‰»ýZöÔ÷Ǧk+QÒ¾Í;ÄT­†8«’xšÖ[…–ä´ªø7 Ê·g-·¡âº»;/øŽÊ!¢kD·Y³¼ûèÄNHãõÆJ*ˆÚ-&Ž7R­e±çÆÂä(AL{YóÈW]âÞ o&Î06>´eX‘œðysíi<²㌾N0+ž®Òv:!ˆçW)ÇÝ4"Ê£ :u¦’ÒHØ©\ôˆ®ãÛ¥s5ËÐÓŸAà„'­)¦«ç)Uƒvç½i{žË¨ÜÁ¨ë˜H²¶Òªlb@]¹éÇo¥7ÆúÔZ?‡"ÓåÚó^6ý½9îw{ñõ©3ü«:ÃïΦŽãhIŸ¥lªÊú鮅߉:€7‹b· åy`¯®x!E¿jxžÞMSÄrÏj<Ð[–rÍgÍmuhÛn!*sÏZçÅsÏ9½¯£6 £ 1Šz‘l>„ã¶jJB@êh'5ÌX8r) ˆÉ7•¹Ac€Xà~t$›N] tÍ PŸx“‘Ô ¶-[éæÞ棒K¨0Dq&ï”gsØ*¸\vÁ§[Ü^X•º¶‘¡' 2±úŽ*mFK9má)lÂfÏšá¾R8޽rsÎzqΖ\—Øn핤Æ}iYöœc¶ht  9ê8Å!*~ö*dšbv’zvæ”zRÒ/û¸©´Œás“Ó§½-ÔPš·KMl©G^´§ ’ŒsÚ–Š(¢Š(¢Š(®ão­gyÍ:“, WŠ/`Š( æ*Ä} ! ÛÒ–šW¯J:€¨pµ5²´¸b¨îXÔ‚€?AN?Z¥&€¶û|ÆE`áX…uÎÜf…ç9¨òpJ˜$b·ƒº3:í#F‡O†TL’Ê ÈÝÁ,3ÏÓ#éI}áÈ."‘LA.çw)׿aZÁ 0Œ.KtÅUÔgrÕv(RC9õÿ?ʾѤ©rÛCÈU*9ó_S¾µ{+£ ªT ©l*ù覺 vÞ;’nBªùc êßçšÁ”ªHqø×Íb){)¾Ç³J¢©' 0sïJFF)2É¢8Ú\ŠM”>iK@ˆÃ˜Æþ½hÙ>¬Ø:jÚ¤±ÜÚÄÅJ|…FI^9ÎOcÔŠª })¦(Љ=EtE8Ëȇ+DZ!Ð/âÙ-Ü$r&øØ÷\èiš¥¤6s †ê7ß'cgiÇCÇZïü=«®­àÔð}µæl×/ºkË«,c§ X`õëÏ/ld´šE–e‘TüŽ™*ÿCŽ•Ñ‹Ã•8¸jž·íäe‡«:“|ÚXŽŠj o1I#‘éI»kÎ:¤Ï$zRÓCnçÔí²ªîuàŒ¥"¸c€ hiiyÙn]#H˜»93çýñõ5^þÞ•šÜ¹àÚµt×"’bæ÷¹H(£9ä ;í$ôµÂŠEmÝ©h¢Š(¢Š(¢Š(¢Š(‚3øzÒîoùæ:3ÈëN>ÔîÀh|ŸOLÔ±ÌPóQ²†¤g*y_§4Ôš \õû¿ÀÅ’BçÐV=æ•sy Î3µØÁœq,äòóü…%߇î&St!`ƒòWÞÔÂÆkD|¤q.2±æúͼ›Ò,ªç‘Š«o %Û‡’!³¹ ϾµèriÖŽâ¶AÏÌé—:\s¶à¿?ØÒ¸%–óIÈìŽ5Æ)c¨xJê×InUXdsúTI¥H§hò¯T ɬH±%¨T\s·=ÿC?Ã;ŽfXÀS»»ç ®yd²nðZÇ4V´·<äi’¢ Ÿ æ«]Ä"á$rØ==«Ð5_êV«åÚÙ9Èà‘úVx#^¿yE)eáÂ!#„ÿŸÒ¹kåõ ¬£©½e9êärŽI¹‡\ð*5žiã[).ˆÌÉ˹=ñZzχ5M í»¶eÇV«.á†ýÏ)bNIcÖ¼š´çNN-Yž9ÆjëSgYðSéz<ÌZíØ˜b·”–EõaŽ?Ää ŸÊ¥µ¼»±pöÒ‘Îpyð5>·«>¹©6§.ŸmlΪ;8v! rÛz}¸¨¨éKX+yoó¸àª-$îU¤##´VCÀJs»0À_ÖŠip§wkaÜ\dã”…9&”I`Ž¢–‚Š( š _½ÞHª¥-QF€QEQE× N@>ø¥g pih¹,í±øíÅÀ#'PÎ^´âê(í(t»8Û÷Ñ(=‘@ãµ=ô{9$ýäJsêµÈ¿"·LËvʸêàªíñ_Lƒk½ÎTômÀgó5û ÄÐŽ›™¬6#¡ÖK¡ø~y^Úmäš0G´ddÓßj¡uáÝ|ËPޤFsÚ·Æ .ÂT¸xPNFÃrývú`‘žÝ~•Ìø—ãe•ákk+…ER7NÃ=È•Ë[ƒ§~v®tÑÁc'k'cªÕÒÚCä…Ú£‚çÜV}íóKV`ÀÀ0à{ךøƒâ=»»½ž¿4Ì8@$8éè?úõÌÉâ«û¹]îµ{µô 19ö9nx˜Œò…9rÅ_æ{4rš³äÏEñwÄ{m6Î71þàÏÿª¹ˆþ(é‰!•̪s÷Sóçšâµ-Bk© ]Žy.r:¬UOQ_=ˆÎ±3©xìzôrº‚æÜÙñW/üDZ´&ýÀ(ïϽb '–¥(U^ƒµäV­R¼ù¦îÏF…8òÅYQY”¡žé-Ã…ÞÛrzjçˆ4ˆ´KÖ³ƒV·ºÛÃ4 ‘œž> Õ"ü:QÜU§K[^à¯ÌŤ  ZO*B»–,ÔÔÙ€@I'?…#PCƒùSÊJ!ûG”ÞX`¥ñÀ=qŸÂ‹;€”QE 21H«·½”Œf…]½ó@@NhTÛß4´PEPEP]sÎ{SPÏzqœš’‘>è .&À ÷úÓFõ±cRRVê3@îÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ü7n/#݉=)»òrH¨È#Ô‘36wø×Ú©§±áX‘¦ 77_JdŽQ~Q“Ly¶4 œôAùÔ9$_(ÀdïÅ&Ñê3J_€¤V'¨ýk9;• ÖØ`ÉúP°(!³ÈïMo™{gÓ‘DÞƒŸj’Ó¹nÜ9ǦFhÞªðÐTéÉÏ¥tùÎö, —݌ӚRŸÅœúÓòG\ççû¦¶M˜ ¹»~±ËÆzýjb➤ò :ÓÔmX“{Ÿ¼çò§DˆÅ0ŒÔ–šnâ%†LýjT©É5 O½= (2{VÑl–‹# €§ö§Ç#F3PFC`z z°tZ­HjåštMµ¾µ3m§ùÕˆ•³Œwõ®ˆûÎÆR.ZŒÏCS³º± ޏÓ`T`vÂç’}(®‹{¶9¥«ƒÅF³!bÛ¿ Sf<“ÇãP@8õ¬îZ…ÕËBt=hIŒªÕ`Á†rÎ)c¹ùXÒºfK$[Cã'Ò Îhýj‘ݽzô,ÎÊ °éT¤âS‰ÐøÄú_„ƒ4ëx™ÈE\Zѵ¶Ø:àý+¢•>m̧+lQŽÝ£`dCƒÐ¯¯¥Xþϙ̸õùzUÓ JÁ÷†¦µ…@QŒñÀ¥uÂÞ¦ªÊÖ¶!ß 9<œõªÄ6ðÈž`bèгx°¦>Q¸9ªs^I‚¼ã¹'µj•:{™)9"ÃIºfI#R:øþu^K‡lº)9àÔk"KåG¯Ô]F\!àö&¦U4P¾ä×Äü­Ö óPsŽ=qÒ¡¸‘ƒd»c¶MEËsò’qÎO5ƒž¥ò>…§‚ CéMš_(‘ÉÇ$T&r'½+¸8È#èhçE¨Øœ\/~>¼R,¯Ô·ÐUå'ºzT îª[uLªY‚¦\’ñÇÿJžÛR$m/Û©5šI=M )S•4£ZÌnšhæ&!˜)•%+˜¶i+Á=HìD¡˜‚}h§Ä˜ä·æ(W¹@à –Ü*°qŒŽy¨BÖ”¼pv!­ Cd—éQn9ÎiÑ‚ÃqZCöR ×S1Ð0dçêsS1 8ëP$„þ4PM»æ8¦* ¥}‚M±òFölþ­ $nÕRàÊŒ ) ÷jÔã ž‚”Øš²ä§½H‘†äö¦¹†ÚÒµŠ9cÆ€ŸE®ŠpR‘“ŠÕ %¸8öè*ôXÚF{TEµ¹Œ€5n<ž@èk¾èrÊOqñc±¬A¶ßlÁ@ ä3þ{Tqżí$­>B¡Bªà]1n1ÔæzèEu9l–9íYÏ1‰éÚ­Ý8PH5Ÿ9É99®J’w:)¢)¥B¬_N橤ë0ä/z]@—´OÌdãÒ«2º[•Ž4ùNw6xÅqÔ“æ:ãbó;¸·QH¨ûJ+qõªp\Ì=s“Þ¦IÌ‹÷‚ã¢ÒDÕ–•²÷ÜMi *& víÉý*g·–&e`¤€Êx?JÑ>m‰³[-ëŸÀSd•zæ™?8çò¥Àc&ÙihÌÝ0=úÒž{úÒÔ^kƒ‚EKvޱH¹ù:ýi­e¿?•iµ½£H\&ãØ³ñý*E²f °F0<´ë\ÿW¾ÆÞÙ³+ìL¤3ŸQR Wd/æ+BKA”9¥Š&ÉqKØÛq:¯¡F; $$$C““R®—!à vëŸåVãˆy›#ùvðÜÔëËéÏJÕR‚%Ô—BÓ#ÆCyÚøSÖÒ9jz+KDÎM‘ XÁà‘ì+Z¡9 ÿ*³$ ÌŸx8¢O-¾V"¶äDÝ”Úþ?M’8?ÈÕLj®6äþžI=Á¥ì“Ø|Ȥ lüá±RÅ#71éV Rª?#SAS ¥(Òm‹ ‡OØB¿ÞÆN*õ¬E 9¦ÇFÉê@Ë«Q/CŽž‚»!N)èsÎwDÖñ)L©#­@¯ßˆmàw <`Ôþ5`°H¾U=2yÇ•ÛOc™Ý•§QˆŒîr*´—Ì ·—“ß4²³äœqÐ.îW—{±òÄðëXÎMšÆ6Õ‰qp%\©ÇÅSšUò¦*K‰¤ò„RùXœãžÕFêLÆÇxïß•ÇRvz›Ó™ZîíD-€s¸ªŠ­²Ê[* Ò\ä2`v®qé“Qm€ß™¯6s|Çlb’%óÎCÄÃ%G=x©íd.ÇëÐõªÛ$N‹¥Z³„“’Hê*£ñœR,Ų䎣Ÿz¶ÓM-¿“$Ä(8Î*´!‚àãð«6ãpf»!¡Ï$˜É,ĉ…“ž¢¢– cèÊ}­+i|ˆfÛ5ÄfYF⃂Îx='ÔžÕZè–L‚0@ÇÅT š!IìP·Ü7 8;½i²mRBŒc×½K"lmÊycP•ËD<õÍs›­ÈšhׂÀÕ‹W ísÚ¨´! †çš³6ì+ƒ×Ö²ŒÆÒKBËÑãúT2˱°qŽÕ3GZ`û>á$°‡±'ü lõd\tm# ÉëÅJHšfô‘¿u '8UéùÓÈ$p¹ªˆ˜„J°ÁŠå¿‡Zx·&?7€»±ŸsRÇÆw)ɦ©¶Èd^n 犔ý¹ÏLŠ–)G H>ÔãµÈ$u=ûWJ‚HÆRd)î˯Ú¦Ƨ dPΡŠçÞ¦·"^pþy§ÜžnäbÞ"2ùàÔ‰n‘T‘ÂÆ9#°*O$ºàòsŒ:Õ@ž{„0Ç$_0;³É#OJœ/Oz–Œl±úàÔŸgó¤#¹à`÷­½Ñƒ¸[¨8f=øÅ-ËÀnØ5¨‚ì¦Aˆ )äûÓ~Ô®ÌûǪÛI -JÓHrxÏ<`UwfS¾'ätÅM, ôo§½WÇ­rÉêtE]åTƙϭg]«yd`c qš­<[ˆœdf¹*&ѽ=,eÝ8’_Ý¡ÀP=Í2rd\ƒëVe·0ŸÉÀæ•71c+|Ù•ãÇËft¹«Y\„:q‘RÃ(Çð§@¯4a¤D]ˆBí“RÇNÕ ôÎm6dÚB €ÙãÓ½Mo[¤,Íž¢ºbÛFMدr¡ïtTÈœžžÆ¬\³I©Ü•#“Šç¨õ5Šº!3Üdb˜Òîl±Àíš›ç'ÛÉHb©žXíÔšÆLÚÉìC$¡[îž•›•·‚y5)TmÓI–¸¥mLÙ2ƒ"åG_z•—4b1ÍGî×s bŸ lýìŠÙY½L¦Û,C¤9àóVEhV5#©$ƒÎj¬Rcäǰ4®ä`+g宄҉ˆ® N=ð T‘Ž7úՉܨ85VáÝ,sÇ5ÍQÜÞ»’[< T.OõŒI©&Ü$~UV]Êyƒ\³“½¢“ÔfÅ#¦r=$¸S•\ýM:šçÂOÒ¹ämÄJÈI$㹘ýàp1Þ¥“å9#šˆ1eÁ^ž¢³w¾¥ ŠDÜQ8$òOJˆÜ;rìA쾕,21åÓŠŠEù€ ç$Ô¶Æ­qTy€—p¼w4»Õ“sü&¡#ƒæ¶áéRí„$‘*I–éö,4D(B¡‰$N;T!7è>•Î7¹¯9Q`ÆÜT±"±Ü{S†bÄœPŽ7`- jÑeA!iäàëIá~¦••w Ö ¹›I°Uó:ǽI¤.:ôæ‘•ÞeýkBSb¢•P¦lçp"%›‚øúŠ•3œŽ*”u»!´‡Ä»I ƒÀâ¤1ôÛŽ¼SU[xÚ3Í>5ÄyÏ9­c«™I¦ô3ò;S$‘$íS!Ú¸Uì3ÍU–_˜÷$ö«m(„mr9$ãîþµ ®I•$Ž*zúUvbx$~uÌÝÍÕ’#”pO½Aqü8«3}Ú®ñ³dgó¬%½Íað‘QG|QY¸Ü«Ø†QɈçåaøš²FiÍè?Ë’û—tSxˆá¸ühu;pnÕ3DìÇj÷ñG’ø*#À=FjyÆAöPNÙ¨ u¦Åçex¨YTÈ>îAϧùÏçLH ‚Êy'­'šØ–-´¢á+)Iãýh–#B­¹±“ÓëNt›‚14,2ŽÃó«³JÂO[Ü…”ƒ‚´ñó|ÃÔ1©dŽ@A¡¤1Õ?íT5`4oõUì·Öw‚9¦IÔP±~n`ŽÙ=*H/Úò@ÀÀàzÕH$µfXó îOzHËpC+Ð×DjJ/Wtfá-¦Þ“Ún–·yŒ^´íUmf“ɶˆ®Ñ‡É·¶;VmµÜ[‰ÜaHR‡¿n½O [ºÇ\ g%ps„/$ôÁÏîŸÇ¦5'-Œ6¥r)ð[Œà ãñ©¢œÚG,Ì™6±Û’9àö§Dè#òÇ+¸œ\c5<±¹JM!¢ ÇsvéOŽ,à/z±mq¦D±¤¶-# wH|À ¯ àãëúU™nm%û>œˆÀ|îÓÉã ÀÇ^µ½:q{ÈÉÔšèU[R£‚}è0`psV•–Eªu¤e ŒUÊ6ØŽr¨…þûLSãq·ñ§–ÞËdš‘íÞØ“ á¶…n¿—¥‹z‰ÊèH!Üìƒ×¥L-² Sž9,xüjÍ„d¨Èà‘õ¦ßéöòNÅþDáà zŸòEt*mBèÍI9jS¼Â¹K!Ñ0HÔóëÎzÕIMÜó%u%z,p¢óîT þ5`Û2üÉ#rN2zŠ[[,îvù?)æ°”\äi’¹Q´}’5Ô"B½4…‡àOΫ˳rsøWA:²Û%» P‰8çΙەÏÒ[¦3ÇãG#?­6= ÚgS&£ä©` ’!Ø¿R3Ê«ØÎαµÙð3cô¥H\q´íZvZX»s“4D: 79tôÍCyœ(D~c‰ •XHõÉê3Ò¥Òi]–§ìUK]î#ž™Rri’Ã"d]¹ìOùÍJÞBœùÇycµqéÞœöó]Á+>G …³þšd;­Êå7©\Õxìe@]›rç’OJØÿ„c\…#¸¼³6ÑIŒMpv'næ¯CákGI‘|IfËa÷íx÷@r{úU,4§ÒĺÐ]NYN©cÒœ²|™“ð¦SCÁna\i÷:¹i%la†OÖ¤ŠBìŸj¨&WÂ0Ü{b§ŽCŽ™úUÆV%«–VEg3ŸZzÊQˆQaU–\@ëèjG“yP‰ÎñÔÖêFv]QpK»qô4ñ1ã?V€4²*gi'øŽ8©e¶’ ì\ÖêHÍ«–â¹ùHoO—Žõj&3 `ù=Åf+|¬sŽ{T¡å…J£3“šÒ3qfN1kBÆ÷I›iÆ8éSÏ©Ép IâN|Ârj[‰‹8ÜÛSs­9'íMNZØ=šE´Ôç·e6ìp©æÝÉàt“W¡Ö-®â_Fàmdg§$òrkÐ.6­Yµ,›]@ãÔf¶§RjV¹œ©Á"õū˲XÞ(à@G™ž®2=O=:ò*{(L£tƒsß§Lý*œ^RbàĤ¢ðzøÕý.ãÏ´ó&ˆ #ÌhÆ_κ`¢æc+Æ:ɼ§rýÐ3ÆëþNþÑÑD®Š¤œíÅ\–ኘíÎ<ç­5u ¢° VF€zãpç·¯cžô¥Ë@‹’ÔʹˆæëÉõ¥“N¸ŠÌÞÍ ,Jv´…xÒ¯ê2ÝÜ#I'Æ ¡Ž (ËdíûÝO''O5ËMi¼³–`NزH ‘“îO€®gN7f±“Ð¥‡Ã­¼³ßŸhF‘w18A› “ôã'µ$úu¼´k|’€ÄXƒ‚FyñÐàò*ä‚]DÃÊ ¤ ¸ÏOnŸ­C,1$α̈́RB´¸Ïüâ‡N 膤ìQž áLe‰Úyf'Œçò­8|˜n4Õ  ¶ lóýGQ¨9.vãäYõ9æOµ9.¤ùjJç #Åór’±ˆ5‡Ôä†5²´EÒ[qÁb8'võúÕ+»›Ë˜ÜÞÊ#ߟ!ØÁàH÷©åòKoXÈ9îOЩýjŽF\,Y äãÓ 3úÖ5”›n÷5…”U•ˆQ£ï~Xr©Î}sŸÖ®Í­^ÊfHŸj\Û ÀøÉü:«äÆê¶Ò]FN1ßÚ”Á–Û¾®;æ¢ÎÚ{î-Ã&"b9Û»þU,WZ“@U5I-•àÂã• ×ðÏz„ã˜Ù‡ †ÁãüñH¥HfÎpy ô?Z:‚G¸Ffûd× †šbÃ>½y¨ãV´ínUK¦¤J=??Æ­ì«9<‘J¶“ƒÄMõô¨ä»Òå©XçÈÈÅ.è)›˜>IëÐS€“éž;Wœt €²QŒ¢¥ˆ¨R7 zÔjቕ$(ò|ÑŒíëN7l `;ó‘Ó)ȹP§±4‰k>å%IÏLSøI<ƒƒŒóÍkiE\NÏañK ËgÔÔÛ˜€=Cù¶úÔëñÒµ[·bH‰o™ŽOÒžd a¹Í" A€ikXÈÊöŽÌ0²1‚õ¥Wód—=ýª'PØÈ©`ä0\Öš «’I΃ëV0zô¨;ºŠ³’€•­á¤Œªt&UYP«õjå@Ñïã uª° ç>õn%ù@#“ОÿJ錄òÐáKý*&;„“hîTã5vk<Ä¥n#?…T‘\0#=*¥©*×ЂCÃ É 0ÀžÔÉ ï,3ÓÓµ:qÇz„£ŽIϵa+#E ×”`´¼* F1&YU‡,?ãRL‡'ŒƒPJ8É瑚ÂRfÐVW$Žö$eÄìŸÅƒ‚>•·žd&¥Wpl:ç§$ãÏéQ‡´„;)T¹I«’BÅæI W—žK”Ù–g!p2WšRd’0,¸ê6V)+=Fcn¥7ÎôlÑ,ùÀ0mž€àÔj±–`èÁs«TJ]‹I’2Fí»=ªHŽã°> ±w¨Tí‚È>´á¹†¡ô4ÓD´ËpÉp­¸9°~•`ß̃>Zàõ⫇ ·P9§µ#Èï uˆœOaZÆrŠÐͤާ(“å³Sõ$lXm# üê´-’=³üªxŸ¾Õ¬e}Œæ“EËyûëP]´g ÀçÒ¨E.y<ëWôø|éôêMuÓw9¥¡a¯äyÓ÷…T’t|*€=O½MI{uç|¥ ŽéÅTU‰r9Éì(E-Eª©1Ü$ŠÃ†SÓÛØÔnF3žÜZI¾Íæ‘jÌP’Ä `UvÝæŽà×<§ÐÐl„:ãÞ¡ 1UàjW·NÕ'§zkÄ6ƒ¸dãµd㮦«dVlc‘KJWù‡j4Içp¬Ë°6ãü’žêwÌxëP̯àjdR×r7?àhP0I¢ÆO1Ó’1È¢TÝœvÍgË}n†‘‰ AãåPpI©¶y0æBw“È…*©Â3׎µ'Þ÷¤íû¼ôÏÿª´Q±œ®ÇDñy~^Òw öÇ­ cXŒD“ÎBäã>¾ôŠBŒnÏáMw Ù°pqÅSv&Ìãm‹1¸­ÝOÓeŠI/u(àòÓ*¬\ÿt`u¬•cmîÃUŸ¶¦8—âЩní\ôêÁÍhìuVº·‡ ²k84 dfÇÚf98öô¨êÊBá¦EUõÎý¬{õ§-ÞŒŸÆº~ºÞèçX[u:MNâÊþÖ@"Çl»Ä’“¹»mÃ#Û>õBÒÆ+ëÓmk>™qœ ôíŸÎ³$—Œ4د%¶“Í·gàÿ…L±”¯$R¡(ÇFojú6Ÿ§ÅEx$•¢ áTã%ˆÀü <²Û7äõzG¥ÝAwqöJé•W™ ž½o§juÄÉ4Í$c OÉžÃùf®U!/z*Ĩ8û­Üs ˆo zTºA†âé"¸»H•¤ ÎÙƒŸ˜àgUY2S¹¨pQ·)튕.Ys®¹Óeð´‚o4’A(§p>¸«Ig´’[[ƒ4•U"ÎâØÀÎ1ßô¬” Îzõ⦷‘ÉJËŽxlVð¯}53tïÔз–åO18¶ä)ëŒâ¦µ»•ßk.9îk29n-ÔCorê™åÎéô$~5fÁñäõÏ&®IIØ™E-„V ¡X|î:UÈ/ïlˆXDNr0sY¶¤Ëp±î<ž™5yÚŒ¤°ä䞸ãŽÝÿ:ô)ÉîqÎ)2RÏ;îàäòÏô¢c埚\Šu”n[z3Ürj{ÈÜ+í9ä n£xÜÎö•Š:<»Ý08üi†H÷¤Štàî.Ú¥q‘÷[õÏ6Ñ´ ™hÉž¤dúÓ¢æk1¥hÈo4ðzuçˆ#’ßh]²ó‚ƒŠÅÖ…®Ù^ÎMû¥¹-dƒÔç¥@Î#(/>†¨nõ•æä„ UFH«º~§m0¥±yX|¯8~\RU!7£-ÓœP’+Êsd“Ç©¨%™dö«Šñ«‘Ï6dÒ,æ-ÌF3šböbNÝ-"û@$Ãg¡Å#ÀRb›²qÞ¬}–\y«­J¶\©(ÀɪP”•’šNåhÒrìHÜqŠtÖÉ ýÌüƒÂ‘ןóúк:#svêAáB?,ö¤(!HùO­iY¡ó'- ¬Œ8Ç8îzTs²2ü¹<ý=)ÒG&HV,IÉ$Õ{€êHÁ>€ÂRqf‘Mœ„·1×÷O#=)ÊÃc=ê PJU™âà¸Ç¥|ʪï©ír$´.E$€eªHÙO™É9ïUb¹Í­;Ì2ü«?ktK]Ë-#d–”@)²NÊp«6#ò¨Ï¦3OX،ɒOb:S測‹6óy¹N*ò\CÁ×Áb³­CÂwª¡õ,õ¥;™y8 Ú·…G±“‚“4Ô#¤ªr85ÛZ•§ "ç=ú²®<³–þéïVª¹­QÍEî]i¬ÉQh’(¨o1%±Ïnz{S”x=ñUa ¶O¥Z< ŸZÖìÊI&L1Vm÷éÞ«ÂÁ¹õ«–±²ð{×]5©ŒÚH¿eÄyÈØÏɯOQWÕ±ž¾J«l@00HëV‚o#j^4–‡ ÞºšVå5Î (nOcN¼`ò6Ó¢ ·%,ă€AïþA§\€ªXqž¼õ5ÛuÊagÌQ˜ož¤Õ9W®EY¹㡪²1$}k‚¥™×Nè£tÍœ©°M^¹@y>µQ€S…Å8¶ÎŠnÉm,HfÈô4¢V€‚¤¡§H‰ËÁ]Ë’A?JÁ·æmº..¢XrÙÇ¡«6ÚŽ9p1ëX¦@ŸŸJO¶,N õªX‰GVK¥}‰µiJy+! {Ö§·¾›p‘Óô¬k]·2‚9­s±FåÅvS©)Ù˜JZ3R8b»o6âB]‡ {Ú[€Tø’HªMµ²=5jÞQ!ËÁ®¨Ê2ÝÎ2¡BX”®ÞAäúTs[FWnÓ“Ü Ø¹Ž)vÐ8ç¨ËnÀäƒYÔ¤i¦y^ŸÊ”€zŠ(¯‹>ˆ@@m¸ëÍ>93Í4œ ÓT±T]˜Zè·æçñ©…Aõªðäädwµ0!HÏsÚ·‹3ÔµeAãéRPúÕhCg¯éжŠGÜRG¨®ˆ;£)h0Áèi¾K¤þU:«ˆ×")få:Ó•²‘L=Ô3!Kb韛o_´‘Kœ”ÆGAO† H;ö©Ö £5½:LÆsO ëxðªž+BÕ°bÍTX‚‘·9&®Ú*§*sÒ»¨£š¦¨¿y7J±ŽFIæ¡·œºp:sV!ËΡ@ã9í^„•Î)y—v:Y*°Çv=~¸ÀýjµôÂM«œsž ]u·!ŠÈ[ ’Åp ôFëh$g¾k¢{'vSBž3ÍU”¬ [• |½ @ñʸÎ:õ®­N¸µdŠrÅ¿ gÞªÏS¹‡OJÒ’5rRºÝ ÷íXM$k kbœ€$šŠR¸Á«S&Ð0¹ÏZ¥32±]¤cõ®:‹©¼[µˆ‚+ U™wK¿mÁ5ÌŒ£ä™ªÎÒ pT‘ž+šmlo÷5tË—·M¡¾kE/XŒõü+$hÏJ±öÖÛóm×U:Î1±Œà›5íçV=OZ½ùlާšç`¿“Ç5dëàqÈNyc€ë]0¯«f¥-ŽŠé±›vï³éÞ£wI”„^=bj\:9ÏL¹àÔ–wÒF5Ó‡Ã+c?ç×­t}b2f*ƒJ×8 )ˆÁI…8œôéë_}«ó*IÜF«È9ϵG±ÀØF9éSR¸#éZÅ-DÆÄ Á¸6ùJ•<>3Ú…@I Ï=éè‡y8­yImìI'$ð 5r¸lþ«@„ô«––à®æ'Úºi£ µmIí¡\凕rÖ /+}Ðmà*¨àT‹æ¶~@é‘]qOTr»²UHƒ–@BîÀÏQRK +pzRF„ÀŽÄS”Ë0¸ öЭc7¡$d°^9Í[´ÜNâ0*( ‚„çÞ¯EÁ·iæº)@Êrº%•9š¿nƒ­Uœãò~A9+œôÝM#Žd’*¬GÍ“Ô ñüª…ÔÁ$ü »q#6C.УU £WHÇî¶F*ª6(+•<ñõ¨d]͸ð½À<š}Ür2[q [žæ£;Œ`K×Î+žNæ‘ •·qôª7aÇÌ;œc¢ÐÆÌr:{ÕY—$8®y£¢%4\©g çÚ¡–”åºãŒU— ÝØö5$ÏÍ%stìf qV7gü*° a@ö©bqœ½©ÆJA(’éRDÌÝOJb*¹Ã l†ÆçZ)5©™ÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?üÑñŽ–ð›+¹*`;y¤sž+œ9'¸®cT±ðû.©å²Àü¸?—Sùw®y1ˆ™ÀbpìO'©ý)Eù$c ô¯ÚÞ:3Nñ?9†pµ¤t·Ö\q…‚`û‡ðŽ”ë]Òö#Š£ v°ãÜúW?­wl0ʬIêÄš·gâSºU`6äùýzÎ5i½Y£§U-£GðÆ›c7Ú,8 “ùœV½õÒiz|Œ’ãb08QÅqßð–Ä–e †CrØV|,kßhÉëɪZ¿‰]´©"yŸ˜Žæf8~gù×OÖ¨Óƒå9ÞµI§#èÙCá]ÇŠT æÈ«áo‡~-ðGˆµ¯2*ZiM¨ óÐy0ÀÃý`Îâås€²3áAô>)Ðt/ÜE¯xóÄcQµÕÒØkðüð‡DA+Äåw2¿Ë€ênŹ`¬ê6VºLzO†mŸJŽUF‘„c̽\7Îä»Ú6 !(©ùK(­à“^iN\þŸ¡‡ªÏw£]]i3Ûº\ØÌðÍnîÌ£ã¦pAp}±šÓÐ4ÝGÄ:¡&‘ák›¤Ñl~Ó}=¤­½¾\È àFŒ¹È^à}ÒJâÛèבDú‰†O!¦0ÅryEÚJäõà¯\u«šBA§Içɬùi2…»Sf\¨.Ae†üS’Püì¼°§Ë]ž|\S7ã½øM-Ê\;Ä–RÃd°O4ŒOu£[…Pµ¹vP‚I0Ȩ<]¨øÅq]Þx_Äþ þÔŠ—W¼ñ ‘²ßLÏÃ+© 6Cl‘óœíc´æÆðÃÇ´Ýw]ð¤òÝi^ÓßR¾ye„ÉŹXÕ¶ ;˜€`ݘp•ÍËw ï‡í-íWjiˆEå Ï#Hñ‡ì p?„š¹JÊæò”4ihGhö ½D çB±-Jî;ÊŒ®ÐÃn8<޽œZÀ ‹? Ùë¾.×,öÂæê¶–±Ý}3bÒÛå– d‰˜Ÿ˜R€?Ÿ BãΊ0› ¾xRQ×Ç'<ôÈ#‚x©åv¬ð$†FìÑ ýãr;÷ëéY¦­¶§<¯ÇjšRézœÚL·^q³¸‘u >bAùI08,2Šõß|$ð—†þiÿÕ$¬¸,×HH&Ü¢¯Íß$âëÊþÕnô;‹ý?RÊ :–›p&·•º“¡`ã®O œ`žµ§â­JÑu‹m/S³¸†R’Zß2‡„å2…0 7g¿*05.—‚ÅðÞøŽÏW‡EkÆkË}>hÍËÀ\áÙB‡ …ÞWÛü5R‹½ÈMGI" øSľ8Ö†—འçPº1É3Ãg ;”|ÎB‚vŒ°õ«žñg‚!×ç‡â“qw=ͽ•–äÀ^ébd¶’FŒ!ÂÉ f's¶Ý¤s‘“c«é~ñ·Ö¶º¶qzεûý¢ØVnÝJ† Ob-üIÒüwâV¼ð–¦·±.õKØ´QbgMÄ#:|ÙÜ$ ï6±Êäµ&–€ùT[E "ÊU¸†ïRŽ9åx&’Þ+É fâ?›-òí#$v%pyÆ ¼¹rMª¯ÏÑsœŽÞ¹Í:ÚÖöêO%#–5¦wî@,OÞùAv@éVìô+­;Qo=mÌ06á‘„Ž€ãåÛÔYÎPZu)EÕ·*г¦\Ï£øqo¬u©n$‚ê+ëÝ6êݤ°•P)¥)&NŠW ¸üۆƋ`º½Þ­ãM{@Ž+vifC}šÏÏÅ'”ƒ8»0‰>b H:£ðo‰µË-7\Ó³fK¼ñÚÈ»ž8C§f ÈîTöÉΫšÅŸƒP¸O Ý> ©•øÇ …BH%Ul Œp¤•P~ZæÑY\ßÙFpJ飌ñgˆõoE§ÚÚh–z}µ¬—é6<ÈJGç+©ð2ª27¸¹Ü;Ï|[ð†4kˆÚCßÑۣé³Éo¨Y['Î<“,f €ªGµˆ‘ÀÚîÃÆÞÝØø…æ_ÈtÉ!Ò_ËÓžÔK%Üêä„F$|Kxç}3Å>ðîŸa¥|BÒrÛVH¹aǘæ, Æ´'5ÐÙTöt×+ùúš}΃ªüOÓ¬~µÍ–•¬Þ"§ü$ˆR%™£w2¯HAê[?q‰Yý©~ øÇSÕô?ßêZlšl*5 5Ú¶œ9tŒFñÄ›òÈøbqˆX©*Êk†ûŸqyqý–%û1BȨHç 0Ü<Àz` t“x{ú~›¦§†oîÚÙthU“P*’Kyµ·XÙ÷.IØìA(¥ÈRÌ+AA©Å$ÓM?NÄÃ:p—¼Ûzy|ûœõçà F’×ðë_f’›-®#Ü“ Å\¸eÛòºÿ{¡yÀŸAÖíŠÌlX + «ož<¶ppNîšõ BÆ?øG— n®Ð#­î¥$fsûÆ,ÄyaJœœ’v riø‡Kºð¶›½†µ£oLœ® úü¿Œø‹iN~Ò¥­þ{þ'ËcVšœ¡o5þ[ ItYÊ,ÀàžMÝHœ–õ5˜× (>aÓ½ rÝß qƒ_qíŸCÞöfÏÚFYŸó4°Îf+sïY?h$îi¤Ó[T•˜ÅÉP˜|ÇœþnºLJ•Ѽu;HÕ™‹œà¤C'óéúÖ^·}«Ko¦y‹\N± Óqî{ýj/>ÖÛæ2åp(Lž@ü>žýª…ÝÆßihR‘›¸Ü®2Û3}øïQ_ù9[ê—â‹£A)^ÇÜþ\ë^ ²ñ­ô“Ûh6ΑBñº}¦ñÕNVH,Npáˆ+_J|Uñ¿Ã/Ãá'Oð7‹í´?‡Þ±Ðt«c $x$ ˆ^{ÉÎò‘àÇ s"²=?ö#Ð<5ûEþÄšŠî%ÓaÕ~hÃC’ÃN´é§’òE3&wC,ŽòHò|Þo•#¨ ¬£Íµ¿h'ÂR?†&ž¨µ¨aÕ ŠV€[,r ƒIcœ…Q`;2ùÍ|Gf¸Ì~gRuËìß*VÙ-ú÷' „¥†ÂûZnüÊï×Áž ñOÄ>Õ¤Vútf]?e¬—)}#-²™dS epÑ¡eÝ”gåŶÐõm^ÞÓÄ×z„VìBÉýŸj³K·8Cº&A €Ì¡¹Œ¬> ñ&³ª› /Á;Ó%º¬rìÌ`%05®ØÁ!A;c?0ÀÜ([Å­øBîïJ¿ÒR½¼–Þ]å¨wEoâMÜ«c0ç‘_9Ï4îÑâW›œÜ’õ-ê3ÚÁ³EŠÖko°™Rà\e^iDŽ ÒDKd1ˆÑ£R@1uÉ$³OOºsc,nnåž%³›8H†íÎÌ9Ü ®6ñ×9ùvµDqo"$Ï$Š>îÐFyãh8?¨éë=íðÛ4Bs4+Cm•+ î'å>ø=ÀÆxM¹hsE¾mOXý‘¿kköGñ¶­ã_ ø:ßP]ðËèZ®¡67ZM$&WG@¦) E·¿ßÝ»+“oö€øû!üWð„ß ¾ êþñ|?e¶·ð“ Í*M.¶†t›}ÂܯȤ2E–bìÍ^#oq&ß.F8Ï9?çÞ·,¼/m…áñ¦¯¨Ë÷VvAù|èb†MÎ PªDñáòNCáX®žó\§L+K—’_ärún•wo«¼>"Ó.6[È|Õ µKî*G `ƒ;»sõÅü±Ú]‹q*>û8™6f#v0 `ŽÝŒ äK8ÓÒ6M3PÔîH?-ÅüÁjÌdd)`2ÎÇ;»ô¬‹›)ˆ/™n…Îk BQ}Ìê´ªZ/Bêjhó’£rG’À2éI­u êÝé,¶ö€Êé)@ª['çäs?`„Ú Œ"´¤üÜñƒü$wçúzT²B ªñ8‚™Wv¾0q‚x8Ïn½*㪹Ÿ7.¦§Š|JúåÔúÄšŒˆ÷“,º”—÷+\JfV||Çs¹ç$on€šséúi°‰âÔÐ܇†GR®zäÎ8#¯^y¬©ôáwF·c‚ ²ðAÏ8úôúS3Ëgjla¶Wd!Ùäp61òãœãÞœ”¢ôaΛÔ[û].6{+¹^p"Ĩ§¾ånO$s׃ÇPjÆ–ÂâH¬Ì¬q³+ÉpÀþ-“ƽ¸ ž †ÊûSs$’¹X•U¦–V+ŽƒqÉÀžØðoøwEðåî³5—Š|Vú ý•Þ+Ùlæ‘DÛÅe‰K¨Îìî,Ê*w.2•ìƒÅZxwN·¾»¸h?´®"µáØ[’Â7’@q÷¶’¡G q ®“©iRk ©Lucp¨ö’YŒ2ä’ÆPÄî Wo|äÕŸév‰™aãÖ- ±`Ô-„Ñ¥À•V@T–S‘ɨë•÷6“¸[D»Fͳ¨Û„pVn#>€zͺpŒ­ÁMºNÿ4î4{Û‰R9­%)Š õÁã’§ðÆ9©›FiîÞâMZØ»$ŠL£sýÒ{Žr3ôô[QÖ®'¾– ¹ŒÒ·p¹I·‘÷Žåb ÎIäã&¤S@ï4í 1¯–Nþ¹Ý1œœõ>΢2»oCÀ>!Ò|â3âDÒmur¤Qê6ÝáÚh$ŽN ž¢¹q‹‹Kk0Rl$¦ÜmøYù?&23’~^ƒ µ­BM&;(n,|A Óº«<0G"˜u·(RG= ÿôý9nÙB@<–ëC…†ç>Ul‹úU¤––zŒÂ¿¼ö×f61«•-ó1¨ÜI'©¬é÷VzüºRÌÛ×dã¶ü¹ýÒÀ§9²ø/ûRé-u«©»…ì§µmˆ¡.Î:àªcq’HÛ¶™ O«K­jÑÝ”$¨ eãî6AŒŒfǬ¹[ésXÓNŸ1Çxu‹MCK´Óíî%ºŠE‹N°.ç*ã+¹U@ ÌB€I8‘Úø»Å^4ð-‡‚ôKK}*Ým¦x­­B¼ÒƲ#0c+7’KÙ¡‰d¶êÞ3éxZY²ðHXþïcõ¯»?b¿‰ŸF×¾üH¾Ô,dÖí^¿°Rë³€‹àn>TˆW!ÕrË»uV{ÃÔ3,µf¸Dý¢W’ÖÏ»·uå¹ãÑÆÔÃc^»\Ÿeöí÷˜?´¿ø7Ä#â÷êw¶:Ü& ™¥B9|Æ` ƒ¶X¤ƒ¹”˜ÙW‘W\Ô¿á"²Óü_â{+ØäŽ34k%Æõ¸ÜÊ®ªeË€›YŽG–¡KÏ·ü\øS¨X|9á׈Yµ F Ètûë˜V9Ñà}‘F‚oÞ"y‘¸ì0ÅHRO²xl|!w"éþv·goä¡Ô QÌÓ4­,®Îø2muÚÌ¡‚¯fÚó8MªÌ߇Tš¶Ïþæîdk»>@ȅɆS€Gc‚xÉÀúfeb|K­A§¤ð@ó•Q-ÔÛcC·æ%›¶î€ ôA©4ki5ÉdÓšÁ–êâoÝ~ïiGÎã•ÏÈH>œU.Ho^ÆDt•dˆË‡VˆükXÅ9ÝŸ<•˜»¡Ž+ˆØH€£î%‰<B2}y¥hÝø‰äðŸƒVÊû%ü÷M8ƒd“´‹~ñËàªþU ‘½ûà–^à ±Â–6…&1¨b­þ±‰<ûvéÇçAðÝÍÌÛ^Xã#s±Ž{zý}ªù›”PÇì71neË“nZ†T†ÕZXg,ÍáÀÚzާ'ò«·6rF f0<¿—pÎãÄV\êÒJbqÀéŒçŠMjöÏŒYˆ)Çûݪw\\ŒœÕk4‚ „¹+ÎæÀOʯ¼±˜cÚ,FO·ùæˆêe-—ÂhH¶rÊPlŒÛÛüi!ˆàÝÝ|‰ÎÀ˜C!ãÁìzãµ^Òt‘­j)§™‚I+X¸ûÇëÐuôÆ [ñg‡ã°¸Œ[ÛͰă¥vœghÏ^0xèI§g²EòK“šÆD³;&p$.Î8 þXÏz¨êå|øÃàóœeG¹ÇãÓÞ­ÞØM§È¶wpÈ’ä8ÇÔ~”À/'· "ßbªˆœäö«ò@™¥î¥/ÙtÛ æo”f‚wœž¦­'خ挂e…ðcšvPR¬3Î2 uÜzc5Õ|ñ~§ð¦ôüWÒ|§ê‚ÎàZÙË«@'†ÒàÌ’+˜Ø”2£Ç‰©Æ8¬tŠóUÔ^ñ˜›‹©‹2n³1ǦO©À¢Öàµ[.»c£Üx Ήy ¤÷1[‰ì­áo´[4qd7šì Ɇùù™Én Ë\é‘ZÛØ_Á®[ÞÃ{n\Á*Öl®Èau ` †0`x«Ðhºæ—©]xoÅzTú}ÈISìW°¼{#*ÀóÀöÎïjÌX˜KÀÆ#Ö®rè¦ì´±¡¤ZhsêÑl[H`p˜Ô±Ï·k47,#„S´m‚Y¶–?( ©90ä5ê:Mͧ‹ ¸Žx'3´ùßhÚŒ»2dܧƒ÷@ÊA’s>¤Î„dsÆùCíw@"<ŸÔuþ¦½áß…´‰­5XõD¹ŠâÒÍîFÏõ%@(tܤ±ÂàŒ0 T æÒN›©\j0I}¨\(†‰eq®$Ì>öò)f´<_«7…RïÁ^v¹³Ÿp’IHÛ‹è "ä¨.OÖ”¡*«’%aéF„Ô¥­ÌÝgVŸWÖSSk”ždhD±Ž#r(tÀ ǃëœr8mÊ€Œ©“âWŠô¯x´oÝÉäMZce|îM°à ÌY‹n]»¾@¡‰,4ë¸U²Üì£B2¤¤ö?#Ú~Uäg¥D`xÁ'ÓµM9Tùaœ ïQI>Ì4Œ c¿­~œÜVç~­ péëTæòÙÊ+عéô§\êUŒ!UqŒ°þUž×3>~\qÇ^+š­X£¢“Ô–âáCà¸@ëÿÖ¨~Ðì»Uð3ž;ýj³;nè?*š6-=»f¹ÛgB†„ÿ#''¨æ ´¹»Ñ5(õ;BCFàõÆ}©ð¸òèqVeµK•ò”äžõj-ê·D¹$ìϤ>|W»¾—ú^´Ö÷ÀI ÖÓ˜åŠA˜2C}9¯Ó/ x×áÏÇŸé¿tMk\»ƒKÓì´ßÙkmžK•H³(‘¤Æó]€}‡[a¯Å‡Þ,½ðºŽÄ‹goSÆ ~‹ÿÁ0|]âOüuð÷ÃOx~r߯²¦™ªi’Ê©¼dIU™Õ#xÈܲÜÃ^®oBŸäRriV¢›×·_¿§cÁ‡>S˜§zu¾löoŸ ¤ñ þ<Ó´xÄâЦ¦>ΩÖë*Ê›°¿t©'å$`ü§æùöA¨ëž3’ßM±¸ºMBÊ8¦]U„~[ƱF»s«0(ª¬2ªÉc_w|@Óu? ø‡XøU{a,:½ÒIi5ÄëË2ïhLqªÍ™È!0»€Úr>}øÇðv5¶µáö‡DÔôý<µÖ¡fŽp»S, $ÀRŠK´®üþEJs^ãèÏ_2ÁGRþg“éßéÎAÈ=y<{ç=©þ2ð‡‹>ÞÿaøŠÖt‰ Á³»Žx×x”’¥N8$¯ ¬ü7ªÜ¥ÁžÞx¢-åí©Ï$ 8'§ð§ ÅîÏÓäŸ,Õ¬_Ót­Jöa&gTˆ!fÇ àc ÷¿1[^ðpµÒ.5]B f”BÞo”ŸtŒà’; íÏ©ìx©¼fu!«-›4jÄCæ}ÖÛÙAäŒä’@°çšô]<Á«_Étš½³>^k{Q±$“†Ç,w+ó´>Pkʹ.wÑÃSqŒÎÂÚO‚¦Òóâûû»yf`н¶ÅÛŒa>u'qääqÔVÿ|cá¿x´”ðìqA2î].šS,™³•vŸn¾µKÅ0xwP-¦ê²ÇoöiÄ“˜#*A點3Þ¹Áâ94 „ŽÆå.­dŒ2+…o-ò \ã·õ5œ©Áèö.uÝ­ýt=Ç>+›Tð¬šæ‹‘¦Â‘‡ÌZÝÄ‘µHà äÝxìþÔlç·Õ&„ÚÉ*y–þaûØb¤U ­Ó<‚?‡žÃÃ_ô[t­¦E4DáÖÁö«¹7˜‚3Îp¤’6œÌjV®|NTžýtí.uÛÙ]J@]»·–RS*wœ“óUR‚ö–{Rª•/qÝ“Ûjž"=¤°¼·Q*Îe6ÑJ—–Uàn–Fè#=È­Í×Lñ%õ³êúTO hËÚ¢¡}„È“LÊÇ .J…Û³¸³Ã-CÁ^3·†Êò{´œ>™uhAk?¼3ìù8Ÿ~93R1‹Ü)¦Ò“ZxÏL°³±‘nî,îõT¸Óîí¡Å³Ÿ”| r3´¹9ÜrEymÁ[H¢Šæá˜¬¡®N|CÁÉãã·júâglüOw!‹_·¸Ó¤´G2Ãhet¬jûc-b_ç‡,zá«Ö¾é—z-Ý–‰£}®Â=I䆿î_,Í´’–0Yœ| FC`+óƧ,9¤tT§Ï+CSŸøaju=m´ëCÏhíu—sS\€‘ïv±esÉ yìFÖ«}.£á{{«­:ÎKùôĺ>J‚c…“" gí#¾xÁDZáÿ‡º>™¦îÑ­à‚U€®£%¼o›ˆeB¬¿»a•'róÇ;¾L“\Œ¦Ô¤ÕþÁgh’VÞ· ‘È^[¡ãŒÿ³€Vª«ZëD‚­/gE'¹Ÿàí&iÕ¦% ‘¬´@áÝ™x#1ù±‘ŽÃÚº ^×N³Ö¢-´¥n"!Õs"§ÊNpÝ9ÇâGZÞ»ðØÒô>ÒU¼6»X,Í€€üØ$7'¡ä8/øžM?Ä-m§ÄZVÄOº2¯¹ä‹ÀŒqòÖŠ¯µ¨ÎeHXí4í­3f¥áó"\©“joÈ ¼¸'fBä‘Ô)ÈäWcñÞóZÓôÛ}#EÓäƒN¿†ÊEÔ§µŽ¹˜E+˜€åd+·î•PÄg§’øSÆ7šºI32`¶tB%#ë´ãœá±Ï+]_ĽsPñ'‡|mc$1›[[k;‰Udg™–6c¸1ûÀºå@n6±#xAËVUã3º‹å¡+–r_…'É\“ëPͽÎã’i±¡,rOARdöR~•úK»=5dS¸Rä³ÇLÔ$*}ï®MàA5XÆz0ÏáXN.æÑÛF@#œR X†3ùÓ‚œ©qNùŸyMO*.ìJ´€1ÇX#{U­.ÊY.JÜökZq|É#*’V¹¥o¥Uü“ ÜŽ•é?³¿Ç¿ˆß²§ôÏøC[º°¸Ó¯#¸±¿‹i{yT‚>÷ÊGE`øwL¶¶ežéFÕ\€Çš‹Åº›!_)6~Vä^ý:W¥íS÷­×gäÏ"u}¼ý›W_Ö§ïÏÀßÚÃàü»á—ö ­¼%ã½,¤¾ ²ŽbUaK˜UŸìòJÌž^öe26àWk×âÿ ø;Gñíσ<,v1ÛJ×w·‘ÇqöG€‡X ´Q³€|ѶѻAK¿á/Ã?þøªßÄ ñn©`ðn0\éz„¶óùv¶ÉceeùIS‚2 ú_ûÿÁq¾é—Áû]|+—Æ÷–zdVº_ˆí-}Ä1MÃ…œ©,w‡V†ŒŸÏ³NxºžÓ¿ò7f½Í~;#ÙÃâ^6¯¬šßŸcëcáÏ‚´û&ÿ…{¥]é·2ÏpñëMŒ „Äw²>K 3§–JÈX€>cXw‡í¯õçÓ’Þ饎Ò8õq°¼L¬ë$ŠŠAŒÄ€íèÀ!0¿F|<öý¶,tØdïVòx’D:›è÷y×v{䙞7²˜EˆÄŽFô!P„?0*ÃñÏìåãÏ Íw£üBðâè÷v>'ŽÖ×VµµŸÌšÚDy¼Õ”"Û0wi×a. 8TÏÇâð8¼$Üj&šÝ=éQÄR«âÓ¹óÅ|ñoˆõÝTñŽŠ|E§éW$^A÷’<Á ’D «¤™e€ÙÉ;V¼3â_ìí⯆Z¾‰} Ø¢ØjÚgö¥“Ïx£dY Äå•›#£*îÜñ¶Üô¯Uý§?c¼[ñ0|uø#ãO¿Ä.ý¥Ôo ÔÚîÚòÖTYAàPËåì)#ªTÇ’äwtÏ‹¿ð£m¿¶´ý>y‘5Ý Þwyí¯˜¼²M ¸ ß6áä®ðÛ†l‰zðÕ°®œ!)ݵégú§ÐósLÄ'8Çcäý'âö›¤.–&¸‰ÖR€…ÀˆŽ„ðsǰ½Á!Õ®tDžþUF"î¸lä `ô'¼—Yð÷ˆÒþåí4û»»KÙg’3ˆ£@;íQ¹çîîqŠè|-âË‹Mžâ&™<Ÿ*Xð©¸`{ãùWD+Jp³>>R­BV¨­ØÝñµ®© ýßî‘ãŸçr±’£<ü§èy®N6ó¥)‚JœdûõûWkðÞ¼wn¾m@[Êbd²“‰~å=سž0¢­j¿ M†Mk\‚áK„QcQA-¸ää‘Û ðy"µç‚vfS¢êûñZ~›¦j-$²ÚE#MåíòŽJ´l\ãñŸµu—z>±suj..íÛ˵ˆ–yŒÁ× d X»È=1î€Û-fÞ(ä¸m2oí`1œœå»d|¸È©5oéûl­ôëk«VµäšØ¬_;H¡_/̤¨À9 óc›:BIJý éÖ‹: ߯) ך]…”<‘Dù³Ä@ÌcnpqœŒäsÈ5èZ…Å®µaÙék4CΕ!ê ð»›€K}îsžk‘ÑUà0 aFyÏ ü;m¶z½½¼öÖ¶Ó-^Ubd8oõŽv0° c£ϨðŒQÝ;ÜÛj¢S¾|o¸D[’LŒXg<P{޽%þµ‘£H4{ã‹pómŠïb[•0$zäõR†"tô¹5)Fq»<ãT¾–ö÷U1ÆÌ 8vû  :mCÏiô&¸i÷«+ßÞ}”Ch¤dÜ)‰ÚFXŒŽ3“^â+K9f²i˜]©U¶E*Ÿ›hæ gž¼vÅyß™&™ ]‹8ž ™šá·99“‘ÈÛï]4dÞ¨ó¤¹efXð Šõã±µ¶Ž;o25v¶b× ]xfnÉÁ­Mbú7FŽÖââå#»`´.érŠrÛ„†3ò‚ – ™¦ÊöƒÊ–Ú4’V„F“D]”ÆæQŒ¼IÁ$c‘l±Kž¶º}ÀÝ&ù±óc,IœžÝ‚ã‚3VÛu,iÍhiÔüÞ¼x%s©èr§8#øH¸¤8i<ûWénõT®F¯%qšd±)ç5,ÙÀÀ¨ÞØ~}+;\´ì4[È:@ç·æ*hÃóÿ:šÞÍ$`6dÓŒ9œùV¥{[f”ñ‘ž v.‰o›v8Îâ?J§¦è‘K2*–fàÜÓõ½ZXû6ÚPp¤3àäÓéÐ¥<9掵WËmWÄ;JÛÀÊWËä£9<jæõ-RK‰ i@úãµ%ìÞ\Dä䎵˜äÈ|ÙÛ Øz×#Ro”é¡F1W±bxƧŽq…#óéPÇ¥êº9]CL¾*àƒµ†ÿëÓe¿’ ÜÎó§Ú^4’+¹''×59O]ûKž+ÈöïÙ³ö¬ñß‚<_c«xgÄ×Ú¹m2›]SLºxeŒXÝ=Îr+ö›ö(ÿ‚šü/ý¹>øoöPý§µ{›ˆ×w0,>2ºÔ£´´ÔæIŒVÅIpZäÆÑ†CÉ{*î8φ©§KoLʘþiBŽŸíWµþΞ;·ñÁË:ÏfÊÒgæVÁw\Œç§éO C>ü3ãµã%¿§šòg—[›-—Ö°ÿÒCöûâÃûoƒž8—Â>8ÕìÄšu˺µº0¸>ÑFòD™”¬„m,Êìðhðõ¿Â¯júm·Š¼%¨Ýé÷QɨOj»ÛOÛ*æì ˜Üœ¸Jð“ˆø™ñÿ_ñϬþ5éöp[¦«ö±ÆâcäÌŠJý1(ÆWooJ÷|X‹â…ÎðÇÄß J—V³”ØxÛEÑí¬¬­ï#Šp‡2Èͳ:»Ðø§ð›VÕütö·¿ÛÿÚzMýݶ¿–S´håŽH`_œG‰Ã! 7.×bØÙ^%ñá…¬Ö:•´B[y$£±i$ue–9~PN3±Sj’Tî$i‚®Ó\òwØó±¸J8Šož ­¯¿Þ˜5 GWø_ãyü7e¤5Þ‰6¨ ´÷ ºDMå«lü½Á¶ç=7 }ãŠþðÖ™'„µÏ Xj†æ{Ý6þÕ"6ÒrÉ´È¿;³¹ mUbx¿ÅÝMZ3Ä)ÎÿR3´ƒŒž¹éŠÞÒ|;­jÅ¥°‘® ã¨ùú ·âO jwðÛ§hØ…-ÄLo¸¯½ùþZ]G[žr„ß½Ìo x½lu+k›»wžÈWhd+0N  <Ž›¸9Á'Ö½ûoÂ÷–ñiÖºš@±î†Ýe¸Wó2FsÉätÇ=:á|?ðÃVÕõmñA‹xIpÒUUyç#¹®»Gðì: ·Zù‹)C'îȯ̸;°\œ‘½'‘³Øè¤ªZóFLJg´†5³[¥öÀŒØÄÓ#ƒ××WÄ?µ½FÆeÓtæ–YÒEK©1Á†\¨G8QóÀÁwqä`½¹¸Ô^,L`|4JØWcò…ÉS† ñÈïÒ¹10§Ï©ÝJu¹}Í Km~ÊûNk{[G j±°’Imó…•@à‚vä… à–dzŒ'E¹·6Ž· µË,pEC, Ùäv¨œtdÓÔ‚8ÚwSÁé]G„<){¨¼s,µi#¨9Ž戡XÜ`c'®*Qo-ÝÒı’û¹ûÕ4éµê’kÈÕðõüH¯Üh¦R¬ ãŽ9Ïùë]Oì±un<{=„Ò:¤‰…IÁù»ý8®ZïI¼Ó ê7‹+€¬¤gŒýqZÿ³w?Å(M¶2á÷n'¦Töï^¶ r§™aÓÞöûÎ \cSY§Ðý¥Ño´y~øôû&t´ðÅ¥µäÖ  <£l˜ãŒüä çl}Éû~Óß ü ðöÿQ±ø'zm59m—\Ôîvÿg[28Œ£oUHÔG&ýª\°B÷b+áß…jžø%¢é“éêîúU´HÑ–@1 nÎ@ÏÉ@'8é賞±cáýbëÁ7šŒZš\ÜÝmtíAðnä!Õp$BTb5m§…cµž¿ÆV•<}Z±×Þ•¾÷cìhB2ÁBmËSëÚÓZø9ñpjŸ>øÖ}>ÿPÒ^sw Íh5&_.<0HcÞW#'°'·éJ¨IÞG¡­!¦ÙÁ©Åi}¨À±¹RÓ-°þ¸Ò¢ñ.›¥Ø^mÑuawöDdB¤ƒ¸ƒÏ%ˆî×ëS¥hݪ¢nÄéÿh,âáR4\É,œíWÿá³"C¯Ï•neo³gå)ÉÜæÆqÔT ±ŠA²îgd0N€ß¯sXŠ×Ìò­ôicY­£HŠÎrÃ8f#hÝ’ËëŽMZŠP»‰.I»&A K‹¨ ô0\$\°q•pOÝ4ºî·qz“êS]G%ÅÇʪ¹1ŽGe` †ÒL@té Ý±ŽNÜ:ö*Oøæ­ê>Ómü,šÿÛÛ{Ý|ƒ‚I ’~”%7I¨è–¢¼Då¾Ç3!†dmÏÜš§$Lä²õ­Y¬£-ÀǶjµ* ‹$¼ÉA¶wB¢^¦bÆÙ(:³)Á?JŸì± ьҬ¦X››¦+8Ók¡nwÙÚٙ炡›9,pëcN³M>5¼xoSÎ*Ηáˆà_·jCލ8♯êË ÛDÛFÀÇõ5ÝNƒ£yoÐåWV\‘Û©_Ń^Û<¦à«œè:W¡Á;´_k_´F‹eâí*æûNº½ŽÞ{;9%œÈÛV5ue)¹ŠÀ‚Hɯ,¾…œ²0!<³¸Ÿ|â½—þ Ûsñ{K¿¹]!Õí_b…,q"dÜqמ8æ¹Ó©<_?U=;¤Í*% K«KñGë?ˆî%Ñ51ir#¸–ÕDW1¼a|©Ô¬9DÎÕL•lÑÜ•­¬´o|¾Õ­¥šm|ë6 ˆÃ~ò)TŒXŒùûɸóÈΚ¬z¾öÍm¡‘U’l·ÜHÛ“’\±$N oƒÏƒµ_E?Å}jÂÓA¶¼f¸šÂHîo ì¤2¾~ÊÀç8ÁCçiüV£ç|§ÝBÔ¡Ìvú‘ãCDµñ³®ßÚý¹4û ;þ‹i~Ñ>éHUEŽ%;±òàœ)ûÜíÁâÏ|;Òµ‡vºÝ¾¿öµ†×I—AãÇÙ°ÒG.?}š¿|cqaœòÕèßb}+á›#ø}t¹çÙ´]:DAh†i¢–@ŒK|­»99RË’øRŸ!|^ñ<—Œc²Ô4M÷ú6VòF÷¦D¹GwÝ&WP¬àqŒ°T}«ç{#ƒ3Ä{(ÙnÍoë:• [ZC`ÂúêÖ+{»¥„a#;|ØÁÝ•ùÖ3¹AÝ™F0ÙmÛ«+ÿ _M¥Ïn)$+#öHã¯^¼v®cÂv:_‚åiõZy‡Û/'’6¿ç˜ N`$î 2 €D73¹žèEöˉѓç7acg$¾Õ!W©èq’s^æ\ýÄ©I;›÷7:^éäŠy–)‹Fá~@Xp†1žàvÀ㩨øƒPÓgEiõŽåq?œäª®Ó“– ò|¹à“‚OÍj¾ ·¹Š9md‹ÂLãpÊž˜ÈÚUº … û «kªÉd^þ=A­„ŒÝ>¹SŽH ‚r:‚+¦VÐâ‹’zšOÜ ó[Gx×h"nz€N:1ާ'¾@á÷erbV‰#–àHdbÂ!˜8bG ’A< “ØŒÐkNºª¤â=£ ‡!ˆl`rŸNàU}jïX‹Pxî4¤’O?kç× IÝÔqœ‡œt…H·¬[V¸Í,b†Id¾¢M’ZoÝc•cÓ$¤†ÉõÉ A©Íi{“Ø+#fRü¯PqŒàu8ö͹ŠÉ4æ¸Ôˆ™6Á0ʺpQ¶€ ¶Tr8(# T—W´ð˜† o^’ DGçÚò;ª¨SÈ8POáÏ'šÎœô3Äн>kêjø“Åòè°yše´3 !|° 2nÝóÛ‚[#ÔsÉ5ËÝxÎòòñ¦ÎÆ +e ¸9°ÝÈäŸñª÷ˆáÖå+|ÖìLJÇ È¼üÜý3Ûׯ=>·4›t)£b·I-¿î¼Œƒ‚OLŒu§vp‹MƒáÉdÔ[ɇV J’=Ùãh,p§æ=ëUo-åÓušmN&…д¡àÀ¾YIl®O ¾¾¦¹¡¢h–zu¾mwŸb)´©@g˜C&œgy2Îù W3&±µª%ÄÚ‚0‰ìŒ¿ºóTKúr98q‘WK𬔠µz.’§Ùèðjö~7ÔÓÁ:>¿§KÓ"[4Ñ “ÈB(@›9`ÁIÃã r÷šÎáÙ;-0Ò§7—lÌ|îÔæ%bTçï pÀ.?•iÓÜȉ´ŸÝ'’  ã§ÏsVÝ‘9 qÇ\qÞ¿PÊ|=•ZJ®:|­ý•ú¿òûÏ*®n£îÑW·_ò>P³±i}Ô¥‰=IÉ?SZ6ÖŒ‘˜â…pܪûçõãõÅKžÁ|âxõÇb[Ô[1äλÐàÔqÖ½št£©ïN£mX¯ö¨4¯7xM<,¡v†òóÓ%º9ÆzSÆZËL×WÞáÚÜA‰àV ƒ8ŽÏQϽQ¹—s³ž§šloÆÅäôjç²4ŒÜ[}cVŽi&ŠX·J|¦á†<ýìžyïO¸·¸Ô<¦Ôo7‚ÛQIÀEö?­VÎ~ë~FŸ9ÞsŒsX·üÚ•nÚØ>§wÈ-ÌÁYÂÛ3×ëŠR¶°‚õÎ$’Û«ü†EÚY~©³Jö=zÒ4ÅØÀ±¶åáøý+&ÒлlÈÞTk†’1©9Œå–Éí-&/ pÃT[rø#8=*B"Îç@p~én.ãi5bΡ«Iræ+PBޏê=…Sû4LÆiY˜Ôÿž)f›@ã¡<ÓEÆP–c‚p03õªœ¹ž¬TU‘™«ËåÙÊǧûWÕßðHM )~)njZLSX[¥ÏöÄöþbÚÆmQðxÌÑ cÀ2>`¦¾P×¶Ï VJ ’G×·úAÿˆøCkáïø“Ç÷·V°4:L«n.UžFŸ÷nJ»U¬Øg]ë…#s¯™Š«õ|6"»Ú4Ü~rÑ~gC^ÓØÒë)§òZŸK[ÙÛëÚä_Ûž)†ÎÓÉp÷©y¶ª¶J©tnÜo§©ü#àícÄ,t´²—M ­¥¢Íæ¼*»bIS/• ƒ!Üýìqž ;é4ùµ–™îŸÚŒÈ"dãÊPHmêw0è:òEiYxçÂ:N¥c¨ø´ÜØÇisnEׇ£ŠÙd/o:±åAąб+Ç̓ù*§+mcì*T’§ê{ƹá½rÓál¶šçƒµ4-ó‡»y'•¡œ åb¾jÅÕÄ®6Ž:+møãQ:/í:Øxv(õ«‰!– 8Ét[‡3ÀèˆÕÎ@y8çêƒ~2ýªßÀº÷Æ &-4X&‹ ý׊¢Ã]EåIìŠc“Œò“ó >WðYÖí.µ?Ç6£z—Ò®£xÌK˜” ,Ë•<¸Iåá¨Âœœ`úž^:³t×2×úÔ‡â:ê^ ×®|5h÷³[½{iÙdrteä>LôÌè¶ñêš ˜NdN0KcŽ={߀®ÃÇWzuî“}«\ÞÃ}{8ûEÀ‡bÈPP‹ѳ w¬AÂ’8ª>ø†íÄ÷ M¬ÿh¶eqŒåNÖïzáxq^´mh|Ýg)]™wZ=džu¦zSjtŒË ¶ÀÛ×'úUÕä{´ýÝ›(šg!ÁÝÁW8`’ÇŒçÒ¼×ÄË¿‰d¿KK{ˆÞv L‰îÊ…,0¸ç…ÀÇjë|}u¬øŽý,|=¦ýžÝÁÖÒs" b@C!TÜGL•\œ«÷EøVrßÂŒ¦!.Âa ª¬x Î[ryÏq\q—,­s±(:vò9½2èÏa8—jN‘™KÇ$å@Ï#Ž}ö¬ Ï ýZ+]î⺅ÐYËm*˜¸ßœ)9'9Èç¯8®Âïá‡Œí„æÞè#ÂådãÅŒç× 7>ð=x5'€›@Ó ¼¹Ð§Cq.Á3ÂŽFà[ c ú‘[®VîŽxP²+.¥-¤PjF¡8¹ƒæÁPùÎÖÉÎ1Ð4É,bÄ÷ 4ó9–áËn!ÌT·r 9ÇBz“SZiÖzoaªXMJ¥í§¶R&lc¸9çŽr=ÇEq3Û$wÂDžÝV5V\‚1‚:»8ù™Ûž+ëø&åÄT®¯¿å¿Èóóšn8A+¢ äãsÚ¹?x½mã:]•ÆÖ”ì;z¥jxÃQž×MwFÚÉ òkËõ½`o2JŘðNzWíØÌB§TÏŸÁa½£ægqvÒîlpA §¥UyˆÜ€ ÉêIw"ä÷5ˆÙ±ã« f¾2Rmê}\c؆P7î<.Jd‘NOáK+FHR ù½j%Û“´vÍe7fl/ÊX•§jdŽ)ô×@ÀšÎz¢¢Ñ˜c†Ç=3N„M€¦ÑCmSÎr*9YQw ;9ÈãcëÞ³(vû{uw‘¹9<õcéYò»<ƒ ’OÓ€w,dcŸsQÈJ9·¬¥'-Íc‡üûˆcÈ>”pb\)úSacŽM>[?Ýî,2@â¡s5¡M¥¸žÒω¼{e` *wLžµúÑû/è~ð¯Á½,ø3Ä7LÉÚ‡“nʰ\ˆÑdƒq9Üò¬OÍ_–´³¨üFUgÆÒ\7/•~¤üÐtÍÓHÒ´ËèZ3¶€žk°ˆ¶ç ¨?0Çób¼löp†@“mJsù5×Òé£l%å›­.£ºç}©Ãu6›w=ÕÔ–úzéïytΊÂHœlHWig\ ¿?AÅs–Þ×o>Áã9¼qRßC$¤—D xÂŒ…‡½~P¬=V»ïˆŠ<%¨ÜYiqÇ––-­ü~\ò4Å–6b뀊 œŒ`('9î¼;ðÖ7öZŠ}&þÃR»´VóaŸUŠv¸‚H‹OHou?¼F\…ÁÆw“_ž¨Ê4¹ ®Û=êÕc*¶“²HãæøíñCIoþÏZ™f‰«\2O©ê6¥å²¶x3H’*Æ­œ6Ó…~œàxö§ð«V‹ÄW¿gµ›§‡üÛ™´âs$Q€ÒJû3òe‰÷ö®Ï_¿‹JÒ¬=«-;”gæ¡×J^Ö2µ•¬½›¹­©x‚ÓÄæ[k˜o#dÌQ[ۅܨ7nlƒq×q#Þ¹(u(›N‡[žmBX,-\1&8$Á ¸V%UXŽì_½ÖàŸPŠæâú'’73´J®òríçgžÄüÙÍPñˆ“Ħ}bÆæTŠe†ÁdÚ«·ÍffE q÷vç Óž2’jæQ|ÎäpéúmúŸ7RòbчÛ»èØ`tã + ßVœ[Gi ½¤<—çÎrÄ™È?78€b3ɧiÄÍe$¬JDûþVVfáŽqŒç¾çúÖ•…Ž ³éJÆÖ4zÁom—“q’yÎÜOÝ郌OÄmI_r—ˆì ƒDû-¤Z@eA c1a÷›88錎•É ›;¨D:ÊB‘LÅU(‹AŽâzuì†z]núÉõXôÁr¢wÏ»•Œ€~î=8Ï®+žñ¦Ú|ÆCk¡‰’ijk9¸µ¡•㈷wÏ%…”QK*Êb¡XÊã8Ï ë“ïÎi~(Ö¬å%Ý-ÄÄOCçe²s¸tÈ9áF+ ¸×®5;¥¸·ÒÖiZ1¶I™ŠÉ&0N$Ž©§Ë5íö£¡éPi3éößÚZ”ìñ"[壋<—ÆÝÀ6?,gž:Œc±µ'RoFa¤ºÌ·:ö¬¯qJÙ-XÆ% á~f`e ÆÊñ‚AÀ×5‰¯XÞ¼“ÔòkOâÞ•·=®™42ÛX©Io!RâA̲ŽHÛ‘ò‘ü*½Á'ÍüEñWH¶GŠÞ ¥;°0˜Èõäÿ:ýÓ…2,.IzË÷ÓWmî“éþ~gÈæX¬Faˆp†±LÏñv³q|m3(!{â¼ëÄR¹b¡³ëŠÖÖ¼`.Ù¾Ï3ÔžÕÏ]NnŒœd×n7ªÝ&wá(:I]~Ê$‰™œ^ÞµJê#‚Sò>æé›•P¸Àïîj´0Tšñ§(½V1œXß%°@^OsKÄ0éÚ‘¦œ©ÀÇzDgEÚ¤uëŠÉ´[ÐsƬ2±ôêj6@Ì­“•Êv-™v;,@Æ}8¬*C•]³¢»Fnn«®<Ø|…S¶>Yˆ*½»G"‡s’‡úV†«¬ ]ì+71Ø9Ÿï7R=ºuâˆZ0r–È™^RQ]MŸÙƒãùµ mª‘Ê ³Ž>÷>¦¿R?dZê}SÃ)¨jÉ }¢ pWxÚŒQYôrpGJüæý•|©j:gö‘·#^ŽÝò Žv…Û€Iç']^ËJw·×%e…üÛKs „H·”RJ·\œqÏ'‚kó˜©(:iév{õ¥WžÆ‡Ç OàãèzŒµ¿´Ö4-U,ôH3¾=BÉ‹vÓ‘’w 01°á.Õ¥ŽàëJ‘™ñ¼nbU'+É9Ï Ó“ÏA]ÿ‰µ-OÄzšë“YÚÛXùvÖó†Ýåuˆ#JÄ€þï “Â°š×þÐn¶ÄÎïϾIƒ ^À öÉ8éZs{(YêyX†§'-ŒO jV–þ´u´Š(sxn$Þf‹ã99w=ˆÇ5‰â­jö¸0\J…#c [ÌÏððèÏCÒ·üX‚;ƒc§ª-³D yy(¥@P㜌tÕÁ^ë×&7°Ú•áÝ‘ó ôÁãN™â¸œÝÛ<š°“z^Õ­üËešáfxíÑÍ¡·ÿXË´m9”31àä+?WŠãRŽiÉXˆ-²2#$îW ÷çÒ¨ZK{=ûM’³*¡Œ[NÍ´+ü¬>S“ò’1–ÏL•©¨ßO£öbòâïÎ}ò´÷~d­Ói°çó×#'ŒJ2ç/ôÂ0iÝ®­oô¨,¥‘­ÖÝðòÑ]ŽyÉÈÏ\s×#Lú6¸%±MMÐ4…Š9ˆ|Áëìxïך¥u¬Çâ â³³iŬSmò”ýâ¢ð°è $’šðCm#H¤82Á‚Àv8Î@Î@÷ïÅt%Ë H馒ʖq W’îM1³¶#¸‘â›$u,ݹùAÉÀ¢þI¯íÌ–q‡`J£ÂrxÀÏ wgÐiÙ¶‰»™ MÃç8?+69l@<çêMKa¯Úè€ÔÒÚîtMÎÒ­0ᔌ<ðçÏU+ÎvGJJJìäo|ªh^_B Š9A»€ŠFr\ðv÷z×ÁÓ/®/´½Nök¹Ù•µ{™™gxÈÚccåÆW ¦Iä‚Äq]·Ç?Šöÿ ·ðžŸf†ÏO½iÅÌ7dÃ1 ÄXù¹÷³¶HEÆæó][^Ó´„S¨Ý.qã–>€Wí\Ô°˜_¬ã!ï7tšÛÏúùŸ#›c]JÞÇ-:Û¹Ì|LÖîtˆgO!vƒœóò’Lqþ¼×X¹™ˆ=Iï]oüI¦Nòà ¨w%‰b@Ž:à5èÎã<Ë“Áç¯Ò¾ƒY:ÜÛEƚЩ{~‰Ôóì*Œº ¡ü)—w–®p’õªwl¿*̹ú×ÏU¯èÏn×RËÈO¯4äBí€qøR’;RÄâÉ y5 ¦Ê`Ø»‹f£4ë«É%8#ÀÌŽq‘ì?Æ™‘ïùR“B”]€†' {b”™ÂbÁO\µ,NIÚ‘fáq×46dfàà©>œUhú’7,j¾1LJ]ã Ç™â£iÏ8cÔR™G+€+7$ÕŠQ³¹^hþ|óÏ\ÒH†8Ä‚2jÈùz}sQO¹ÈSÏ= e$–ÅG1ˆo žKvï è·^8ñtz6üÁÏ6[¨§ãÒ¡¼WŠ•Hã<×­þËÓ#¶¸ñ–£‰.¥;aˆ ( îæ¶Á᥎ÆB“øw~ˆË‰Ž *¯}—©ìß¼/‡õm*Þ) ·1®Å`ÇŒí¯Jú÷öqð׆~!~ÓÞÒµI®b²ºÔ£½Õ¡Ò&0I”2€vΡ¼“»ÊÁUÏnä2øÿÀÝ;K´ðÕLjõÔ/"Û>ìI¹£R ÚrG®Ûç'ôÏì#Žƒâ-Kãž­qo,·­y¤&– šêÌ¥·IL1·*î­òÉðÜW™SÌ3©{?‚Ÿ¸¾[¿›4É0ó¥E:Žîo™ÿ‘Ókº~·©ëz®5ôÚ¥ƒfÍõgå*.âOº¤0Ĥ…bÁy'>sã‡Õ^84«ÛkYa³·ó'P¡$`[i`I€ Œœž8ç¿ÕõËXî5­/NÔ†Š’Éayr`6p¬QŽà@QYÀÂs޹–¾µÖµõÖn\B‰øÐFäI#ä(O\1èpOCœ ùh8¸ÞǽˆŒš±æš4—zž­¼^gœG*å[n3Ûå;»±ïâBÞh^ÁîÑ¢ï’UhñÏpqÓ<ŽµÛøžKöòÕ ,©6#20ÏÜx<Œ‚³’I' œ,Ö^òK™%³·òäw`™D†@1ÉÏ̼ŒgŒœó´Ö¼ªhòêè¬sÞ8Ôu¸,.o¥eXÌjË 1 X6î9çv pp^fÏZ¾þËÇÚ'[{G2†ÉÚKçÔž8_LŠõoˆ:6‚ž„ù÷olVR¬‡qeÀÝÐŒaH<žzñúv‹§XY³¶—$«rÎ00s€€ÎO¯LiADá”–å Éá»3][Y_vôÜ¥1ÏöôÇsROyi®Kçê29™ÆdfPŽœÆOs»§##>”¶ö’ß3l±{˜ƒ2°B@SÁËè¼c=}N%ÕSM²‰7ml…Èó–$óÔô^sÈÔFÝÉæ²4×Ãib–Y½Žë.e|`pƒ¹yI#r9þX>µ~ éCMÔ•fù™B²6:¯SŽ«€ø«¢øŠ}au}WVŽçGVXôÝ9SgýÞYÊãžr'?0×fY•<Ë5£EUäR’Nú§ä•›û®uý~40“u`¥héѯŸoÄÖµø¥á»ÛU’ßL¼Ù¹˜yÑ*¾7eUÎ àã=Iõ¬­_Æ_kµ’ÏJŠeŠáq+\0,  Àxç©æ±#‰#Q@€T7wðXÛ››–ª&¿yÁðGàkƲƒn=ÝÕûÛ¿áä|E\ç^š–·åýjG«ê–š5‘¿¼˜*(ÀÉå`=ÍyW½¦ÞZ³Ú^Ùy,¦'×j™3,,®Ä•!²“\´ý¢ªÓzÔ¹êyÏ|3oâ:)¼ 3Ë€G,wö­º/)Ÿ1,Û6œíæQƒŒŸ ñ* <Èó_-Ɇãcll˜ÉRÊÙÎ`ޏ䂽ÚîÓÆZuÛÀº¤ñGo?úM¤ºqHÞBæmcn îëYÚ÷‡ì5«ÈžõD+6×ýðaæí 3€ÙéÇLqÏn»YèyÕTet-Ð|=¢xªí§¾xü˜Àh’Þg*ª0¹vVDçÐÇpqïk†/&XØ\¬R+.3òž§'#Žãv®·]øqq£j«ö ."µG]9œ"ye‚ü£¯`9äÎ5j–6óO¨Ï©­ÙŠBŒ‘&w*˜œí¨L8'vOzSÓS‚­7t™ÄjÑ^BÖéd“BÌ6«–uEèF@ž£ú ’;=BæBúµÄ®ê<Ù^Y Û†A$qŒÙç¦Ekߎ_n-žKw¾»hån#²ƒƒŽøV<žza{æªÏñßÂÍnAðÕ̲²… ˆÓîãiÝ—<ÙÈïžzW±†á¼÷éaäÓêôVõg™,n ›÷ª#B+]:ñÞÒæÕã’In™ ÙæÚ¹<œ¯B9ÉùFG ñ'TŽÒæOà -c1K¶™øåRU£è;:Œƒ×5ïþ%x¢ùfŠÒäZG#d8e›ºúsXR³Í#I+–gb]˜ä±õ$×èœ)Á5òüJÅc’æÂ“½ŸwÒëçÜñs Ö©û:7³Ýÿ‘íÒY@×±Ú žéõ®3Æž$‚ Yo¯®#Œc€OaÏŽGç]ˆ®¡Ž%†@ 7'¥yÆoé¦Ùt8ÛÌ—pyr†úò+îóR¡‡nÿðç&]‡uê¥c×5éZGù¾g%˜–Ïë\¦«¨± ¹ŽO½3TÖîÿ\šÈ–êYÉ Ãñ¯ÎqxÞy4}Þ ¢µ ‰ÞGÜëØÒ`g4Q^Km³» QE€ô«Õ0²£U'“U$i7í} L5»ˆƒGn‘üí—b¿3}M@åîeÞ̇¾¾r‹øYਾ¤麃©ò7’ iŸÐU)tM@€ó\FÀõ “ŠÚ¶…Xây_k¯ã×õ­{KhE ì^àóŸÎ£êÊ«¹^ÝÓ9µ‚pŠ»×Ž¸šq·r0U¿ŠÞ¸ÑáiH@ÃãJâÉá}§…)aÜVŒ¶3[¢r{€*$‚êIÇS‚XàVÄvñ ÎÌv¥1+eЇBýKuZèd%…Èåçœâ0yüêhl †–Ü=sVü­òôl“…éG£paœôÈ¡QHN£f§Â]*[ÿÅä)®æÉí‘×Ú¾•ð¦Œ×ú•–Š—0»?Ìþh$F8=?^5ûsªéÓé:Žñ:I¥o~«r u%Î ·È €zÁ®‡IñÅâÖ§qu ÅŸ0‚AN88=°=3Üñ\ÅÖµ¡Û>§ jÆñ µÎ™ÃrCí?)ÀÛŽGPy8:¯‰/c‚Kií.m—É>ZG6“Ô¼m÷éÖ¸9Tžç´æ£¹ëÞ$ñ^‘â0ÖÏ<(®í(&O™‰@w`žTr{óž|ûÆš¿„|# ê^*¾¶‚Ô×w&%›hB¹ “è \IïŒoøwYÕ¯cÕdñe¥.Ä¥KeFâ6¹'ç Î9Ågþ×_5Íà­î• éwzÔS[Éc¹Ý,nK7Ìã`“åœæ»phâq”èÕ—,dÒo²os—)BŒªE]¥±³-žŸs¤kJÖ »²¸·U¬­…Ìl†¤Ž$Ü `0ÏNHòè~ëK¡¸·¸»Z­ÔÒ•fIâo•UO$©P£F:xf™¦ü`ð—‡õ kD曦é×Â-B[k™`H®eAnÎ;éXZö»®ø¢÷ûOÄzÍÝýÖ0non^W#®79&¿A¡áäkâ.±JTâõ²×Ñëdíÿ |¥~"j•&¤×]½{”làxíR)qƒ!G©Jàgq¥¤$¦¿\ŒT"£Øùw!‚3Š¥¬köZR²ÊàÊ" ÜóПAïQk^"µÑ£òÚEy˜°†ÁÆy?AÍyÇŽë.Ë¡†‚“ÜÎOçKEà_¹ê…Bô¥ ‡\Z( ÉñœŒj¹ ÂnÆzÕØw8ÀéSÇ?ÏN„s_MNi3ÇšìZ‚[™0"( ÑÉäÕØ&†e•3艀?SYÖ³mm­ÆjÒÞÁýä€gÔ×D$Ò»fW4`’iãDš\&qòàgñ¥¸´ª£Ÿ½¼ÿ,â«[^À#]¤°îK!R6³ „ªÚO÷O2 ^]Q•9GVcÉ"í„GæP*#3Kœý:[ï:pntù˜p71îFOéV ³žoÞªª‚zÓük+)ÊÑ4Ö)\¤w7.7Ca,1ùVÂh"æê.7å9È#ÜSn ‰˜ g±íWì'k²}¬o¡é_³õŒv^¸Ô¦„ƒ%Á ;‰0ã>ÜW£Á}qoá÷±’ÖAçÎZV# TŽç²=»×;à–ÃÁÖ•ÈXþi 1üþ•Ó_Ejm-¬–ù$‚F æ"ìØË`¶ÐOÝëòõÁÀéÍëá0TðÑ«+>e­•Ò¾½ý©‰¯VQë§âzoÁmVçIøe}ÑôZ²\Ûß^h¢x÷¶Ú‚Û\ݤŸc¿Míöt™6¤[xävfVÜv†Aº5ç~+Ô~i1[x^ MRÕm%ˆ¿Ú-ã“=8ä…pã$ç ~+Ž­:؉T–­¶þ÷sípTÒŠŠÙ#Ó¼)­¥ö­oo¯]h‹.Ù2 ®Ô@#WœmUgnqÎsžúÓá|å’ëšïˆg²¶7é µ£1 ÊĬ¤†ûÛöØ9û»r§Ì<¤^7ö$Iii³Ë=åÒƒ ‚x K äü HÖ½'Á"þÞò »Ë+l^5Iô÷ºŠK‡Û·/Ëå°H8+Ó¸*)èÑéSQwR;RÛῇtFÑltý?Ή£=¿˜Œ¡Œªo!y8˜Ï5á?´çÆï |5ðUÞ‡v—:„wêñÆ–7m º¦Ù’EdUز†û `†-Z¿>0xGÃw³A}ãk =‘²±œ¨-µvAÉ`uùG'+Ôm¯—j?ŠúŒNð×…om/ìÒ5º»¿‚BY§ù”džQµFrH#o ý7 d˜ŒÃ3¤ç r^íí¶úÿ–§“œã¨á°³ä’æµ’ß}6÷ãgÄ[ÏÝü-þÜì»”•ínbŽyT!R¨'t2*Pv«(ê1‚Aå‡N(¢¿|ÃáhaST¢•Ýݺ¾ï»ó?7©Z­ksÊöÑy.ÁY)ׯb$CM!)ì3“ì1Z²rÍr5†[@ã  ¬zžzwUäã 7/Î¥™Èx›Äª›é„Í$Ÿ34hIcž„ôzW“øÓÅWwà÷¯©|Wá§·±Ö´ 28í^!ã+!˜;(}¬Å¤e•B©\7'qÈñOìé¯êÞÓ<q¥[]iúœ794íF¸·0>ÉâÆH±ò²³.ÇFVV<ãõÌ6{“çXhMÔŒ*5¬[꺗t~_F8¼¾¤£ÊÜwºüì|¡w¥Ìé @I!sœ­P’ÁÖ`ë´áîA¯ uo:-­À‹Z[È@]Â'ˆFXr7döÈ#§PGcYZ—ÀO É´Yj3Ç,‰g*C)Ü8+ƒZO)H§ö³ZúÔó|>Í¿¹ž{¡ÝJ¨ClìŒ 9÷ÜG·Ì¿MÃֲ涹H÷Ë!€ÀŒŒõÕê:Ï‚Ž5ÕÏÚÙa[ o”³•‘Žè½¹àW3ª£áÚâÞ'. Td8N¼I8ç?…y8œ½Ó½ô=l>.3JÇå¾I 9§Ç aŸ,~ Wà±Ô$ˆ«ZEîYOçšmŵÌ!aŒ’1Ç9¯;ظ«Ù¾Ò7²e5¶¸'*‡ƒÜTЬ‡÷Bâ%<î,ÜŸçL¸µ¹dÌùŽA5J]21ûÀrGnÕ›n"ýÙ­ÍEºµ±˜E]ÀåSŠ´÷ºR6´ï?úõËÏi‚w‘ŽÂ `7Žõ]•7ð¯Äkks´]ÒŠíû[7(ÿKmâm ê;A=$¿¡®!K`îQŽJŠY–aömäc,]@çð&Ÿö•MÔWâ7‚¦ômžã}Y°†úìÈNCF„©ùp;ã¦}?.Ljt Aén@ȉ‘@k™Q’<’Ç8ôúÓd¼vº`ƒÇʧS2«SY[î`¡Mi¼Ý]{MfY,´è牕¤bqÇAúf£¸Ô5B3Ê|‘ð8æô1;Aö³mu›»V ®…GÊTÿÖþU2j©$­q"Ë+±Ëå‚3‘X:Üú9~†ÞÍEéÔ½‹^̦õ|Äû¡%™ˆQÛ¿ô­>Òº†0ŠÃ…l éùzÖ jS©V·D<¤Q³cóÀ©gÕ¦yQj2Cõ˜)'ýÑÓó5ÓB­Jö¿™…Ju§^Çt–lÁnà3yd2¼N9,@8LJøs²_è÷"F³I¦”H¥„g9ä3ï×Ö©¬¶7=Úº'f`xï×5kN¸°–è[G²N¤.Õ¯BUV”l¿¸â5NíÝ“Üh·Çݬ å9#i”žÝ?•G{ [FÅ[,Jr¨Á¿Gkn+«†òãq€ŒaNˆþ´·ö?úMÚ¼«€êOï'‚yv̤•ˆÅQ¸·YÉVpqÎÍ™ÿtW—ZŠZ$wÒ­®¬ç§µ]ªD¨ÄBýuA¢`=kVòóq‚ ô* øcŠ£yo"®XGÀã`ä×R—+Øí„îWÝ‚U†ë@ ô4Ñ 2î ž»p*Xb±1Ç‚ƒl·b0W ~T刑ÀëJmü¦+'ýîÀþ5f(Ãw}æjãÝ™-Øý0ÖƒYÇlu(M˜FD7*Œ u9>ùäœàTZf·$¦Õážæ;Ë –ÐÃtmÞè–þ2Tìà†Î“Ôw¶Q,õ=3]½ŠPÌ]’I·+ lÙÆIÇLçÓÞ߆/¬“Åé&™¡DÐI¨)–ËPŒ9XÀmÞX©sê' _!N 1>5U”ß/qc‰.J_Mg ±G^­û­˜8rx”îÁùX³wé¹sá]6ëI¿Ô®e†êÖEf±²[ÌÄÌÀ•Ýw›†|¤œ¤×Ôìm4ývãÚ\hŸi ,o&H Ùa&HÝóž8<ƒGÄû]O²µ¿šònä $–ÊwWãe±Àõät b´¥Rj¢q•šÛ[[ÐìŒckzž;ñàÖ—2jÁožÍËk¹°Å¹Gaó]™WbÃ9îqáß¼&Ÿ¨,‘YFUQãçÍ#9cÇ^Ÿýn•öŽ•áŸ"øIlõD–IîüÍ×.XÆT¬Žï¹ß«.9#Lj¾xSÅßß3PÓ.>Ù¾¹‡ÌEˆ©%rI$SÐä·wÝåRø‹km§x›P¶°#ÈŽé¼¼ƒ®?ÏlWµR¶KÚ᧤ìí¾×Gvue?g8¸»_^Å­Õ¥X§Õ’$¥K™á#€H~\óAϵƒ¨Zµ£”3#î\Œ=Ž:j’}AÊæf}ƒK}Ñ’­Q¹œ¢'ô¯µHIY#Ú§Š×ŽBòzÕrrsK,­3=é¤Ôו9s3±+ ʵ4ÄIûÿ…*&ÌóœûSNÌ7uÀÝéRQ%4Iž«Ç®iX1û­Â˜Ñà}ãŽÂ [~2‡ò©cŒ¾[#–ÿd€*5Ø£ñFùBãÓ¥T]˜Í+}"x±(‚lc#$*·k§\ܱ…÷cUaRѨh£#o!$é[m²BÕ‡Î3€kÒ£ÉÙ#޴䵏æ°)V|:œ ·§Ø–•]îÀ̘'˜¥µ¥nÊ¡cœ=*]öâñpDj‰Ž_©êkÑ…8«6Ž)ͽ ð[Y´Ê³;¢¨$}¼ûžµzw{KsnÎèÎ|§–MÙãÉ9‚ÖæØ»7Nõ«·sÜÞ@… DòÑcVÛó{õæ½Jiré¹Å&ùµØçî ½’l<$®x ÿ)ÚªIm ʲF2Ùò¡ ݺ³–<5ÄÍ =“·ø ̸҂BÓDÀm?w9?…qU¢þgD*&¬d^¡s›Rå¹ÍS0y±XŽs–OzÕx’UùˆÉH¬‹Ý‹péžã"¼Ú±Ksº› k}ŽËå•àÔSY»|Ї$ž‹ž}±M¸º¶`L“4œmÁ8\Òj°_.Ò'G?6ß^xêy® ÃfθÆ[’ÛYA ™.-ˆ+Õà“ϵXó`òüÙ#èBå8\QF½»ùf\nOsø“ZÚg…,ïç'ó ã.sZÒŒ¦íŒê8Å^LýF¸ð¾·¨Új1˜˜¼Ì01m9ÀÏC€îÝCáÆ¡ip—úa·û|p™íBIºSê2 ÚÝcŒŒààWD|DÑjz}†¡,Egž=HM¹Š ,ýXàs»cŒ®åè& bOi¯æ‘ ̬>Ü}×"3œŸ”¯ÌzN;‡’Pßsæ£ÞÈÈF×oõ{ýKOФ‘îŠÄ0œÀ˜#kÀ†$·àc‘š—ÄZLj¼5§7ˆ-&­ã)ÝóÅœ6W®ãì>˜¯@ðyA±h 1Ò”bvò£æÉÎ a²kø‹‡µygÒ¾ÄöR‰‘ œ²Ç \™8>»²õûµ–­èz‡*Ô‚æM*ÃNúEìPé‰u%Ú}¢áà¡8ÇÊ~e,rqó ·™ío5MFÞØüY-­ÔK™}$£¸^ÿ-HHÉç ž9K«kˆ/[J€C!Ó–#4÷ìÄ4¥óÁó– xÚÇ&¡Ñ5KFñE®£«NVÍæU¸ŽP§`’s‚qÈóUf·6QGKãjÄh³Xß-´×ÓjM†ÉšL2DC…8@*“Œœ×Á¿´†SFñ©ö†A$ÒïµòHT ’ç8ÉëjýOü$ñÃÝsáö¡¦ø‚ r]t^hWö¬Ñí"BËË*üÓ!+€D±’Wb«ü[ûUøzëZÖn¿µ. ]GOŽBä’XÔœ(àc…F9ç’únöÕ*WŒu‹Š4Òü›8jM¬TfÞØùÖKdGuyÔ^v¸ ŸL©9¬{‰^V(ÐÕ.cmˆ«·báö÷÷¬ùÖ8dÚ¬Ø(§,1’FOóüz×~"Iè¡¢›WbT|ËÛõ%3ÌWR¤â¹MPú)¨Xç4#zÐ!ÔQM“½5B’Bz g½<¤ÞhE„‡ÏCíQ£È2‚`AªôKqz×±ÞÇ$·ROz¸Ç˜$ì_µ‹ ‰fÄänb:V•„ת>EDp=j•£Ü2„W\û¡¹ÇÒ¶lôùî¤òmc,B;G@Iü{"ô±çÕ’OQ#2Jšç ~wÀ©­­I”)Þ¬™ÏaLKy~Ô°nç¨æ¶tÝOüû·º„ýß—‚7ß$a> z¡:ŒãœãbÞÙViîË»š¿«§C6f”§¸8ë×§4k¦3 -¡ÜFÌüüÃRNE~næçÔòšT¥hÖW¶:¥ý¦«âïìÙ´ÛÆ†êÚi2H±Ófá•rðœNŽ›àÍ X_Ä&ÔäÔfÔ´ÙMÕ£¹üç%7(^X’;Æ@ Œ |ÿZð.º¾'´Ö¯õ´–?>0ÑK —žM¯#±ìKžzñžõÓ|2þÍ×ü;u®júýÜm Ë&Ÿohr ¨MèùÇ ¿tŒþ# Œ¡U^žžgVUm=Σž1ðçÄk'KÃöº$ ¤˜nôËwÜÞI U.¬J|îo`ÌT|Ãæ.£žñFŸá=Nµ¼Ð­mMö ¿¶/•díö°ËI’d`ýã…yn_V\]_Q†qc4¶és;Ÿ$&ÀŠIMÙ*waAnØÅQñ‹ô¯ ü:´ø¹ñzöâ/µ K? Û“8x]ò¡%±·q7ËÈ¢ øŠŠ†-·¡¶&£³æZþ†¥¯Ïá].ïâf³¬YGq²Zé¢8–T!1ç*wµØ°UŠ(=Å|]ñ?â>«¬ê׺üwÓ¼7Lÿ¬RÊà½yÉ'¹Íu¿>8k¿¼E.¿+Á*¤±ÊÛQv†fè8ïÁêz׎j¬×Ó?™’Nx¿AËð/&À{$ýùk'ú/%ø½N\=%RiÏT¶¿æc_Éæ¶Aêy¨c¹t|ÌY×a1Ïð:úTבH³yAI sН½}k†£|×=Ø4¢ –f.ª¸8Ï<öýzIK`xî3N£×€r1ÈÍdUÄDØ1œÒyc9Í+=(VÝ@…¨Â±ÝOéß l´ëÍVoi–pZ½Ì†€Äܱ™Ô`<Œ6`=G^x7ÆZ‹!›M´–êd›ÍE[²Ž_8ÙƒÀär²tKâ¿i"}2ÎÁ­ÞÞBóÅËHðA¶pX Ù›ÇµHmÚi#Úð¢Êß(qO|’F=Í6xž<¡÷¸ö¦¢oÎp=8©&ÜÒ³<¥É8ÞIä{gšHÇSšàz3w¡úYa©êÓxŠg¿E±ž)× óñæyI|ç{aÛåÁ䎼æïÄ/ëW^{Z[–´¹ÕüÕ€H¢ï **팤d.¨QÁëY:íÜÚf¿”ºt¤c² ù‘ä*6F3Ïn:ïXß|Uu«_ÚYi\%‹Hdµ¶‘ËUÂö#ƒ×è|J‹©Smó½8êÍo x–tÔ^÷íÆÝã_17ì`Ç%¾è<·$í$rã'š»¬js]h×2ùV<ÖMª]F’ElðÎr9‚rTÇFÅpzí®­Am§ÝMlÌÁ‘ZPˆ …ársŒà|ÝxÍtójÑb.qtM§Â¨qœvöìOZÝ_–È'ZIZç€üwµ#ɽ‚ÏìàÛD¡Œ`îÔÃ<ó^7xCJÝòݫ鈷†m.þÏâM.=F`$6ë"‚p'Ž¡ŒoôNÚ|ÝY´<—RÇž•úÅ:3ŽU‡mkÊ®»h¿=Ì05yœ“ï÷˜×öÎz~UBwp}+nx. ‰'»³tI´eÔçzŠçr¯ä+Í«O±ìÓ¨P‚úòÆo6Ö\8<ß=Áüj¼²KpvŽ€ žäÕ™aò¸úÔRƒE?•rJ2JÍQh¦@BN¤òÁêió ‡<ô¤®F¬ÍH÷MýßÒ$‡€¦¤¦ùc9,OÔÒÑWîåG%AòÎ=1Jÿ„Æœˆ¾õì:& ¦S*‚½Œæ¤´óD»‚HOûia€.‘³mìXUèP#”XºŽ9ãÓ§ZÞßS9I[Bk›ÅŲı®~i&`OéZÙL¿;Ý6âAáFÜVrÚjÑ²É ´Cž<ÊØ³Wr‰+Ä íéŸjõ(E·gsŠ´´¼l\²·Þ¢Yäv ð¥±ü±[^ÂÛÍ´'/îÁÇç֨Ūe#fÇÞ*¤ÿ*±cquM*éÒ2† ¸ İ ýk×¥h$yµ9¦´6¥‹"éb2Ä/Œì3Ux¢?1qwt΢o&0‡g#8>˜ÎG¥SI+'7“wÓÞº*V‹jÈÆ0}Ë×wÒ™±ëXúœ± ”Ž F{0sRÏJÛ]äQƒó)VçOŠ( ‚MÇ<\µj9#¢œbV¸“¼~b²† 09S $‘ÜÅB½þ•"·u’&*Êr¥OB;Ó¬n¡Óo~ßul—Š­¹áºf+'^‚ =ˆ<×JèéM$c^äŸh·òÔ `rG¯½eêÒfP6#Œ1géWõi$½½vkÅŒíÜBðØVDÍæHAr݆My8‰­QèÑ]AØ¿%Up:3ÿר÷68»S¤Q¿Ê‹#0*¯5 2r@wšãk©²?IüG¬Ý'‡…ý†‹#âÖÝâD–Q'#åc$“‚zc ÇžÜÞj÷—ª°Ü•(ªÏ;–HIܹ;zœN;ׯj¶›-µµìM bд|’+¸‚6ŒsòöÏzó]>kÕÒÛP¼’&³BäïÆÃ’9ûÇöšøÚJÐÛSçšF¶…¦x†-BGO7g 0ÜI㞹Ϯ»ÄöÉiim©^ZÛüÀ6v!OÌÊsÛ8ëY—÷Q9“IkYKAhÿ¼”„\ðàuIÀä¦;ã_êڵų÷D‰€ aœ> p_¯8Ï^ݹ~b±Ô轤Ò~—×ð9«ÉB›—[#ðý‡ˆ®^kÈŠvò,òAÈõ§8ÏÀñŒVÇF×SD‡Ä&ö5Œ9‰qþŽ}ÔŽ~•íxLxL¶Rý«nï–ìuôÿ#ÔWΚל—W)=‘¶v™ÝíÊ€S'8 tÇO¿pÌãK …§BšÑ+_ÉY~'™”Fu*Ês{tõ3µÕ·™bX¯&™’%dPØÆž@sX·J°?^½UÁëY“H\œùD“zSF,d±îù€æ ’,Œâ­R> œ×#I­NR¹•sy Œ{Ôœ‘VïO½ª™Â’1ÇÖ¸*hΨkv*@­¿ø$*0HÏ¥!ކ³ÏÞ~4¨øpÀ99æšå×cM8n§ÅØî?ÑL^`S¿r¨ýO5jÒx¤›ÍÊ{àýÚËTV?3cž§µYŽîhÃTä¸AÓò­éÔwW"Pº²:k3’0Kg’_©«˜·Ù…v¿äW;ou;^i=3!ü«_N¹‚G1—±É$õéœç>õìQª¥¥6¥7~ŬJÝÍæûãŒÃ󩣸‚9Œv\ð²nä7ÇL~µÖñ/•`)9 œÿ<ÕÛy-Âm@ž8¯F]¬Î9Anh¼7Wr<¬¶êÕ˜ $óúc‘ùU[†•b2ÆÀ‚HEïïRi¥.\%èV]ÙØ#è>½ëM¬lÒÍ®-à]Áñœ‘žõÓ~ÒJ|ŒÀ’Å%—Ì•˜…è¹À¥šH6ãëV56X¤ ™ÜxÚZ¼»mÅäpzäªãMØÞšsA©]ÀSX·ÚíÌK´ÛîØÆ=ª[›©.X¨`T*•Ò ` Æ +ÈÄV”ïÊìziÅ/x¥uuÉf16ãÓ稌@õ4 4LØ88ÁÇ4Ѝ¤“Û5ä»ÌïZ-|¨¢E|0n´Ì™Åæ•#¾ÑέI&Ø&&Ö^À`zÐõZìS²>ûñ)ÔõëKƆ_²¥Òa˜¨ª f=Àƒóa³êTÐU i·–ZT¶ËcçÈ!P¹ gŒ‘ŽHÇ9Ò¦};Ä£Ke-•Ä+”3Ý)Û! ‚S‚Ä8#ú:Ë\¹Ò¤…ãÅÜD¬Aàu`ùÜpCpÜ)ÉÆ WÈ_™XùÕ.…k/xŽånާ¨nšê&6ææFŒ*73àãiËHãŠç>+ë¶ñi6 ·˜óA B¤$¤3n,ØÉ Ilîã¥wÖþ%Ž.h|K ´³¤ªšt PÀ›w½ŽsÏÌ@ ž«Ê~%êzihV ”3¶U”s€:äýkôŽÈåBŒ±ÕâÔ¶ôÑî×äxøÌR«ˆT¡ªêrQø¬i2”¹2}™”¤‘ÆpJž gÿ׬-kÅ~µE†-k©Ò0DÛEP3¸‘ÓæÀ'°õ‡ÄÓ-É«ãiÉÉï\Ö¥QÌ­q.õ²Ç('鞀ÿ*ú^&¬tG~NZ´]¿¹ð^§£ùÍo=­öI „:7LœcÓ=*ð¦ƒ{iúg‰lÔ„>zÝJ#*@Ïýî9ÿõW9pÒ9ÑAÍ>8[;T»Bk¾Ÿ4la$šf«jjö;mÕV`ÿ1œàøiöÚƒ1 quüØÊHp?¯ä*¶ŸnÀì–Ó¯wJ²tè¦?<…pAP¸På]°ud“9eìÒµ>õáŒÉo¼°ùÇÅmér]Ø-ÍÌ‚~f ؃Á®nÕlâdŽçUp›7»­À {p½kJ}sJ¶²ƒû&ëÍÈuœHÅÏU+×Ó­z´*¨+ÉÛÈá«M·d„Õ.-gMˆÎÈTà÷‰ííß5…|ÑÁ¹]Õ€Êô«—ú“Þ;Œ( ºçoJ©8‰÷ÀƒÖ¹qR»6¥eeÙuª‚ùÄá0q–nµ5Ýí¼S°Ž@FyÛÎßj¡4‘É9–,úœ×‡ZJÍ(´îÆ´HÄ¥Èé°qŠ·nxîiÎ]ذuÊlŠ@É9þ•ÈÚ{dÑϼ*+–îv¡gÜ£ :Љ>fÇò¡•UK)éEÛH<¹,äÔmõFÕ¤¾o<_}©"Áóž'#ØÔ÷þ+Ô’Y.oµ×óe*Ìÿ*Ÿ–1à(…q\f½ãfiä·ÓØ…F+¼ójçîõ›¹^ää¹95úT2œ‹ Nx»wWüOÎSÇVÖSzùo>!Cck$–3¤—RŒï~V3Ü‘üMýy5åZÞ©y¨]É}wrÒLÝOeÏ`;Ÿ•[Ö/¤“vO¬ ùÌq¶†ïS‹Ä](­ÙøL,i«õe{éÃC~kîe”° Àà}*k»Ï9Š+ð;ŠÎže,qøWÏWªç#Ú¥O•\D„檸T'y²ýqÏ^+3Sb¤ícžÃkΫ¢¹ÙJíØ¡~Ê]XJaÆžñ\åsQ‚Ç<þ•åͽÙÞ¾ÔS%8Ç#ñ¤.êy?CŠ€°þsߥ5Èn)Y›AM—$Ž~´ x™F ¥$‘3ÆIÊŸ29ì 5ƒŸ¦)½‚÷þÏåR&ðC¨'H¡Kä!“å&®Éo6À–®ªIÏ#µisj„ß+³k4Ó ¼GŽ„÷«ö0j "â73øõª–sܪH’Ë!ùýÞ[ê?:а¹ºž`³JìØßEEê÷9jÝlZ‹íÙ¼Ÿî“üÎ*å®›žcû[JJä”cØ`qQeþêȪ]íWl#xî¼ØCÜ;XA ;œœÀf½*qM£†R•´-­œvz\‰-›M¹†Ðà3t÷úV|¢öBnMšDˆ‡àc“ž‚µ¯ Ãi¾[‰¤rß$wUdíO½ÔwJöîÚê B²ß?¯SÛ½uUJß#9/™“s4qæYÝS$œtüe\^MwÃ`(þ\þ½jË dnŽÙ[ÓqéT®¢¹ —Ž%n7 çåÕR’Üí¦ãŒ¹v˜Ý’JþízÕ9¡Æ £nêr0?ZЪÅwLìGg ¨dÓ¬| |Û†MyÕ ÛÕÑ”R)G”TF'’}iÙ›j‘ÙzT¢Æà1çBئËnÊÉ*œ‘"¹ÚšzšÞ#$>Ò(¨Àfäþy«‚ÞÝ׿cÁà¨À#üh¸‚î@ÂòYéTéÊ×’Ø÷·¾]ØÉü©¬ZBCç‚uè–LîÉ'¡=*ðÕãx‡–Ä’8ï_¡*ð—SãC º¢|¹fëŠæõ'üàZs!}‘­¼[¹ÇRsê?Ô¹w¹Ì^oÌGLÖ/‰-åÒ _¿t”áÇθqu‹gV6i3ð¼s´[\m8Ì‹‚yôíùš®÷‹ž5cTÕ/§´6âbªÜ1Hô'Ò±ÂÆ¾ xgË/wSÖ„[Ž¥ó{8#õªwmÓü€’O@)ÑÚÉpùÎyÍiG v°oVõîjgUk¡mÆ›ÐÅ’ÖàðƒïTn$„ ‚:ŠÚ–Þô–šD<œ“T±ïµöÂLŽÇ„I?†+–­="µ:)ÔŽí™Äps’sÇ¥‰ëæjÅÞ•ui)Št9›‚*¶Æš„Ÿ¯Èá8•Ó#F|=})ß|’NxÆ9aÏ–‡Ù…4©¿P:TŒUÂä.y= 9c˜¾À¼ú)¦]à(Eíœ%;íh¤`!Áç÷b©%}BÌ¿Ÿ¦²n–)Ù»*ÊŸº-À §Ne,GãM·Äˆ¤Jp;*SHÄV×°ÙÆ.MèXºS¾EÙÞ'½Zµ‚ßr´2Êå}2Ga)b·Œî殡;WQžÕÛN*É£Žr“V&‚Ú[‚ÛX&Ñü@ÖžŸj„"ÞßÊ ° "m„óÀãš­bC‘2Èí¸áÃGÊ´ u‚u“§¿¦?ÌW§F0M5$Ú°·º}™³ýÍ»—WóÄY³z‘Ü`þ5Bô<â$‚EÞ¹H{ÖûO ÄU˜nrŽqÀÚ¨ÿÐGäk6ç3ÊdÁŒJè­Irèg ¾c«ã‘U®-VMÎÌf?ÄÇq€l^B|¿¬Ã(„,Š£Þ¼Ê´ùNØK˜¨l®Òä¢($ôûØôÍU’H¼ÂWnqךҗ| B›Ê0,8ŽÙúVs¢™ò!ÙÏBk–j)èo >¤Är üÙÈ9Áô5ض6íŸ\š¹t¨TlƒP šC´së\òŠLÖ-ÛBŒÑÉî€dŒ(Æ?Æ¢0ÆAvo—8QúV‡—±Â'®ª—“+…œ³žxǽsÊ jã%{ÍIJBóUíu »Y·¬ÌxÆ qZOldç¥SžÍCÁ úIÆ¢Õhx©Å«2#yq,†æâîPÙáD„~b¢•$½V¼—|ÞRŸÎHjÌM*|Àƒƒ÷ñ¥W¸Õ^ÇFžm†éBrxR9ÿ>ÕŒ­Éï3H^êÈÈžyµµ" €ä`r~µ¥£xz{ø\ Fã"E\íäTþÑÖô)Àÿhâ½+Á¶z]¬fas†hÉ/ì1ßô­pˆ’”Þ†x¼_°¢y»ønÁFGRkJo_év‰yxNF1í^¹.£_]Ísslf•Ж_Np8>þÔæÐ¬um)­%‹8r0Ã/gÞ½˜dÔ⛾½.Y«v²<®;O ]Ƕ{vVÚxb0}°:Ô¾×ô-"æbÖËLL.ðáÜ€=? Õñ7ÃÛ»yZ[¼‰è+‹ÕôËÝ.uŽò"'g|z× o…•ÜVžGeK snlêö>ñlæh,ŒØ•@Ïáõ5ÏøëÃÚZLïomàà¨ã8ã¥nø.{5¼qrÁÝ‘V<~–f&h“ƒÈÏQYÕ£N¾Ôi]šS«*5Ôv<¥ì¥BB¦GlS(pãµ-¸Y±àž*+›xÝpÊN}¹¯—ž'¸ª¦fŧK0ÆlÕ˜4Ðy‰ÀëO]>U8[‰ôÍYŒ4csU P]:’{0Ktv¯ò¢5Xßvüç±§§b6à{â®Yéñ-*†lwé]1¦Ü´0”ãaÖlA8úUÀíUSMvL² œü¤Vcˆ9 ã¹®¨&ô0Ÿ+{’[\Inã“´žBÖœ—zƒ¢ZØLËœ ‘Q[YE´\šÓÓü¸¥Ë¶|& îaƒby®úTäÝ›Ðå©%г ìZu‰¢·GfÃÀÈÃgà}y¬ë‹Û‰Ü³JÃhÚqZ“YÚÂu·HñÀ°Éàñì?:Ê•w³4K•'Ž+ª«’IS³w3¦•Bó³¸í±Ê©Ï¹S1¨fÏCW¯cPÙl ¨Tªb¼Ú‰ßS®ž‘ žáP äqš£<ŠÌjåÕ”R©˜†, íç­Q˜Jà7ÙÇŽy®:ŽOCªšC n`™QLx¾l¡õ ·“+´Œ‘œgîýj'Ià˜1SËâ°i£XÙ‡–n“ëJåwghñÇ­#1UÞüàô#­iiºÖ®·Ãå¬1Ò·™¸(’qÿê§¹»GV)ÉE]šk¨£œ‰qøâ“í+´üÀûŠÍyâÏ.ãU&œrà ú×_Ö¥ÔæTMK«ûX˜’íŒÕ]Jö1g„Kã=AïY’O¼d¿#Ö«Í+¨ÛæìNk–¦)롼h$Öº›Úf§whBÃ&8Æ;víZÚ'Šïå¼H¾ÚÇ ÐÜ~?s×J‘~ê@N1‘Q ™a›Î…ÈaÞ¶§‹+k¡œðÑîg·ñ­Õº˜d|(äƒÅS½øŽ÷w"k·;‘¤±ðp #ê2OçZ‰¯¥ ÌŒךV»‘Îd “êkÖy´§˱ç,º–§eªüKÔ¤BZðîþ%8ëúõ«œÔ5;ÝH©»0îãß×ò¨,šÞâæ8¥ƒ8à÷­[m+N[Òg•ÌD1o³€è¬;·<O?ZÊU+â·–†Ñ¥F†ÈƒJK›wóš&@eŠž=ùíSø¬ÎÂ$$•òÃcÜ÷­tÑ´™íÚú×QŽâ5ä<.gß fëšÄmé â$ÙñŒõ­çOÙáÜ[ßS(ÍNªiä–¾o;y5WìÆG(§§¥Mw¬lVŽ„ç– Òª5ìÄÜ£H^§Þ¼IÊÏJ vÖl ž¸ëKm ÏÊç­C—röcž§vŸÈXííJ°;·B}iF)Êö)¹%©<äÀtõ5` *5ºUÛpÀúéVRtÞÆq]1ƒ’Ðç“¶£dv åOJ½gf±0|û÷¨ã‚ðZVz*ò4…7)8ë]Té$Ì'6Ðåxãq•«ñ¼I#1ÈÀE,N}…R‚âÜmhs†ù€Á­1sw «lT1,.&`¨¸²–õÁížHõ®êvJíœò¼ºÏv$ ¢ÈC\² Ï@#“šÈk÷˜“o*„V;›Ë'?@qƧÔ.ÑVIÕ•GTÉÉéÍPšê"vï‚;.3ùÖUj{Ö¹¥8ÙlUÔŸûE€iX?.Î3PÅ,q¹…]2@±É¼TƒŠŒCw…û ó\½ëQZXaº~H¤8ÿcüê´º*÷3 –Ævð\~\Ô÷+ òIÀÍ$ ’¡}ÊÇ m¼ãñ¨µÝ®i}.UM<”$õÚ?ýj³-­¬Vb y™ä•>l&ݧ<‚{ñüêòÜØ\‰w¦¨‘J,&åç O8ϰã©:ún‹k¥,^/”DÖiÛµá˺ó“µy=åZÓé=6ëåægR³[ÿÃùö—e§ÂËq{o ÂA¸ŸÃ¿å[V:f±âíúg‡ìVÖØÇ¾GhÊï ð¿(=Nø­èt_Þ7ü#ºd6Ï-ˆÔm2>ìŽçgדڠoZü>Ð/4?W‘µW—€DÜgq#çaŒc8ëÉÆ+¡R¥A{ïÜ]W_-L=¥J¶å^÷gÓî<Ôܸ9ž}é ÄÿúÍW-ž¹ü©nÍ_.ª4{ŠËbG?uZ ƒÉªÊÒ„¡4«3¨Ál~µ\é‡%‰¢F~AVüô%‡#¥S¨íúSÖ@ÞÁ«ŒÔDÑjÄv‘ò“Í\·Ý$é ùó•Uv8çÓšÍ30{óVRFù^7 Ž„pkjsQw2”t-­ÚÅ8œpªIæ®é3ÜËó®Š#ep¤Ž=ë-"\äU»)Ú%s·;TdâºéÍ©jsÎZCLÒ-£yì¼E-£ùÖ)ˆ Ï¡ã™q>¢×&Ýu»{ˆO!œOáQO%Ìò<‚"¡x+ŽžÆ™må†kœTäãh©YM¤•¾ñÆ2޲w-C§Aÿ¤.𱯠c¯·JÔµƒÃ‘ªíI׿)þ•‘ ú}¤¦TrIíSÍYµÔbºmª¸8ÏÌ+JR„^ÊäTŒß{RÇ¥ÊÀ[LêRññ§Ee²@ཎµTH—þLj‘Fr:’s]Q©õF2]I§²†1¶&ù©‘ÙK¿*Æ¢{™^Q)àûª:ëV­§Žåóqxˆ7|¹sT¹'- |ÉjZ‚Ý­áÜÀJC)8©’ÒXáó®'Š5þ\ñø÷©ìí,n$Œrv}ð ½ëB}3Oueò"`êM¤“¸Éúƒÿê®Út[WG,ªk©—i ­ÀK›ü´g‚eUPsŽsÛñ§ÜêÚnø{€™Æ¥ñï¸ñŸ¡¥ž Z=-77?ê#ЬHÜAH?w(r©m>â’‹×RµÅåÁ‹zÙ*…< ãøf¨´³Ý‚¯61Ø çÚ´/¡-â³ymÀÁÎkŽ£“–¬Þ¬$±KŒìÆ“ŒþÞc}æ®H—7pþõ¾\çüóQ´_8^™îEc*nú)ÙjA%£Ý.Q†^F HOÖ¥´µÜÆ-Û¶n `‡äpG½Nºu”6R]ßÞ¯’Þ #66Œ œ÷ã5RÚyâ“tx ‚ ÈÏáïïSÊ¢ÓcÕÆÆþŸ¥èM`$Ô.>ÊÑ+1—ù¸s¹<ŽÃɬÿø¯OÕÒ+Jû=¥ºà´¤´ŽØœç ¤ä…©'>•Ž¥äÛ9{ebFÈè“{|™ ªšÓˆJŸ,tDÒ¡ûÎg©1ñºdë&—pê|¼9lÄä:cëžyª•ý”ñ µB »ä³c–öúUõ vf^zýà:Ô7WÉrTGn…;3–ç©÷¯"¦%Ú×¹éB‚޶#¢Š+Ï7¨¹üéI#¢æ–ŠL¿÷çOYq“Å6‘†Hüé­Àî6ž*Xnàû«p7À¦«yrN•¯;R-Ѧo n£3`ŸJ²˜i€çÓŠÈI‹Aå\Sõ­XÜ–­tÒŸ3ÔÆq²6ç±¶K8^î™K?=Njðǫ̃óÆŒÁycÙG©¦Ã¨"Û “¿'iYmŸf‘˜!mÛGBkÐr£'ª8ÔjÅnKýŸ[ÕÙnFG?Kihžb®Lã¥P¹¼Šâ@Êí´ºO®Úܳòùʻѓ^ŸZ˜Ê7Ø$§mËR(Q÷AÌijÄIwçC$ªyïÒ´`ò§‰H }p;ÖPç÷ŠÄzеawdÅ ©@Osšê¥5³0’lØÒÝR'2w,X8­X/UdBn"Ž&V*"`Xð$’çž¼×:pd!‡h#r4y?€éÚµm¥žx×yP©÷R1ùõ¯BEðœu Ö¢H$¸ Ð\ç, 8ÝÿwªRDDÌŸiBÄnÆï˜Ÿ æ¶à¶³–xâ'Ïy•Ä›‘ÙPªîAÉàŠ¨› 8LÆœî;6ƒþýj©ÓŒØ¢ÝŠŶ@óXÉ"àé“ïQê.u9ÃÍk!V8£UÊäÉ'''=kQŠyeÉÈÇ­Aº@ߺÎâiILr„êz©þ•œà¹R¹p–º#=#…qýš|ÚtP¤rFIs.ÙXãîöÀïГW¦ŽÂâÜ%¥Œâé¤ FÌQqÀ`±çÓ·|ñÙžÔ\Œ‡á”€qõïŸéSìÒÐ|ÍF±Æ=¢"²aî]2ëŸLð ä{ûòj¬ºfž°’’Fç l…·9bpÇ_åÓžkNúÓS²µW0ŒLÙYIÝ»¹œqÇÒ«_hÚ®ŸžöÂdVzß œpHëQ:RÖËÔÒ5VbßDtèd‚þÆq!*ÈŒûp¸ÏLzsÛŸZÎ{ý FŠKû –5„£%¶,3É$œýN9¹*íç>09,•bê æû(yP >Äû§Ò¼œDÜYßAs1ž#Ô4;©Ïö&›,tf;àÕ°9Î{VNw7Ê¡FÂæ¤ŽÒá¤(Wi?Þäþ½fZíi~gÇ©zÞ(ãQ³žrMvBnHÆqŠe™”dŒ|܆ŒÅ† :À^ÅjÝŒÒârWéÅ\Ó$uÜ$ÁÉ⪂Xá¾çó¨î/-âR7/™È*dôÍvM9;¶a EX­2Ê’›©Æ·5Õº²r3ìiÎf¹yj]û\àR5Ž®Ùd¶n;°ÿ<׋}.oEnfMDûO=ÇVÎJãÔUË› »– 1UÚ0Aì*œi¶ÑF« !@O– ë×Þ¹åFwÐÛž+C0Ës*$rܱHó²< ãŸ~‚’FP0MiIc ˆÇ¿½ؤM½c# ÇùÐèɽJURFd1çÉpå&Q,ÎÜa@\ç§©YÙOwt‹ufÅdœq!!Hï’>=ëtZ%ÕÑyT“ÉoÞܹéõ>”Éî<9m“m=ÄŠ2È®¾[7(`NG_›…eRŠVæz~e¤­î¡öóx—Å^"’ÓÂ0&Ÿhß¹ûEœ&–¡'n9$’NsYv7¾Öf±Ó5اòÎß:Æà”oëøSÓXÖt†c™Ãäå©ûÈ1ü'¸={Ô1¤|{¥FmÀððqX¶šZ»ßÑ#KÙÙmÛõ¹ÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ü!KcK‰ídhÈÎ˸wç}jý¼QÁ°À &EÜ¿½ÝåŽÀŒ˜zþ”Ë$·VÞ¬Øb2# ~=óгkc &y•‚¶9ÏaÀÇë_c vg9û¤¶Ð*7g=XVæi<ò*ÛÆdv`d±'€+;¤Ü­ɳ  ¥_³×LF9Ü:6UƒŸ— ç×ü+С(FWgXÎjÇQ®Ácœž:Œ÷éŸé] †óP‰<ÅO˜|ÏÐsÞ¼Î×\…Çãæä†ÀÛÀþ¿…t^ñ i¨Ež{ŽKc½{˜d^IA(É'=ÿÛ×#Ž1Þ½Ëň¹°Í¥=Ì.ªRè¿Ë dBÜsËœðIï×ϼa¤iöqÜçK Þ+³À«–RHÁÏw^9®xMÍV¦“÷O0»´6𵸌º0ÞÅŽÐ3Ï?JÞÅÛx:OéÚ¸½I/ïƒ;ÝÍånØ›‹á#û¬QFK"’z>­àkqáé¤YÝ[©`6°8ä/û@ç3´÷â´´mkÂËð,øcSÑõ1â¤ÕVar®†Ñm¶:¼gve2n*y 7±jè¦ÒØæº[•ì~ø“]³mKÂ÷v:¤ºKj´Ö·jœŠm™+žH£ÞŒ¼¡C’ s¶O¤B+­@“åU¶¶á¸)=¸#¶p º{H–3u* NÜ ·÷»ãþuÔü8øY¢øçÃþ ñf¡ñÓÃö¾Ò$ºº¹¿ŒHgˆX-âŽ7ó ›Ùv#ÿ.ê1}ª9»Hå;Œ¯+9'ç|6Xã#ž¹çüsJâ[—·½Œ«DY0Ì2¤pACœƒÍv¾øO¥ëOˆuO|DÑô‰´Mu-2ÎK¨åþÜhãkh]_+.×iQ‰XØ…Ç#”Ôô­ 4Û >ÊTÔŠ0ÔåÌLæY6…\g"?-O8Ê“ŽF!$´Am «›ˆmî‹Ëƒi‘P¨Áôï×®{c'||/ñì?í>'&-ƇvÆ©Úþö8îTdÛÈÊ1‚=´“•elŒ05 k™%X¢S²Ö2% ƒåÜHrp3€ÇðSø<2þƒÄW§M[´‹¯d ‚¾[Kå°¹O—~7`ðzcgÓ©³á M2-uuHu;»±$p^ÆÉ‰9n±äíFQÀ$äí ׊öü+ðD~0í­äSÃf[ÝDÉ=ƒ|E*'œ|ç#õ\m¯(Ò¼sy¥Ûx^’¿á(GºÕšÒ[‡`¬ªØo›v1·b°,H¯n½¹±Ó¼Í1$šê;øePžK}ÑOœìpܸlÕIÈÎUbÔ=Nü=8Æ<Ó<_öÓñ ß„|ö )î-Ì÷–Çäu!ËU°ß:`‘Ô`㜒–þg´’ÜV4a&YaƒŒdöç‘ß¾Äý£>|@øÍá­6ßÁöqÅm²ÞIq*‰o1›«Ãä‘ÁfU8¿ `¯‹Ÿ uûüjøÚ„O©¢iï» »@\_Ã]¯‡ü24=#_ñ¹qq%­”+—§¼¥ÚææC¾{¶¶*Å刕ݶ’ ŽrGÏVÄJ´¹ÞîìªXg9sËóüsÇü9ð¾-KÅÞ!ñ z¤pÛÈÑi-{pÁåµIžDV' íºc–“<>îÃÿ5ÝkNøp¶7–¨­o"±0 d’9Cp§÷q•lÙ#8,E¯xoÅ6ºL^3Ö¬›O´Mw….‚[«A‡MŠ@’C‘)\ðÅ~Sëƒðò]UüQ¨øŠÛT·_2ÆT2y®¢D)“ó&C‡~™>Ø<ä¼gJWìvP¥ìd’[ê^ø§¯ÚèzTv•ròÉ1Ä‘¥ÀRKð1µ°2N#=€àùGˆ<}¥G¤\Á&©æZXúF´›! 0ÆwpNAP “Ôô:ü¥]ø¯û:Hì¤kiÀÔL’ŒíÜ<Â?ÎTÉlŒ ð+毋¾1ëú>Žâ;¶´øDUvlm vô 3ò$sŒŸ{‡2Na8É«SOWú'ß¡åãñw®Üe¯bŸÆŸŠš¿Ä oΚVŠÊÓ)§YŒm„erx¹Ø¹cÉücª]ȪÌ_<ÕíZñÉ/Ö¹ýJéŽryö¯ÓjºXzj5h­9hBR|ÒÜÁ—T·Ø¨„FÏõ>ýÿÎ*[Ÿ+Àm`µ·sê§{pz’}ûb¦ŸÃ7Ú…ìÿ`´Š8б†áY‡A×?_zË×tðî¢l5y»@RÆO@Ùéô÷¯¬ñãÌÖÏn£QÚúM¨D“¸äc±R‹Ëˆ¾I—ŒàЧÎûo²º(- o1“'Œútâ—ÏbêÍ6âPwû på\‘«.mYÐé+hk[ÒÄ Çñ­++«ˆäIc~T‚3XV'ç Ž†¶´ÕÜçò¯B„æúœ5 ‘ë¿~(OŽ+×ìà©<7½zç…µ3íÖž%mÛR‚ ¨§¸Òî0Þ„%¼©ù¶18`¬»€îBãæTàOÍÛŒW¤ü=º¿‚xVÖö@Á1ù„ƒÓøzWÖS<Óð¸•Í÷§Üùl]B§µ¦ìÏ©¿g?‰^ðÇ8âÓ[Ä:^›­êßg³_M-´¶¶2ÊÛ£¶Bìï†ÁPìs„=9l¿Š> ð_Ž>.^G¡ê:ä—w÷²­ö¥«¬÷’HÁ¤’cåF‘‚‚Góo˜ÊC€r?gßøßâÄ›o|;º6š•äo/îUÙÈ ÀsžÙóAìMt~²“ÂÞ)½ð'Çõ¡ªG­Ù­í²\F"šÜùŸi.ÇvX,# l3vIÁü«9˪å8·BvilüžÇm*þÞŒek#Ðo5];ö|ð³ü)ÖtŸxáµ+(&ºñpÜ5Ý”h÷aÈËóör¨'B±‰„DygŠìfžþåìF Æ !`ØÇ`ÙÆOÍÔŽÝ«³ñ4ÿ /íHø`Ú‚jêS}³R¾òæ}ZÚR›¶dnÌT Õ›Œ©5SãWŒ¼;¬xû\ñO†<™RûT‘à€Ç‘å†Ù’qœºN;W›4¯x³©¸¸é±ÈÙÙi÷¿g‰® I®èƒìFìsžyéŽ;ô®OÆzL†ñïm¥I'Ìç*óÎìá9õéàóŽ•AÜÂQRVGá˜|8š•´¾2Ðí›^—q4ˆ¸/þ®HÙ˜®PÊpùÓ“RøËJðÖ©â_[ðUˆÓ´›NâM7L–c<¶V†RcÝW’hϰâ´5ïëKÏ6¢JÍÁ¶¬[iR1ƒÔö8Ï\ŠÂ2‰cx%W`âQòõù1œ8ÈÏQÒ´ŒÛ[™Y¥©Ÿm¦¨‘µ „‰b_˜1Æü¾‡¹äúô®ÂçÃþ“¶[tÛy."‰Þ-JÚS¶ê&”M+©9 0NYNíÃÔ¬!’îÙ=½Ã(ŽseL§wR@ô$==Áö6Íðú-"Òek›E’ $2«ÆÄ³`drÎzûÑRM{Ñ.wÐâ5&¾§:jOu”âî(íÏÞp] t=yuåìü9©^mš(™óò(a´1õñÉ^:õõí7ÀóizaÔ^0E°’C±pȽ·ÎTþ§®lzV±clÙÚÂEÛù†?+Ì)!FŒ¶6‚܃Ӟ+&÷f.3Ü«£üL×¾|Õb¿Ð­¥Ÿ‰,#77vá¾ÏùF#fUx²±ïÈÞªeT¡/éšäº ª&£¥[Íö->É;¹Þ@Œí8€IÉãשíåž;‹SÔ<847¶–kx®•µ~ÐYa9`­Gn:q^ëøg_ð^i¦éò}† c÷•&F×| Žq–Î~•ß /´ÃF³Úöv‡\1 H-ìVø_¯ÙÚjqZOm ŽLKò7#9(ë•$úmà3=«Õ®¬nîï“Å6þ&‹Í6ñ[Þ@[q$"’ c´Ÿº§èØÂ×—<þЬ ¸Q «¯‘îlllñÆTòqÈèG5gÂ?í-u'Žæü˜î”Èù_,8dtÝòçtŒ ò9áÅa¡9Þ1;¨Ö©r³Ðõ­  ^Øxÿ]ñ‰Ò”)¸³Š}<Êu+}ØÝ9WË£ÀˆÃ“…lcø{^ð‰/üAñJÖgº½mF-"hu›u–eµ@$Ùq*HKùA×8XùE2nzÛâ÷/tí_Mñ[›Ëx1 C–ŽƒdÝÈpFï›å@£Ž·ücèW·züq[jÛ•¢Ž(cîX®Û¹Ý)N S†ÏP|úÔb®š²½—¡ÝîFîý}¿2/è±ë>(·ø«¯xž[íJÒÖßÏ·–üEGœ!‰nÜRÉ$(©´¯ˆWþµÔll-ôø-5–ÙwYFv·\.Ll繯øN´?Üj3Yé®ÂùØ}¶1",VPA*6žAÎs¸‚95Äkž.¹ð‘¼†M<^Á,¶Öw‘‡D’a„9Œe˜WäŒÊœtRÁTÄÎ4b®äÒK挩ciQž²åZë¿OÕ™Ê|f{_x¶ûCµ¾µº’9–kÛ¨ïIÙ4FM‹»nTnùÈ ãW?m’B~óŸïO5èÿ>ÇnÖSiÚ͵ɻ±YïÚhÜ[Î]Á‰Œd¨låxeó°MywŠ.ÄŽr2sŒûWíøl5¿)§‡§´V¾o«ùî|½7*¸¹T}r—÷l¬yëXšàÛŽœñZš¨Ý&sX—ÈHãµx8™ÊîÇÐQŠhµ?Š4ÝU¸:@¢ ˜ù…Ÿ,JŽrsÀ…rÓ^Éyp÷·ù•ää’Ýý{ÕÈáÓ bñJmu[xân®Äúó´J£2Kk+ÛM×F*ÈG Ž ×ˆ­:¶»ÓucÔ§NöZ÷iŠ.òHNH_onr~´csôê+˜¦î[´—o+ZÚ|Á/ùV³í;YºV¥¤øï]øz–W9«Dé´ý@)<^ð·TŽä¹ |·ÇõüëÈlîJt=zñ]¯ÃT[JÊÒ¹²Ww^OzúL³Õx¦ÏAÊ‹±ô§Ãø¿á‹"ø‰ð߯ºæ‡}IÒèÚ‹G$ºíd<6@8p¸ÆäR>`¤wñxŽˆþ3dñ‡Å[”x´§6úþ¡$×’Æ1y¬ÈñàíbİU¼Ã>#v’(ÃáKÁyâ½ÃÚ…Å•…ñX¬§Gˆ¢-Ì!Úá°ã# AË+v Ù\i•ÃJè-V’ùìýz}Ç•–V”j<=W§OÔ×𥕅‡‰¯mçÕÒæm4VÒÛDÙ•ÀÀÚ\+¢“Îvœ…#€Û…{ÍJóI#Oò£Át æ,· ‚ÀŒ^:{U/ ݳj0Ý›ˆD.Â=£æÁ-Œô¾ßÖº‹{K½/Y‰­­"¼P€†Q’1†Èϵ~m+-FO™Z|5â)žc4Ь—6ÎKÚÚÂ#€cýàä£9ÀärN{5 ™|;%æwkö˜¥O4îȨ£—^ØùTqÇ<Ö²5˽â9µIlÞ]ÅB`±Èfúœþþ•_N¼’ÎXÚê £Ìd*›7q½xà®FNp eËÍШԔUž¬5嵸·[ JÆýd;¤ $ –Ï–$>K˜vä‘\^áûá'ÛDe¤ówe—sc$œ9ãð®Þ+-V?&ú ϵÆì>wFáJã=+Ž€g˜ô¦ÚiÛ¨4µÕcµ2("ÞåÙ‚±` 1=p»ˆÇ9&¦ÿ„¢H¼¨›=Ú(gvÕTڪĀsò°Æ:ýA36ìT¹e5-t/Äf_^j‹`Úˆ6ïzø_-¹ØÅ‚–›ËV?Ý,Ms_ ~&øwUñßôýëFÕt¦tÔ-¤•4Ë(œ¤Œ$8;Ž>\Œ…®“ÄZ%Ö˜'ŽQ­Œß¾‘\±Aƒ…?€?Zà¾-é¾0ðŠ´ÿzt[ÛétÍBÒyYæÚáLlËAr€–²C*2§¶­©}^×OUëm cN Ò{£Ó¼aev¾/M6Þ)’-HI§>b8-òö`r«Éç‡â-K(YÉis ÆŒñè¯öÁÀ$qÐqÇ®k×þ?~9ø|[x¦iméN™~Ú·—wHG—å’®dVvÁFì0ìw>ñׯŠÔ.ìnGÚÖ%ô ÒGp8‘€³ž9Ç)Ë’÷µ´gT)ÚWkG±Ãé-|rš±ÑaÔí,Ú<é÷vàï Ćvþù”²ã!ˆãu{Ä?xÅúbø·Nµ²Žêá#o& XØZÆ~FÂ_݆ xä‘È\xÇlüiá¿.¿ãÏζ‘ ”IyhSz•`¹ˆm B¤pAÁ¬þ1i>6Òl’ÇJHm%¼‚ÊêâÐKedhу…IW.Hkm °ÇZŒ«´»3±Ô§F“oc ÄzoŽ¦Ô¯ŒæÒ.¦”˜³têG—{€H8ñŽp87¶ºÆ´i5€×ïìá‰-á0™ÛC¡Tù˜PÀ`n'ËC€T »eb—š‘ºÑ.nÆ™cG»QÌ›°ì#RãåËc?xí«ë÷òxcT‹PÐüBlmu­=¢ûD!ŠÀ ‰ Æ…]¡K.7F –ß‚ÄUÁâ!RüççûÈ9[¼ñXÜ[jwK F"™Õ#r7&“Ž{G¡=kÌõåÙ‹uâ½Ǻ”ð§ötä¢ÇµÉ|Ù'?y³Á÷Æyë^s¬È`éÖ¿kÅN2¤­Ù$Û»9Ew7_jËž&a†\Vµú>î•I‡%s_9Y^Zžý=ÆËͺ$rÇ"¤ŠUÆŽÇ‘’ëÍ83É÷Øœ œàR×ÍÝ6{-…àfŠ($EbNàqŠÔÓá2Z È=+2¬XÝ´qù{Ž3Ó5¶Q„½â&›FŒGdAúWUàA(ÔÁFpÃÞ¹B¿jVl²ç+¦ðåô67±ÜÊÒVçË@Üwã"½¬”k)3ÎÅ.h4{„¤Ž+˜Ve6ÐFÞœóô¯ <"þ—áݼšA7Âì‰õ(Ø™Nâ @vT 1Ðå·àí8øgXÓ/• åTª•Áú~•í?õK›¯Xh“Þ¥´”ég=Ì“ìŽ5rHÄg…89íÖ½ìû S0ȪF‹Ö6—­µ‡â|½žÃœÖOKšþ ðŽ¤©-ä«%Ó m’EÜ[6àîóÓƒ[âÒòÑ~Ùqv È›Èʬä°gªã>ýÅhxóÃV~×îô+ÅVÌZMÔ–ðjZNá Á_jɘŠ0äQ‘Ô•œ÷㚃FÓoõK1~ö„Ĉñ)ˆ¹Üç$ç®è8Ç©¬·ño‡uHç±Ñ|¹NžïïEe“Œp cŠá,õÙÙ ·÷QÇ*[‘Ÿ-ê9㿯ÈÔ¼²šëBÓní]ß#'˜n×r`n`ÌG+±¹IêsXò¦®÷½ß™¿´—Ã÷øÉ©üV½ñÃÝcÄÚ}Ž™§<ãSŒíþŒc]A@bŠ~-T'í¯2×c—Á^4Ö<—vòÊš„–m{$8O-HMÊP¶Õ;AÀÉãŒ`qqèÆÃöŒºŠ:$ûw‡Ìú‹GrD7WÍ´I³%]Ђ什3šë’ÞÒM:8àÑ™®#ógX¨fp[ip3Ó’ç¯Ñ*0§ðõIœXÇR¥5ìtº}†“gá«vŸSK˜®æýý¥Œ¯&HÝP<A+ùf¬x’ 4Ù\A¤§°Þd³ƒR`fC·.­·r•$g vÉÒôKϼS4)v‘ìVaò‡Âª I žAöâº)¼7ÒRÊïR‰åa¼HYþ@!›<ñŒžø¬®¢È¦¥n<ºXùwâo‡5m+\Ô^HÙ¢2<±)RX®Ç¹®.]5ç²ó$Îrr¤v¯¤¾ XXß%ÄE#¹–(‚î0H‹jýÌ “Â…'Æ Æ+ÁÚ%ArˆATe±ÉÎ ~µ’c©æ˜ÊÏš>ë¿WmÏ6õ)I¦Ž*úÏË$cðô¬Û‹M¤ñ]=ÝÅäÎ-mšC—p£î¨ä“íÖ²f€ïæGjªôZ–‡¥JªgšŠZ(¯>„(¢Š(µ8`ëÉâŠ[0rsÞªð›\œ3“]Ÿma›Õ…¤&]r:bº)Ÿ(==+ßÁ¤Ò<¼CÔîü fÜ#6NìzãŠ÷ÿƒ_ <_¨hQøÖXt{=E#—V™`YAVò¼Â0d#AÎ9Çùìáà›üMÑ|$Ð]<—Ñ¥×Ø`ófXr Œ‰‘¹‚@ÈéÉkôã.µ}z'Â?ø^[Oø1¦ƒ§]8fŸææ˜Æ6ïvûΛAã§C§gë)ÁG M^¥TÖ½#k7øé÷ôleNT‚23‘=Ï_àÿ·x·L[=A%Ô­ï-åeÉÀÀ·ÈI c ä©S‘Y¹¸GÈÓ ¥V¯#êpwÚÊ[_Mv!ò‘HÇ“—$ç“ÉïW.£Ò£¸×u7´6·m¶R|œLló¸ãÐcõú‹y¨ÍÌÓ$lÓHB?R«Žßž¥pÇ™½Mœ!Ëc”ñM›Gá=\Ú3*­¤Ž¿.!Në Ï`}ëÅu+Õµ³°îMò607|òO_J÷?ϧ§†o`ºd úlêco˜î1¶zç=8Á#5á:ü\@%°Úð£íÜ­1Óôò5ú?ÊOU/æýãc)Â5Ò±KÚ̖ڈ² G»&¸¸…D<6ydHàöªRéúr]ÿbÚjK{sö‘Én€A(ÛÁÉàdœcÞªj í#“žµ_O¾¼ÓoVîÎM’)á™0E{Ò¨ãQ'óô¦œ[G™‘šZ`“g˜ÎŠç*1Él‰$mÏ•ÝxN=™/•™0’FbY 2rz|Æ$û sî1x_Jñ `fš+ÙA¸7S9?åQ•`ºrøÛ»$žRñ¿´{(ôýUH.$xÞId‚ñ 6C³#nA{<äà^5ѦùnÙ½L<¥.U§‘âph„jiŽñN²†±»ŽfÊÑ×%AÜWjñÐ/Nµ{FðÖ•,«nšp´²ˆ2Ï0,ΡÆQã‰ù€¸Áä‚9É>qgá«S ØÚÉnë(_&w!§$363œ´ÿ7(Á8Ì:Õ½üö­§¦’’­žçp-ö»8HÙ•ßb’Ëäw€Héng¡Ê°ó’»G›ê-ö‘zÉ •“ºYp¸=ˆ;HŽ?Ýë»ðOD}>çRÕõ ðYÉ-XÊbg`ÄýÅJá˜z‘…!€#~_ ßßÝ5²iqÂö‡â݃#$)L’‡ª°cØc5….-´{ønÀ›e•áÔa{61[®W31S÷Ó½€#, cu'Ï "ðô*ªMÔ´é|I¨êÚ¬ðÄÅãŽå‹üüû¶“·œðȯ9½ðW†¼%©I ºß=ÄѺ4±`+±PsŒüÀœ‘èqŽƒ>»u¢O£®Úº5“”µÄïx&/‚6Ü QÈ> ŠçüS¢ÚëVqêÈ¢5™J7–ÅF€¾ÿ(l“œO5Ì¥´;ªÂOVqvþ#Ó|?¥Caöuš[”Tqpb ë´¾§n^äÖ߆ü1áÙm„ó܉T\™"{2!Œ°Æ1¿’l½‰=M]Ñ|!a©ë˦‘q4±m ò‰‘I?)l¨8sózª«/ øN¼y4í&hg„"IÂ*íÚ¦RÄ…\p ¨ç=2&U#-|ϰ©Ò”"´V1>%K¤i¡L…íb12Ü}˜F\Mž0ØÀn3Œ‘¸çÍb³ÐŒE•òB³;´jîÍpÄs&F1œ…=€õ³øq£ø[R–êKŸê:…ÍÅÄ—ßl±”[¼eü±å3®× £ àà€03]ýòöH›H• pduò¤ µX°Á=zœŸÏÒ¡zvRFuª>dy=ÏÄ_´  épGgå§6Ñ#™x“œØôéP_èשkVÚ±k¢ÑÍr«;|äžA$äãƒÇ·jõ ·©ÞŽ—jh6¢\R£$ ­É'ièygžsü>ºn§ysý±o-»ÆŠ'–t*Ò“œ:§vNrO­mz1O—s4§9«˜~¾)¼‹NÖ´©ábhâgˆ> /ÌîàžsŸ¼GLŠ“Å~´±¼°¶u- $G€(“{· ŽB  öÇS’tö>¨ºYºZŒ»CöH8{Õ/뺣hg‚xÝ൹1m¡6ÓÎT²–ôÜyÆ0¢åkèÊ’ƒŽ»œŽºl£Ž{;KøÌ°¶ÙrWÑp:p}EeiÚLZäÇKžè£Vk×FXÓ¸çƒÈ=1Û©Æ+[QÓ>Ë¥C{©ÊÐK=»3#;+Žqƒ‚21ÜúVL:v»KmsµZÉšY.rª1ʰÈÁù@dòh‹”¥e¹DÜ4v9ÝgQÒ¼9ª}¯Q3ÜÇjW.*Iæ 8#‘íÔx.¥,—_iºbøRVE\¢±8û¼g· ¯Tøã-*úÅ´}"Xg¹bVòþ&œþéî:èAg“^dÈ÷-$QF>f<;Ÿþ½~›Âù]lÔª¬ç²ì—sį]TšK§SUä*o\`â£Gº–PÐÀÌ$ (U9'½v~ ðöþ¤Dñ•‹ŒÂãðäþë^ðvžŠºf•i6Ãæ’s †\8à‘ÎäóôhQ¡†–'.X+yîí±Ï,\eFŒy¦ú ”@pTõ©)§÷¬dc’NIÅ:¿>ê}QE 9ìh½‚×°WRE ËÖ„-!ÛgéBzè;;d©½|“¨À¯NøMxñkV¨#ÝñùWŸøSÀž(Ö>ÅdR7]Ë4¿*‘ëê öÏ…þ·ðÒ%Ö¡MrÄìrûq‘Þ¾»#Ãb'V3q²î|îo^•:m^ퟧ_ðM›ßj¿±ïÄÞêjo“Å£R¼´ÔͳYÅ”«dÙ’U,F ÎH+•Å×|¬éž¼[?¥œWŒŸg»’/³oçmòü̯—¸"°ÁáGP~cýž~8kÿ~$ÙøÛI’Y,¤F´×´È£W]GNmžÜ«¹hËml‚­µ¯¶>'x_à­ÿ‡ltí'Ä7o¢ëvé¨èšÍÝŠ´²YJ»áGV9V ¡-ÎÝÄg5ð\o’TË3™âÛ¼+¾dûJÊéþ‡§ÃùŒq™lh/Šš·Ë£G)ðþËI±´];RñmÜv÷‘æ9%ˆ´RöàmÃ-÷Dƒœé|Røc}áÛoè§Ûf’á[`ÂK˜£Øzã’uÚG¯SÅPÔ+–Æ;_1mmÔ3˜TƒnNáɱ9çƒÀÇÌëÎ/U©Ñ1q²gáý>ÿAÖ—ÂÒ)¶¸¶e³Ülœ`‚1•c§ŠÛoiW|IªjVzëy„ÛNèÈ_Ѐ ªŒðYŽNϬÃ}ª¼·º=ÌG”aÉ_Ÿø¤+N2Fwdõ¬­?PÕü¥K}—Q=µêKy8X„ˆB£*@=±‘Œ’­áQ¥Í«%ÇNIlŽë]°—CÓ…üñõu?¿yØŽ6‚OÜÉè3žNݵçÚí¤º„M{¥Ë¨µãJoôe)¿ûÁ³÷·À†ïÀvÞ7mGU·[¦¶2 T·»–”¡`…rw bqÔŒävˆšÊM46¯+­my4Q*¨# B“Ç«á¹Àçˆ9§y \­hgé—2øcQ‹Q¾¤ºk[<±“‹!ù˜(#g뜃œu#”ø«ñëQñZhÖ³ÄÒ[¯•rêFvT!$XüÃv[ð½¡|1Ó­£é±èÍk¦FÇY&òÉV OÝêI(3׸ÍG_¾{oì«=MÒ8䱯8'·~;“Ïz÷ò¬£œÖöt#{nú#ÍÅãc\Õý:šþ>ø‘¦è:|Z^—n“Gm0mÓD‹ç%8 dòxÅyŒ>'x¯ÄsIΪñÛ–ÎȦàI8Çn0^µ'‹uÕ»¸hí¦&$R€ç†=Ûž¹ãüšä/®”¨Æ=~«ƒÉ2ܦ”cJ)ÊÚÉîß]ö^‡õŠø—Í7¿N=ù+äÆ˜ 01ØS´`ÃΗp 6ü¡rX–Ûÿ³gµR¶A zsRé:¦É$µòö–dÞ9# ñù îŒÕõ.Q÷lwn¼­F[rU|øðÌÇ“Ž@¯cøyj–ÙÑÞ5­ÅùòJ>Öó¤ó?EÔž<C¿’Öú+ˆÛÀ‚;W¸|;ñ%®bs%ç±ÜÛ5¸b~ ¿9äa‰' ÇÅ´êWÈ‹ø$›ôz~m2òš±ÃfêS[¦Ï8”¨É4úDû¢–¾.×>ÌE,í±’O­[_]Kho%˜ §‚Iì=k2h¦ '±®¿ÁÚE爤 9;aXë]Ø*­S•«³ MWFײ(K¢¶ª`ŽH£ò£#ÆîzŸSï]o…¼á¯¤Z檡Ú7>ZÉ‚ŒvôkRÏŸaìÑ=NÑœVOŒMŠÚý™µ8’ä’ Ic‚7€q×€Hé_C ,]YE_ÏkžCÄTÄ¿gìû5ÇÄFL:dr¼¥€ß$Ci©lþ=+oGñ½œ‘ª‰‡îÆ8<šñÛy5ùÉVTö5» ê£¨ß‚=Euás:®~õŽZù}%è êëyËy×Óÿ²§‹5Ïiø{½CRÔ¼5ks>—k3<©˜ÊUŒs´Bêò%F';s‚Åþ× ÅJÜcŒñÚ½gÁ~.×<â;/øgS¹µ»²›z½µÃÄ]ÃÆ^6W ÊJ¶Ò V#<סetx‹%ž[½bûImþ^Œò0X¹å”j­ºù¦~‡è? t|7}WÂL÷&4ò"–)(B«nÙ´dm9Èþ÷µx—‹þ4z¢Æ¶SÝÞ5ØK<ÎJž å°T /až˜¿@gïüøõû(è9ø=¤ÛYXŦ‹qáûhÍÍÖŸsqŒ¡Kb0ÅB¸d}¥HÇË?tuðmæ¡§jÓ#Ç+ù–Ís±®\|‰©ÈÃp 5òâ°x‰Ðš´“µº£õi}_J5cªjçŸøÀÚn`Ëâ :Òêöf;¤0eÏ^z’2Üç±=I®«[›J]*+M*5‘íã;¹†Éè2GO^ð!·:ô¯µÎäˆfÕ%Ë< |ý¯–éªi‡ìw$lc¼Œ7Iç§ùþ\µ#Q97-{ r´´Ð–îÃNÖôÙ-µ ¤òËe RŒ¸ùO} õ猜õ®:Øèz^­=Ý¥‹=¼Oµ%UÈ ðHlŽ[°çÔŸRÒ ðœ1@uX»±+%ÅËmÜ‚®HÁ$õ<…Åsó[è¶Z“jŽ>Õm%ʽ¢ iýí˜àŽÄôíê4ÃÔ’¥i=L+A9§¡Ÿ¤Ûj,:†•Ir¡"Üɸmá‹òÕãåÈÆÚô‚ß ü âÏM¤ø«Åº^‡i5…ÍÕÆ£{o*¶ç…bŪ (9,鞯7ÖÒÇZ–æîþÖ{¸Ì­²‹ŽŠ@$`xçÖ—L˜\½½Ž‘¬\ÙÛ̲¢[Ã!Ž2J€TàHVe'$í|t= QNò3I¥d}ûLüø-áßÙ¯ZøŸð#]¶Ô­­üC—‘êÐÈíi"±YÚÙ>pìÑJ§'æ¿h6ú‡îâ‡RŠI~Ä'¬Òy~á«-ãØùI#q$à´Ú~™e«=Ķv×ÝØ®óq€CžGÝ@Ãò=8£§jY]Ä—ÿc¹%&†ÚDˆêÇæ°Ý@äeqëÍ\ëó»%k¡KSÓÀ“ÅeicâôÝ1_ÉXšæĪYJ†uB[ä,©äV&¥ª 4-WCÓìå’'ÔVâ+Ëv9B÷íËAìF@DZè:ˆþ"i÷‘´³–IeI/dÔÎB§.9ÁñŽ8®wÅß I•õoâWËÅ  ’O¸ÀÏåZSÄÓ¿¼õìM\4œo /еï;Ãka6¦³ÆÑËsssw#Jê,üûp}Žß5¼Qqªê×vë%ÝÓ²Ç &[9À^øgtí쬮_YH®fû#¼Û|ȸTeÇ ÝCÛ­t>-цŠoÅ’J¨[ˆÕ‡ë÷€$ Ù õÏà+²u9‹s†•ë.›3ñ'áÀ:EºiÚ­±¸2¹xäãvÐIPF6îè1œô8‘âž3ÔçŽ%±·gMÒ²œdv\þ§ðëÚüQw¡–æêf%C‡˜äc'î‘ÔtúWŒüM¶³¶ñõÄ6þDl#o'#jb%ŽO T¿_â5úwcÓ§[ é%ù?Ðù¬÷ Ju¾_äyž³®"NmPp>b¬?/Ò²æÔ02 ýj­ÓºÏ+°ä¹=;‘L¶xRí^ò–0~hÄ›wL×Õά¥'}ˆ§ME+Ã~êÄ÷ôø¯#–ý]X rÜö¨$a#Ow%â–ÆH‘ˆÏÍ€sÀqìMW°Ù$Íu!hQߡɬO}DÓ‘Zìôè·æ ‘FvÆ£|’g€¹ã^ßà_ÿj^ ‹³oc†Ž ŸÚW“ò»²ýM2Œ·Äʼöމyé©ùˆ@Û‘šu1ƒ…>ôà01_>}9oH†ÖY•fXN3^»à[c`±Äª¼@‘þâɸȥW½z§Ã Záî †™¡(UÛŒîÀ$c¿ô9hF¿+[ž^mì›Lë5 Úu¤†Ð°&ÚÀwÇJñõ½µµÖ.&×mf”åð»ðCžç5îþ9·Ó´ÿ ?šÁ%%Y\z”Ä‘^â×_í‰:œ‚½+ÒÏ“¥(É=WCƒ(~Ò/M;‘Ú_¼òbFO òk{G”,€þ&¹kG+! ðkbÊ÷26 xØZ­;³Ó¯OMOð5Ì\#»|çJö=&tšÉ%8;‡óÇ…µÆÂCœŽJ÷ß}§MQƒŒpÇé_s”×S…ͨòµ#õ“þ âx/ö3‹QÖôIµ/j*ò¡be‘LAIRX ;v—î“–2þÒ¿ -ïüzº×öxŠmMZvÝÔˆuTUà({žx¯üïâ§ã?ƒ~8øÖwYѯa×ôÛÿ1Þâ”§·ÛŒGó¢H0~mÒð03ëí®5½OL°¸×&Òâk1šƒ1tWR@\\ ¯8Ê÷ÈÍWõ¼'â¨UvWrOÊVkó?VÉc‡¯Ãt+SÕèšôm4ŸŸBÖ¥¶ŠÊw˜FDnœ—nÛŒ’ùwöŽp)&‚šäQO$þY“æ¹-"†Txq“éþE7á=–¤þ$¸Ò§Ô%a¼†Lìa€dÅs‚>RGLƒ§u¤\èÚ‹&¥tÇxÉg<3}1œôï^%jÉAJ÷:éÒnvµŽ7Ç·6zLé r™Õá1ÆÐõjÊwnýxëêNq`IWE­¡v fY² °À÷ÀïíÚ½W^øasâݼE£Y"‹+¸q:’*|Ä'<œãž§±5æv’O>Âënš9¦ÜC}Þp:½®Ì4©Õ ¤Ž DgJ³‰£ZÞ\k+£x‹_•l ¤Ë… ’2:±Á$ô^½Ê†ß‡\³ðž«ý“6›qk`“»2ÝC–ÇË`¬êŒ–ûç‚kwUð¾¡q£A{©è²-ºÂ²6äDEIÂƒŽ‡o' ë‰ÖÌCöNóDO´/—åÈJÄ7gû瀹ݑÏ8äîå~·0ŒWcY|S¤kPN·WWùf;wKDUplÏC{nÏ«Ú4þÑç·ñø ,ÖY9,:Ž={ ã¢ÔmtmRëI³¶ò QÑ\ÊÛü¬plÂñÇ·9ú^«¯k~#M6+ˆf` ÄÆ5‚ wÛ§^œk/<.ö3xŽF’ÕžÁámÃ^)³Ô±®µ„H²´Àæ¬Sb"Ÿï`72^MyEæ¢jž=Ôt¯ø¯Qž]2TKKKã$•Q»—ÁSƒÀP}qZÂk¢£ë> x&[[µóâS¼•Ýóïû¸Èù`pp1Î|fø…¤é:½Ö³áEã„$wKjŠ&nJá6eòAÊ·^pM]j5¹c­Ñ5§)Qæ––eÏhzeø»ŠØùŠJ`C–^¥øÁdœyç¯ ƒÆZÖ›§\hZ•ô-¦*ï› †wÁÚÝ~QÈÎ=09•NiP 'ýFþëN¿D{Vt+‡$¿\ú•uªª>ÍÙ'®Jú µaÍ)ÁÊÖì\¸—vqÜÔhÁKàUÖ:O~*Ôf’PÊ@Äñ¾çJ¥+Xô/…&øªÞéd‚Ê­ÀeÏJûƒàå¶›ÿ ]®§s ôÑ3(Kµ…UÑL›Be¸L ‚¡Ê9þwhĶš­½ÚIƒÿ#_{þÎ_-|]¡éZÖ‡¬iï¨êwgueç-½ÈÚí"¡0Ø °pv©àqM âð©ß–éÚ÷³JÛtÐè˧&-ó=íÛsòðy„|€}3BïrB·"­®Ÿ±–ù±ÈÎjþƒ ý¶õ׆5,4ç5ÓXB-š:€®%¶‹TŸæ†GàÎs^™áM7Að¤_Ú×o aîb@Ûòä)'€ÇÓ®â°5Zx7C öe°„®6:}8®Rñ…õõá¿iØJXrx>Õôj¾)IE^gŽéâ3 ÝÚ'£|\øá=cGKm?T–âì:f4Rª-ÁqÏ zQ^W=ßÚ$ig'Ö«>ù„— &NüÍ’I¦©'(ÉèxxÜ}lm^yÛäzX\,%>H Å^µ¹Á?•e¡1a¸9êÎ*Í´€1ÔeN£R5œQÚx^ä%Ên2:ýkÞ¾_Û\Ùáuá ùËA¹2ãšõφú½Å¸ ²ýÐ'¥}¦Gˆ´’gËç~hŸÁ!¼YûKê?dø¿Âwv–±¬92ÜA¶åT·ü³\S|ÇŒíÉ$}ûB| ´°Ñ¬ïGaX‘|ám9)4¬O’¶Ù~o—<7~9¯Ë/„uŸ†¾<Ñ>#éÝÁ6“É—& eŒI¾Ýñ—BH#sé_§ZßÇ;/Š­üO¥jÑj6š”wšyQ×1qƒ ²‡Ä©&ØÝ2FxàœÊ|WÈçO;£™Á>Z‰FMmußNªßqôü˜©eÕ0m«Å¶“ìûz3Ï4kI<3ñZÞÚv­dyWvÃ"ž$c+žœdqÍtšÿŒ<=¯Ø\[»bú'$Á‚J(–^ 2W“έbxWT¿ñ,bçT‹O´ŒÛOlÒ]ÚîÚ䪒N‡ù²9Æ~QÊx‘ï´ÚÀ5;x4ûx–!4L|» |Ù$e›'éÎ+óÜECéÊ:÷ý¨¥RRª§Ôõ?ê°Çðß[Ñîæh­Z[Kp‡Î‘ñÂ-ܯCøâ¼ÏLøc«ø¿Ç6ë}æž.d$5‘ ÕÂáÆr0OL‚3é u¿ëš$꺤_j´DØ©xïîlp Ï'a'Wug­ï±¸kÿÒÚÌÃg!]М`©$sO¯á×ÂÂã^š’»¿~ç^/ õ™*¯Kv<ÃÄ^Ö!ðŒ¾}RØÍa"Ãq(`Vä®CàÙp;žF}kεkÝNš;'Ýlžc4Ï&Y™Ãc¯P ÏN㮇įž1± ¥q´7f‚-ñ¼ŒÐÙ\¦ s´漦óX×õmaî¼S©Ÿ5¥M¤ä•å~QØíôÁ?íqô˜*S•fx˜‰Æ3QFïŽ4(µme/õ N4›`H¡ ®Äô9Á^‡$ö{áéV’éê¼7wÀ®T‚e.Ρ˜…. ¨Û î>€ö±é×ZÅ„’k’[Bö!mÁŠu˜3ž…‚1bù;X,QÅss[<ú³ªÙ[¼‚U>rKæ|¥pT¾8cž8냚ïÃÊV³gumRÜ­ªÞ5ýŒö‘I–±²Ê³ÍnHY äc¯g®{+Ï|wº·›VXÝ\{8WÃr÷eKý_ `3•ïy#Ò¹½@#Ü;*€‡±ç¶*Ä÷ÑòÎù `b¨Ïy îê£8$žõúÅJ‰è|õr=>ø«¯ÙÙjIeJ\C½Û<ŽÃùã—YV•Àǵh|aÔ,ï<\d°™J­º(Ù¹ÏO¹he*29ë_ ÅÏë“[«Ÿe„ÃÁa¢íÐÙþÐW8*}³NKØ%¾••‚A8ü*q(nŠF+š›ÜÙÁ#kNKr‹¿œž•ì_ <`tж‘ǹLˆ”áv÷ëÁá¶7›y¯Oø]s6›¤Ïs*(ÜÁUÛõïdÕß¶²<ŒÎŠ•-O0µÒ丙Tª†Ã3šì<;áûHàq6d@Y9¹$×ÒŸqâŸC§ 9låšQÊJˆ 9' žêsQx[»¸ñ<~d0mfÄqºŒ1-Ðõ Xj5”ælÚ½Jõ)¹ZÉŸÄ}zò}Aôx.oÑ_|¶—“t8'ÇJæÀRÚ+¼ý õ?_x’mìë%°’+È †Ç ‘“€¯nàæ¸0r3_;˜]cf¹¹¬÷=Œ+¾–ÚQè)qÎh¦´›Hu®3k\1´Œ »a”Ц¹À.¶*ý“ØÝëj6æÔŠ—¶‡G£Zªºàv¯Gð ÿgºL €FMyƉp$!Àâ»O j-o":Í´¦Rßx××e’ŒgÏã£)E£Ý¬'[F¦Ð+Ò?gþ%øâ¸ïínLú%Áhµm*v‘¢1˵^dE?ë•FTàîÚƒ áþñ™¹Ž+i“$ŒnQÒºµœ“ÃÀWÕâ°¸L×,=xóB[ßóõ]çÊB®'‰U í$~–øᯮ5%¹°ø”%‡SˆÝÇ*F%†é<Æ!‰>^õ`P†Pb8&½7Å>ðf·¢ÇááªÇsbömi§ÜÏ`Š€vù;v ,ûÄŠøÇöaøéªø“áíŸWW¶¶Ôt8Ä0Û‚sql¡|³´úãi)œlRvîË{Ä_u]/@]ÆÌD33[¨o™—qÎÔbÜðG;zg AþNâ ¯4Ë3W”þÒ¿UÑùݵex¼/± ;«éߪûÏU¸øuð¯BðÍ¥†…«hvzšÄ±ŠHÚ¤Œ²’DzXž~e/ZáüPu?Êe¸³µimcÝÂy#n8^2I'+žp<š¥¤\øytÙ5{]BÚâ9­¿uæg‡ͳåWt;º!ìõ; ›˜6`Í“`í DKýÜv£Šò±9d£M5.gÖçU,bujÈòÍ^ÚãÇ:¤š¼ -½¤Ì¦íÝtÛœ–ßÕ¸*: sÆTÕ¼5bÖfRV%Ž0|ÕQºY;q¸•Lü„0qé¶Ú®™¡è7š‹hqK ‘4¿g„+E3€¥Â|Ä|½† #9óÂø½.|a©Ës嵬0e„üÛ¢'åvî0K}ãœ÷$“]˜yVÒœ]’ûþg5XRææjïúØÂÕfšÛG‡QÐØ@÷‹å½Ë…Ðä·#“ÆÞßÜ×)«Þ_Øiís|ÂÎÀË!Y⌰’FncWãå9#Üœ¥¯êÜ‹>¡ ì,Žñ $dtNGn§ëŠæüoñÖçÁ‹ák¸&½^5õ¸‚çËŒeví“<œ®1ŽW;«Ø¥ÙksÊ­)^Zn£â]nöÖy®^&µ,b‰ßæd®Aè>\úŸLÖ]ÿ’Å–ÛLÒ\Ï$Š"eÌ"1ÈÏ<³Îyü64=OÃÖ÷Åd [—”ÂH$ ‚{ŽÇ œ`ƒœ×˜øïÅÚwÃm)|A}væYT-½¢0f’|aÁ9éÈàc>® …L]XÒ‚Õžf"j ™>?ø}áÝ&í¯$×w¬ò*±V11`Œ|¤c è 9Íxf±¨º\I}q#4“H]ò{Ÿþ°C^øâ]{Q–òîdùÜœKœó’ÙëÉíþ•sâ+›÷>zAà®köl¯ÊpÜ”W¼Ö²êßùv>f¢Äb'ÍSî5®5WœyP†ðOü)º¾—k›3K$dç ‘ôÕ-2xe‘L¤…Ü3Íhj:¾› ¤Ò4 ˆÇ̬v“ôÏó¯UJ3ƒr2qq¨”Oñ ·öåÂnÆ$<*>•V9JžOëVüQx/õÛ‹µ@¤Ädt 3úU%è3_›Ô—ï¤÷ÕŸkjqô,£î!r Zˆî@MgÛ°÷­;8šWH‹….ØË[SNNÆU=ÔixwI–îñÂï ß^µéÚm¾Ÿ£Çln?x™û¹#'Ž+á·…–îêKù¥?g´)^Dœ ã½uØ$ù—5}Ž[†ThóÛV|î:¿´©Ë}&»y4ÛÉt™'x§di€9;N0aœûž?¥u8üà8üCe¥¼Z­ô¯SÏ;`ÚõHÁµÀÛ\^)kÉÕ¦erîÍ’X“œ±úÿ:éµ?‰W:–›-Þ¼!šñìü‹â|¨ÐåX°'!€9ç9í^ L! 6í+;yÁèzÕhJsŠJé=|Î*âW¼žK›Ù‹I#–fcÉ'½B2ÌÜéK3îbéϦ)kÓ¾‡¤´ }¬Áp²ÜD$Ps´ð×ÊO•;Ò‹³ƒ§*&@w ñÚ¤²ïÀõ¨1Ÿâý*Kb|ÿ{ñ$ðýÑIa` ß,Ñ’7Fãº0GÐõ¾¯¹ñ%÷ŽüO øgijyðhè°‰|‡†3—l—v58Ën#šøïÀ^&³‡R´ñ À'†)÷ž0Êã”ðÝz⾃²ñŒë:6§¥^yB]³O”p±àK3jȼ)Ã'¯„ñ/ ¸¬=eNÎÒ\ýü½V¿yèp®*tcR”¥¥×»Û¿Þzí¶µwá{‘àû•…ã¾Ymî•,YUIÍ»8_˜1 È8T—>4¼}*át"ñ÷EÁ’ܰø;c œw G#ƒÃ·Œ4/ø‚]I5X­MÌZÔ·‘´!zg’¸È<¨KߎZ¦>uö;)û:&¡}åùê–‹)‡*œô8üÒ8jsÒÇ×O(«Õ¨ø©øN{ÈíÆmÖãì«*‰äaÏrªªA\õls\ޝ6»§év—z®‰"éÈíöˆNœì@UÙÆWõù‰Ð ­mûe|+‹ÃªÄVK,j-"pH”#nVØU°T}ìd:ñÏxëãö‹y¦§Éu8šIHdºã°pFÈëÏNøG ˆö¼ª?#w_ ©ssëêOñ'_Ðu–î9l w!™D=¨yŽ6òÙ=8Íy÷‰5/ †KíͲ²žñ$ÈpIÎÒO vœg¨#޵SSñ„º9SдÏÝ8Š;i.@–'dYÆT2©yÆÖãœà*ø›ñ“ÃþÓ#µ‚ÆÞ[ÙwÛyª½‰,HÇÑpyãž>Ãù{(Á¥Ýè­Þç…‹ÌèÎV‹MöGgñwâ„üáF:ÅÜ®Ò)´Žs1qòª áTàÉ9¯™.é~±$[•R§ýkìB@àß§AšóŸüJðõ•¤ÆÏSS(å Xî$ãóç?A^cªëZŸŠo•ÍäŒ*ÉUïÓµpcóz½Êq‹—Mç«‚Ê'?z£i•«þÑÞ ¾Óæ±²U·Gʬ±&Ö¾âW>£ž¾µÃÞxšãP¹{ËÉKË#–f,O'¯\ŸÌö¬èü1â†ÞP,{w œà0öîj½Ý¡¶œÀ“ù€q¼.2ùúøÜ][:—·CÝ£„ÂÒV§bûj+!ûß­6èÙö¼¸¬–œÚò©¢Mÿ6qÅrªÒ‘Ðé¤t:.¤–¢ááÞ:}=ù®Î?ÙÅk²ÎS¹Ôoòˆ<ß^+Ï´øÜF ¬FE\·s ‡ƒÛµz˜\UJQå]Nøju]ÙÚ¶¿§4Ìê ?u‰Êýkƒø•â/·F±Ã$‚ ÅT€Íýà>ŸÎ´ïo’Öѧg œ‘Ú¸-[P›S½k‰íÝ„NÊ>•†iŽ—±äêÍrü,UN~ÄHRÒ/Aô ºã­|å´¹ë‹OµŽYf ØrI¨ö³‚è¤ÔÓ­œÁp¬„ã<‚zÓ‚÷Óa­´=á¶£mn“EqBBËw-”ù†Hïq‚@ç­z"x·O²Ž;k; " ’7À›‰sè?3^Eá;¹c¾EŠ D§?ÃÓŸÖ»Û ¹µyJªÆ˜/)wéþ{WÚåuê{¢|Ö>•7Vò”(¤$¦–€a å©9=žÝ}©ßmœäž™9¨ÕvÒÕ)I+ ÒâO,O4´ŠÛ»b”œ Ô€Ðàôô¡Nð¿Ö¤ÆžµÑxcÚ>­¥Í-ÕÓ[ÜÚþðXåŒFHù[ÓÖµ¥JughŠS8ݘA%mò"“ÇzÕ›R!—kº°œ ?P¿–íÞòa2n©;sÛ¯&«ùñGòíý+Eh;‰ÞHÒmMSnü¨DÚ<¤œgŸÖ¤Òõ£k} ËG•Ž@Å@Dzė! òOjï &ØÿZƼ£i_c?e+XôK¿Œþ)¼´’ÊßUVÌ¥sÀîpGNkO'Ú.D—7j&…“íJšÙ ’O½ñžk˜f–Lnœ2ijªæXª®í‘OB—‡]\Ü_Î×R–bà Ü ßð-Äj&U`~îG=ºW;’N½«±ð?†ä•âXñÎqš2èÔ©‰Mn¹Æ4u:Ëu¶kXÁLª¨ÆW=9õúþuCVÒl™äV»YŽvsÔzô5¹ý—5½¢ºÇM¡¹¬}~çW…~Í*#áNã×ßõ5â•/y)ÉÏÝg!¬Gö{†´ò£'pÁUù¸ÿ?ýjŽÚÆU‘IP|Õ±§Å½®dbÎNâIïQÜÜy7Aƒü«Á”73=e7Ê¢‹‰ˆ‘Wo㈠O/•EØ‹Í#È&^ØÍE¥Ü]A+ÉöbwŽâ6ãž{ñ­bÒ’¾Æm]X—Å$éúK‹¦Ý;“•ÏLñŠâ›§øN8õ­mnøÍªÉ%Ìû‚e‚çøAY!v{u¯+UU­¦Ç~›§O]Ù(¨Ñì(ÎOiÅ‹ä.?ÇéK 1•AMÃw#ù×4Sr6.A§Hd²¤g`=ê厊²(ÎÕŒte‰úÿž•gO†9Q‘ãV= [V2Àv #¯Ò½jhÊÌૈhŸÂš`‚u”¦í€•ã©®—Y¼û¤zdmºGUwEä)=÷ëǸ©<9§Á¦[¶¡~J$\ˆû¹ôþÕ›|d¹š[â_3Îθ¤ð¿€¯¡§‡Ã¨®§9*Õ›g”ˆ¤Î'>Ôy@¶Ù°=+×á—‚´ ÇÒn¼Chbipn› *¹eÁÀçœc'ë\Ÿ‹tŸ XÇs‹Èÿwqt.uãÜùÚÙUJæ“Wíëüf–:YZ)úØãÞ-®ÁÇ­"†xÔ²Dî~U§wì:M’8¼ónäYv!WD¤ –ù¾fØRsÁíI{ã-Z+a¥Ø^‹HCî h‚%8È#æ'§¿N3[F4iµÏ·eþdKÚKáßÌÖñ7ƒ¼á»7·›^¸“PIJ¼ê¬ST‚@È>§×Šâ.žÆ)mdÇÿ,Ë`ǯéVïîã‘þÉ8U0”Ä¿+ûûÖsAžR[îŽ?*ËZ3©îÅ%åú—Bœ©ÆÒ“lp‘Ãd£¦h qÞš¯µƒ"ã23Or]ÙÈ>ƒƵ[›0¢ŠA¹œ(• íÙ Äú|)=Ê´ í9½+Á×0­²Ä…Øy÷®KÂ~}I¶Ê…cï!É®“IÔt½"I,Ós8y q‘é_E•Ótœ´Lò±ÓU}ÈîŽÁ.m¤<ý3Tµ-8Ü#£ ¹éÓÞ°.|ealøFç³–éUïün.m ºßª²«ÀåˆôÇAõ5ìÏA¦›¹æÃ YJèÊ×vÛÌç$}áǵ`Ix@ÌÙÇrsF­­ ²VÝIÝÑÉéYˇÏ'ó¯“Äâª{»õ1¼Ž‚×Äv¾^Û§ö8©oµÓèº ˆD–â6%O¶iú>Ÿk2¼;†ð©ÇS[“]iZNÈ·73$0£7.ì@òÉü } Jœní¡ââ1œ¬·e-z÷LžÌhz|q,Кâg@UTåB䑆<Ÿ &±¤½³’Hì’%rÒ푼·¨-Œ*óÛ?®jŽ•ªÜ™®„¢Ý…Æ­tÁÈYlœçóÎ 'Ž*K¸´×»‰,ì6Ûç bÀrÀ’sþsXûy׋’ÒÿÒü ýŒhµ­ŽEbvžeÊ=)’ë{#‘1³:€$•I*:p3Ïdæ Ô%º kI"Gû…ÐŒëUŠ\8!®ñgükçeRI5Ö>²&SœzŠgÙ0!úÖŸƒtMQ¾Xõÿœ,hÏÕÝüªî­¢éÚ¢ñX˜§‰òÜ>ò¿\÷ü*c‡”©*ŽÖü~â¥V1Ÿ'S.ËJšçåi%#–“ÇÞ§ŸNð¶žcRÏríóK$)ýœ~¹ÏáSÇ& fUi‹õÛ±Bç¿9'ô¬Û™d–V‘£<ã?×MBÑ]ýâR›–új:Z<†ÎÌÛÆÎLBõ^ëWžxà $yçK!/©½«ÔrlêŒRB¼ˆÀÈÉ'›)9+ÀjŽâ6L|¸É )ëŽÕ1kh"Û‘çVÉel¨æ’Xäp­ l•ÿ–ƒ¯åRãÌ­Ô¢S-ŸAÇz<»ŒgiÔŠ±2«yd3¨\ž*üM Àj¡EËC9ÔP1Ù˜61j»¤Mmf|ÉQˆèÜàUéì-­AyCØsŠÆ—™åÆ:S”^wÜ"ÕXÙlj?Š® ”´QÇPqÅQ›R½¹1ç9ö¨3ŠjÉÉqЉ׫=ØãNœ]Ò$’æbwI3Æ¢mÏœ’Ocž bÃsRà‚²m½ËØb†bK R*~aúSÕ‹díÅ6NNŽëHcGaóu ¿ehÂïÎqòoìg§µW±±’ó1C€ê2ª‹Œþu·§‹yìŶßÞ‚ÅOMã Ÿ\×Všz³:²åÑ ÒôtkY/.î9,v~ñž‚¶tŸ jzÃ<ÖϾrÎÃnP=ˆ_м9o IÄ»³ƒÍ½|tïŽ?Þ}+­ðE¥˜Óç¾¾¹ .c2­¨%d µv¡8À;»çw¯ŒÜc-?­Èòq8·ÊKÈͰðÉgD‚Ü©îG Àý*ÝÄsXØßKïòªH ÏŒðzõßµh¥äöVòÝÏ5š¤Š@ŽÜHAŽpA>¸8è’[ϨËmnK2C)¹’Y™w>@Ál|¹{cNs^Ú¦’´t<¾yKY= °Ïai4ˆäýÔ™]ÿÄÄûã>ÜûgÆ:¶‰{7ö^Ÿv¦M9^õ§‹ †@$jG$åÎ{c×·E“D¢æRUÊ`þG"£Òü-ÅÜúÌбʨTÛü#''?‡åW[Vµ?g5_r2¥ˆ¥J\ï±ÉZiì–ШH’$Öl’Kg©,IüjÕžš¯¸EËrsÞºÿøE,™Â<»šÐþΰ³ knÊv -·j©åê Ý ©ŽRwêÏÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ü=Õ/]NAäð+6II;›“RÝɾCÍB >µöu¦Ü”t ¼ ÊžµH1bX’O½Zº•|² €~EV#5Ã[{1ØFLR¥¼“¶#Ú2OqHÿtÔúZÊ&ópzóø{ÔB<ÓH»´†,2dR×­]›V½‘¤3*ÙØ…<|¾˜нÅØ4aNyP3Š–ç@’$V(F{8ÅzÃUQÐåuàå©™E£†}sRH›q·?[*8vûŽ´©§Fíµä#ÓQ¢ìO´Esœd ×Ú¢,sæ¨ä•vîÝmáòŒsêGøU' 0Å)«; 2º$û[µ¶ÉrUNHžžµfÂåYÚT²…Dj;py<Ÿÿ]V¶‰ä.ì@Ø„äÖŽŸda‡0°sŒ»mÏùUÓŒå+ôÚŒl]ˆO¤Lþcže!ø# ž õ½¦MöÛ&‘bÃï™Âeúo$ãjcvÑž0;ž0-ÔœÇöŒ!be`ܲŒçãÏßµáã «Éq8?"°ç®Æ?*õ°÷æHà­kjOªÛÎó) 3>c9+—wõïœÖ-ÎØm„Q8•ý[Ž3ë׎յ¨Ü\»SsûÂvqÓ$×–É{$²¶[+¸ã'Þ»o߈¼5s;«1…< úþUç‘_$qÑ–ôçƒQ›W^ÙFý ËèµE¿2[‰YŽ*|{Ñ. ³&ß(gûÝ*rÙ!¿Jñe-w=5ä±Ê¥°@úžÕ2ȈHR§Þ¨yÏýãùÔñHª‡vÚ˜Ê叨ž É"bÑÈA#"¯éMÓlçÕ¥"Ø®ç㌊ŽâÞâÖsot¬Ž:«•¢æäæ{Ù)[©/ž?½Gž?½Uö·÷ÅI½}jyJ,š9Û É±šôMËMÓ|/ Äòüóÿ(õÇLã¿jó9'™#ˆGÞÀï]­ØÕ5"ÖˉQC>îIŒ`u¿Î½lº¤aÎíwm,\QMÙ¬ŒXiàg` $þQåòÛ‘Ö¼¹K¹Ö“hKµVs603‚;úUr@êjwŽIG^¿tÓ/,®¬v™TáÆUz¤[Õ#XÛb5¥tz¶®‡@ÒCºr¥g8®v7Õ³Œ=«²ø{ey¬^¤¶m0‚7¹¹#¢Æ‹»ä’1œŠêËáVÖÔË)F•ÎûÁ¿ §ñf¬±‹¸Y.'9ÚÇ íŽ}I­Íkà&¢,n/›SŒ¤Aäò’.½øÇéPè?µÏ @ºeÍ…˜X¥lÀSn:¯ÞÈ qÈ8ÇJît_‹þÕÝ.7XJÿpIà[8á†sŒ{u5÷˜\>[:\²ÝüŽÅÖÌaWš?‘óæ»áÙô›Æµ¸ˆ‡ H¼ÿ*÷ïŠÓn$ÑľeÉm¨ÏÈ<’~œõ>õâz燥ÒïZ)âaß7uâf|°²|º£ÖÁca‰‚¾âØXÅw6ïn<Ù6ö˾ާwŽ*¾±£[yæ(8á5$fHÈ`ã8äã¯ùéøU˜na[V{“óG¿NÕËË ‘´–§Uå ]= Èì#†)Te¾ñj°ì#BN8ʧʸ¾Ýþ´Dá”c°$Êȱa7;ýÐ?Ï­b’µ‘¥Û%WUoÞ;ˆØbE ŒN?—µhÁs•c‘78€W=y'Óÿ®x¬Èce#rpªž˜à}jÕ¤î¢`ÒJ¸g Jªô##°•ÑJVfrNÆó…“‰÷!rÀÜg°ÀÀïøV¢c7•»†ˆÚÀ“Ë1Éï鎹ãOŸ²¶Ÿ¼L  M <­ƒ…\Œ„?‘úš:©‰\¬h;ƒ c¼úg§½zdVµŸ4=Šq–¦qCî2Iäu5±áß_j5í³:€0qéQøkº‡ˆ¯VÒÚç—r}Oµz+è?ðŒhÖvVqÈë-Ô=È/‚™] ä 9ç®îœVت{òØÃŠTýÈîyOÄ}6÷NðüRK}Ä— ,,¸fÀ$°=€Êñïí\I$ŒÞÕØ|\ÕÿÄpD™T†ê¬8$“ùô×"ÌAÉäšù¼ÑÅã%˲Óî=¬’ÃE˨´šÈÍÀt Û'üôý)T0û͟–‘þé  ï‡Û—U–X›iX =óYúì·2jÒÍpF÷nßÏš<=«®eÌ…wÇ…À䚥%ÃÜLÓ·÷²3]R­ªFšÞ÷3TåíÜúX§AÑE1'EÏ ýjÊQÐt¡Ã•lV<èб§:„@G˜?ô›ëb²VŠéb]™Þ_p:W˜B]n#x؆G\滋ÝSJŠ-6V& }Ò18íÐsɯS-¬¡J£å»ìpã)9ÔŠ½Œ‹¨FqФ•2Ê0[+ü¿š\Íä‰ãCŽBúsÇçIâ_j:™®Ê ¥Ør¥ùùAîx=)O VPsŠÑn¯%»3ü?áùüI| ÅJ<Ùdléõ<àUÏie°Æv¢ýóÜãžÏIRÒðÉeÈ„›‘oAÿ×­»ßXk²zÅBÛª•ùr p{Nš¤ðîi¿¼s•UYIlŽb&YpN0üt÷®ëÁzÜzn®tøÐjW7Ïk!oùâSF í×ÊÂŒ—­Ào›ˆÈ­_ <ÑØêÚ …¤rñ]Çóp 1p{á±ÜþÑ†Š¥QYjî‡^õiëÒÏñ/ï¾½ŽV‚2ìO™4н<“Süþ•ÐøsWk½L®Ó, f8p­»bÔ’O^¼W$’H$&ÀÆA=OLêIîk¬ð†±=ÒǤÜ8(ÊT9ã°¯nX׃¤ög•Rœ¨ÍT]4º²¸´™¡•0ÊqÈÁ¦îʽkZøW.³o,úljÒ 26î¸ÁÉÎ=q\ç†î­¥hZ˜pØ•æ×ËjQ{hvÐÆÒ¬´g<#çqAMfl²ùa˜t³ðéZwúQ¶„Êx8ô¬ÙRVÂÇÉ=Q^uJnœ¬ÎèMTÑ*í}Û@|¼ÙôcØTèòÈÒÊìË´¤ÈP8;,óîj°Ž3" ;ÆÐYw½ƒÏ ÇãZÝóì¶´ˆr\žÑÝÿ^®l–ìjÆ’ÙÆ4ø¢#¡k뎬¨[’GSùg¶+,[Eh×pâ1Ž‹Ûê}Mh_”Ó-Å”6ê—RÁ¹äV8s€ßíu&³4H§Ô5$Þ]¶©?ÄxRk®jóQHÅ=™é¿´;]:ßþ WM’u/û¿.,€Ä€3žÝ}«gã‰á¹ðéÒì¥Ãm2ÌçøYxÿ²~l{ô£3E¾¹Ð4v€Ìç‰MÁÁÜ@bFOL¦O`rÿüB.--à[Öf…˜ï‘ÈP«Ïaϰæ½Ê•£…À8-4]|r›Ôòïˆ×©{âXxH­Ò5 Žç§¹>õ†0FH«:˼“¼ŒÛ„’³nîFN9úb«×æø‰Ju¥'ÕŸo¨ÓIt (¤##‰@= H Ö’5 œ6 ]¿>ìÐËµŠ†SŽŒ½( J6|û¿JigÞ œŸaOK%ݼ–eª2ëœz J—W˜ÈË¿€rW¿ ý ENI)4‡{Å1úz)¿„;…h°às^“­Eik§ƒ%ìqh‘Žq^kf­%ìH€“æŸZëþ(Ü=µ¥•€U¿69ɯWQQÁÔ›[XàÅÃÚW§‚Ê)ïc[™ÌQ3|ò*’Tzã½]¿ñ?‰5Kü&×ñ› ”*.ò¼ƒŸ üsŽMV8< c§5SjÆâHÕ•Ôÿ¬qLvç¾{ô®ç ºOG¹ËBO™î¶3´ôF2ÀÑ‚³FUH?u¿„ûóZÞðûjöóKs£´ÅþY;yÁ3LÒ@Z;V”ªŸ”ã]7„Øøb$þÚ”C×,èZLH‚°xò?Z¬6>ÕJ{ µwÈã«,|@Ò­ü?§˜l£†Þ¬£j&‘ˆ`Üdc ’qŽ ’+‚¹”[Ëö›{© º"HÈÎïQÇáÅhø—Ä׺ÅÏÚ®îÙ’(‚B­'UÉnsËI$’{z ç¦pÇ äž¤óXbêFu.Ý ð°”`¯ó4>Ö·2´ˆXØvr r:‘Ž€ÖΕ •-œœõ'®f ö2+Ÿ”6x+dK寲À_ïüŒ§cú÷£Q-X«Ã¢4./Ö ™ }ÁÕ¾pGóŸÊºê#ÍVd¯>YÏÖ¹ ûÙoîþÑ*m£qËäûŸçš»¡êRÛ\¨®xÉÅwa±<µ®qÖ¥zG¿xg]ès_yrM¶?õ0à’ÝFA<Û·sg,‚9\ÒNãëzòL4W+*³çŸ­|ÎeNªYC—ÕJI²(¤ €õù/ÌÃú­]0ÝȱEbbmìôÀ*¹#+Ü €7Œžõ[K€ÜÒFÆ%lÌÌp dd±þ#Óùfµ.šÍ¢Û§,’½•ÜíÝ‘õâ5Àt'×cx^ö_‰ß{Kk²•ÐkxöGp®H+,¬ÙäpI=Ïž¼ZÑðN©e¥·s³˜Ëö=ºsŠÈ¹ÓžéÄî¸;H0¨=Ieæ £ikaµÝùÚ}AìkJr•:‰ÅÔŠœlífÕå¾µiÝq¹ŽÐqÏlxcé\gЧ’ñÑ•BZR_oÊHÜxSŽŸ…m&¡6c=¸ts$@Fè8$ þ_p^(ÕÝCÚ´î¾bÈ®FìžÄrIú ¼ÏËC^¤à0üÕt0gu–êGXÊß*–Φ{ÒŠhùÓ«ämŸ@ìQE! W£~tª¬ò„D,Xà(&–šÑî;·b…tÀñqŽ”(F*‘!Üp9õ¥Þ¾µ%š îãA S¼`š¥w$†.¢nDK¨Ž0$dòOãP+¹'zT—R,—O(%'ãÀ?ýjdqˆ@ØsNm9hѼ7åÿm@'L©n t­ŠwIw©†‚C倪ü?Ò·â‹M<Ì€KÉÃnÆp>Ÿ­\ø³¤WŽËÌÜJîã8ýkÑ„&²¹JÚ^ßÉ9Ãëñ[¬ºO©Ã¦j¥µšÏŸô‹™0ˆ¸à’3Ö›áÏ >¹ât𕾭›Yo µÌ*BÊ?8ã%xÈÎ3éT­íd¹TGrU ÛÉ8Ï­u~ðÅÞ¡®Ao Ë °"Y#b¤'s‘ÈÍ}%NµHÞ'‡V¢£ikcªðßÁ­3MYu9%iaYˆˆ)ÃH³»8A'àŠäþ;ø?UÒ5ç’öÑ`ì`Œ#R®À(Ïû9<äõí:>¡ økP´þÙ¹´K{fòJ܇òá••BŸ0R@|í ê+™ý¥ ¨PZ<&)º®”q(ÛÄ™ëžÄàŽ yxœï W5Ž …6½=ï^ÆxJ5U¬T~õíò>iÔSnIaºV|„ŒÃ$Vî»f±±Ps×?ZÀd"CægŸCÒ¸±1p™îÑjQíÓslŠÓ°’U²0‘÷dÜ8ç§ò¬æŒ¤ ŒdïdÊ´ìÝî“Îr¤± à~´Q¿6¢¬H$lå‡$uÅ:9JÈ%ä¾”.ـݕÔtúÒ,bv¬Êáx%3ÁÀ㟯^ž„×MÚf;£¦ðÝð’æ/µ9 Ì#µ{&¡ã‹/xfÒMU ·,Š#²I†â‡Í×jãú ñφZT¾!ñu–¶æD3˜NÔ,N:q^ñ“Mµ±– ‰6¤2Æ%‘·Û’@Ü9ô#+é°*ÓÁʤ}NŒñ±§/SμQâí\¸¹Ô®§ŒyήU€ùqÙxásи'©5ƒkÝ;O<Ò1ÚIÀù‰ÈÝëÆªçRwnìõà¡謋¶p²ªO HÑÃ2¿Ìƒ#%¶ÿ=OA‘Ö¤žÜFŸi2 É Í'8À#=p£9ŒtíO†å¡@‘å˜ã¢ûôÅŠÞ=¬s¼l‘¹Üþbg,~ð<ÉãÇÉÜkUÅh®È»—[#ù¤€5¥“î‰y#Ryúöÿž´ë'kyö¼„¡ç;¸Ryü*Am©ÅøÊylÿt qÓ=:qTå3‰ŸÍR ±ÛJæw¼÷6´Z²,êú™6O,y8×!«<²¾Ûƒ$ˆù<ž3Û¿¯©Îê©rà±Îç¥s—w‰J9æc«snw`鸢4ÆãŽ”êŒ6ÒH'Ÿj’¼“¬@ÊÝii“ƒÖ–€I £$œ;š@C/'°¡$xåYgiéŠ[—YäÞ¨8Õ­qÛQNÒù! |à­_¹µ:v˜ñ\Y¦ïº²9É9<“Û‘U´©»X·íÝŒãÞ­kLb`'Þ ŒÞÿtBTœÒÔ‡&ª(ô3 †ã4  ¤í#ŒTÖ–²ÞÌ"†bz…­ë?k×ÐîKª«’HëJ޵ux&ÅRµ:_,|µó|_ª}ÆÜÇÔÔÿš‚_x¬"‚B&AÏ''ÿ­[ tÉt­ZC%²£Å7#ç§Zä>#]G{âÉš7f!v¹ »qÎ=²x¯Vºt2uMîäpÒj¶fæºDö/ø&ÿX‚ÉŸkÜ`/ søž•íÿ >éú%Àšòn­âIÞ èZHÌŠ‡j·9ÓÓ¯oᯠAáè,íWÂjןik…ž1fR¡Ñ  q¼8œŽ0;OG´m~_ø‹û>ÎÒ M¶v{ ºk†W(]ðÔ»rHàÿpæ|cNQÀÅ«èæ÷·’óîrÐÈëWšž%ÿÛ«õgã/èƯu{vÁ/ X.u ‘Ê©ùQÙVf}ê6ãî1^kñ~ÊãâV»¨DÏ¥ýª=2Q{z¬°C{ö½mfÿlÚQ¡º«üÏ“õÆ ;ù‰.+œ¸ÛöŸ“8÷­-gTŠK†Xñº»z;Ö\‡# çŠúœTã9³JqˆônÅTv9â´,.!òÄx¨$óÁ¬ÛDZi¶ÚE/ ÷É»n{Cèh†I‹Ì9Ãg¿CXÓ¨ã-eO™âê-¤ÆÄ’9 ñIkld”|’~íVÓm‡˜Íß k±ð§êSÇoqkæ<Ò˜g~zZSÄMGkœ•ªF„gWû;Ç.‘â)¦¹Ê]Ûù(àtbÀóßcŽäWCñÏK¾½û£(·†Q”žw±Lö×[Zg…´è´Û 3Ä€+ó>zò9<ޏ¯*ø—ñ.óÄ—2xzÆ1•µÀbù!¦uÈÉìT‘‘ÔgÐ×ÖV ]ì$îÛÒÇÍaåS˜{x+%¹ÃηBy#Úñ…8ga€*m9YbqhL̪\²|Üã?ÿ;]µ¸k§¶;Ü¨Ç êsPir´1¼JÇd™RÎY{‚;޽kçq«cèœ }þ$»¸$åU³`c<…9àBy«SHó™ãbÁ±J¼c*„À9zy¥Õ”¶Û-âQå®Aaœg€N:)ÑÍ=„?g€™òpTŒQœAÁΪ¤g%ÎãÓüýkfkk™œ\¸U@yP1»Ô{Ö{ÂRv“Í@̧°rsÐýkÁÄ&ìÏZ‘Tă€y¨ó¡4÷™òÌ21Éö4·QEØ”@Ë×üûW+‹µÍlˆÐ±1¥## ‚qš|va×Í3 QÜõ¢œ´Bº#††éŠR\ª¸`8Ȧ²ó»ô¥³#™ÑîCÇËWY–{F´’Þ6bz…ÇlUÉ®`)Éóåº{ЏÎQVCi=Íÿj0YÜ-´Î‹ºLä¯&½‹Ãz¥…倔2ðÀóž+Àb‘á•g‰¶•äØÖÏ…µM|Þ³¼˜‚å^ÖWš}^ÔÜny˜ì·÷¹¬zôVöЋûÆUPÖÇx ðýS̽ñ ªƒæyÎ2}Z½·Dˆßøva4 ¹ƒk;|Øã9>µãw!ñœ±Là*_•f€sÍvg–”h«Y6så óÔîÓåMÖóO$Ý^j}²Ã*«´K%¾S‘¼òäŽAãæàԚŌ7ðÙÍö˜¼ñ“¬d2gpAÇÌ6ƒÏ\í«^1šæïYMj8" -ŒS™!‘IË¢.ün$têxQ¹ñL?Ù·F¡§¬³}žgî±l<¢Ë ÛÔ($d޵ù<â›GÓª­7#ͼY>…âïè^Ô.Ö$¿»”=•¥€vµu A`J‚•\Œ€›æ?(ðÚcÆš•î©'ƒ£Ö'k+Yç¶u*É9X8,ßÂ‘Ž ÎÁ“òŒzN©ªEªøŠojÉiS+KDXÒ Îò;ÆÔ66Ž\v5ówįÜø›Ä7Ú´³Ìïytó;ÊÙc¸äNI q’M}ŸÒxzkt~êüßéóÜùIÔúæ6ï¡ÊÎëæ3ã¿QQ»FãŸÂ¢–S×·z…¦$á{uâº'5{ž¼`ìX†g9;° M.dyö¨ÆG'Ò Xg’%¸ò[c9UnÄ€ ¯ëïZ––ŒbY¦<žUH횪iÏaT|º²Þo$ËäA<ðÉÅvþŸÄ^¸ˆÞéÓ¥³í•ñßå–È`HàeO#ê¿Âƒá­OZƒDÕáey_jHŒ“Æ3Ûœßø‘â †º‰Ò ô²[Éo(JÙ‘sÌe»ç2=«ép´aC±.z-ZU«ý]GV®Oñ3â¼×ZiIs ]D€ùø\å†ÃµXž‡×ŸJàà¼7s«ˆq‚1… cœT¾ mZî[Æ‚'goÜ1*B…;¸cªÇ†l4ûùŒ7:Í­»…&6¹V\·cî’ <ûÀéŠØXì.‡›æB0Ôþ¹ªW¨¶³>ä nÂ`ç^ž½8¿ÕaÌf±œyV†vªÞq1¼¬ ÏÝ÷ü+™¿…­§iÒ6. ‘ù8Ï¥um•þx¹pq€ú“Ò³o¬–Iå‘ãhä,r| tIçùW&*´÷ŽŠ3äV9™mîä!åœlRÏ5 źy¢âY•T Àaê@çZ׿´c)‰Ž¼}EW‘-㌇@7ðݳ^Lèî™èÆ®—G9y%»w?'ŽœñŠØÈûHœñzµ-¥»\ ™öþóåfã8àåK32€í*rK WŸÉ§b›ÒÆt±yDä1àwÆxÍI"Æl7& 2 ëþriЉ.ŠvÜð95žb|›Á^¹3þx¬šQW]KZ±m9¤db‘_v~^”Ÿ¦xÂkj;6 ™]£zÒª…éH_ã­ .îŠ~´ »²\ï[˜‹Ñ árFr:Ö;0#ºo†ú1»Õã’l'&»00œñ1Q0ÄÉFŒ›=cN“ì^y¤)hË «ÇŽS^sq%Ö½-˦[’H'¡'=÷XO.Š4ëdXâ;#$qíÅx[³ÜK-¹RˆÄ€OQíþ{×¹ŸósÒoø—“ZQ¨ûŸ¯šÆ‰{¢hÚ,6úŽÕÒX­Ö£oˆ¥¡˜Í¶¸Â¾Ñàà‚qòù7Åk Ë.ÒÛR–m>ÏR½–ÖËSÔźQ¼î YÂnBv†n@ÀÜ wúµö³¥_ÜÌ..î5‰îRälÉʼ«ÊŽäœã¹Ÿ&ø×âËŸ^Úé¢Òî;kBÓ$3ÿ¨Œ¸ÚÁ|+2„ ÁyÈùMÔ­{žæ:|˜vÑã?u9ì¼,`*¹–D¶ÆB”9vPƒð' WÎþ Ô$º½wfÏ<à×°þÐ~4µ¾Ôÿ±­ÔˆìbPö™†Xã ÀöäWˆê²‘‡sšýQúž_N•µµß«ÔððÛnO®Åf“$†ôÃ$Ò„E$±S,Ë'rjÞŒéÚÞ'G(ÆåÈü×cíZO©ë98¦Ëº^ƒ+\E¦»œ³a‰þO@;qŠï5ÿ…š„“b;‹†b[¶à>RNOla¿*ã­ ÆCÆ~èùOÒµgñ&©qf,ç›(×'Ô“ßé^ÍÓ§K–Ê÷ëÛüÿÌ®ëT¨šv-ü+ñŽ‘ðïűø£Uðïö¡±a2[}¤Ä +Ë…8^Ùæ°<[âGÇ^'¹ñ òm{«‡•-aeº»–¨ìqj£©_BîÑÄníÍ!êO±ôÏðÄi¨˜F®W’B¬€9 u8è8ÿ8ãœÓ’‹z/¸ê…;{ÉjÍ ¬$2•Ï$ϧ·Ó°ÍX”À®K8sÎÔVÁÆ'ÛšÊ:…¬+äÛLÅÄd„¶28àŽ?_¦ŠìJR9#pÎN2?­k ‘Ù*n÷6ôKûKmÊöÁIÈ$s¸vøâ¶`¹²…Š5MܰU“ï\¤7.Љ$Pr¥ €EMöNgy vžaÐ’=k¾Ž)Â)3–t9äìu‘jÚd1¸8äªà³³ƒÇ>ôäž)f’e2ªÄ?1ç®HëŒã€:}ìã룮èÃ|äãï/AÇû_ÈvÎsW¬¯ZdHÜ€®qp}Æ{ÓŠìeRÉCqVÝì#– L¨‹"¦Ü±õI÷Íeê©–7Iƒ+ê~ŸÖ®ÚK¼ñ\ f ¸$Üq‘ëÿÖöªz•ðx$¸KnvÑIGã’xžnz*8¸E>sžÕ¼É§²ÒXŒñ×'5Ÿ< åÉ3È_hÉ`{{}kW[šíÊ[º€d «€NN9ß­eA31Qœ…,8#Ú¼JésÚÇ©Jü·2ã<´ˆ9R7|¼)ôüÿAOTW;™TîîG5b=5D¦+W#æ#¹ïP\+Il/¡#­pr8­N®u9Z%k–ÜVÞ qØzÓ5 h¡¶R½¸ecŠHüÃ2­ÓnK7OÓGÃkÒ²”9•Íy”Z2²Ü¹_þµKi$>\ÆBÙòð€cî þ8©u ‡É„ · ‘Ú« y¤`¢#ÏC¶¹eFVHÚ6q»ÇþY)ùCf¦··‚EÀgäñÆþµF°&òÈÁì*̼/å‚ çœ )ÂîíhvZ´Í!R5–i{Æ2v®—ÁÑ•»ˆÃ)F qÎù® |ÝksÂ×AµafÀ÷Éëþ}+×ÁòF¬R<ìK”©¶wÞ+Õg“MX•[fñó`’ägÞ¼J7\ùh€«’ ƒëþzW²kc±Ò¦Ô5º8 ýç©P:W܉âŸË ŒIHÔòë]䛫ÞßæŒ²ˆ¨Ó•Õ/k7º½âë¾%&ÞëU°Í½½Ôû¤RO™ò7°úãw ñŸŠzõæ“â°Õ¯- ÛØE<óØá—çŽ7uhù‘™»2; öoëqÆ–:•ݼvwpIæ\Ãw E@IÚ‡œ6@ÎW# Ù 3Ÿš~9x½†‡©ø§Z²®®í޼p/X`nå8PInK–9$ƒÉ²ÌF2¼$âùo«¶‰/ó;³lE'N2÷ ñýÌ7úíÍÓ]«É4í+`w$œ~ÅrÝ¢yȶ÷W÷€ƒòԺƯ2ÌZ‚Õ{<ÌwJ[žõöXÜL%'¦ç>Œ”V» BUPnÈ;Á#ÓÚ¤Óæaò/ Ç$g­W¹9&ƒòwcޝ!T’’g Òq±Ñé—ˆŸ»‘ÀÉÀ&RúÚKt†ÎG, _ ì Û©É<äp1X–º™\ùÉ“Ž ç5—SJÌVB=5ÚñK’ÈÁP´µ.¼ÈÑ–™Jðz®—›Ãù°†ŠŒqPH^S—~AŽÔŽ23“\’ªÛÐÙE#DÌ×! #fâsVíå$ ûB®Óº–Rx<÷þ•ˆ—!#Û°~çwzTð^®Ý¤äí?31äþµ:é=I•7$l›ðЬHá<€qÛþ§ô«^Y¬K Q„@0Þ~§Þ±n/'1H¥T~P 1žyô©•–HÄÑ9Á‡@1Óùú~5Ó îýÌeKMM´ˆEÕa“’Ä÷5jÂîKqòŒ.á™ãì=ÿ—\V]¾§¶A‰UÀ\¬ŽÇëÖ¬µôRÁܪ‰€| õ÷5Û Ý3’¥7Ôè,/.¢•PSrnCœöÆîzxê~•zøÅ1Ūì;Ý‹žF\ä{úœV¾¥¿–#Ú·áW#ç©ÿõ©ëö]²Î² «Ď¸(iÇ\ô>©E«œU"ùö2uH.¤}‰~êdc ç?Z¨–²9t(±ÈôÖ¶n•@~B_1êz1ÝÉÁ眎}ª)aH°8lòÇßvûû×4©&îÍ£;.SÈòT‹qó6Næ<)ü¿OåUŬÓI¸õO½G!‘;:ôµR–8Õ\€Îz ½VþÐO˜:g#åÚ8Í(A=Íã)5±TZy‰çI·ò ëHÌÍ ¶ 1Æ[o?@Î*wI済Êú€¿tg­Ky‰GÆ8ãYû6âÚ-JÍ\Îk$4*vžíŒÓ–Í"LƤêy«1˜|é·ŽHÍbö=ª\#q¹JÛ•’U¦F@ÎAàWEà+ºÕƒï£ùÓ'©¾µÏŽ:‘×Ô|-Ûÿ LÑçq šêÀÆø¨&sâšT$Ñ£ñQš×ÃͧuÁûŸ›çAÀ¬À€“é^Íñ+IˆÚCtð‚Û‰Úzí OåœW‹IͧnòÑdƒØÕçp”1:ö·êL”°÷GÖþ/ñþ¯­X›xg¿Ü'óy§;˜õc×€IäŒgç^3›VÔl¦~ñ’"wHIÇÊGsÏ_ךè¬üMÌò[]2Å õvŒåŽxœãŸOO¡¡©jš]ì q‡26ÖF9ÈÇ ýkì*ªr¦ãdú-—éӫv®þóÂõZÞIb‘‰+òä÷¬¨Ø±$ú×§x·áàžÖK«ÆOÎQGÔaxïé^guo-¥Ì–ÓÄÈÈÄ2°äJøÇ S RÓZaƒ¯N¼/£"SÕyõ©(¯8êTd´I·ø³øS°AH@'$=hvF:w¥g ×½Á@É=)Ÿ1$Ó‚s@ P[øºžã­MUÃ}ö?"íþµ$öŽ©±¨`p«^¤â®Á§¼ÿñ0Ì{aBg¾ÎÑߓɭa 7kä’¹¡ó#ctÑÜ)*9#‘“Ž=ýG½Xh¯Â±ÀÁ^O¼éÈPxéÇÖ¶-ô/°Am5ô±À¡RP~þzGãÅ]Š+,G{wgv vÛ•‡*œóχÐWu<7¹ï;’®›÷UÎu!¹ ±>Bd(Ü¿¨Ç8äž•³§Y¤+]³|ÈÌe 6ŒçŽ?ºzœúu©ì.£’ûΰ²òãP¡%¸}¥yltïÇp•F×PµèKÙÄë ‡1• 1´0bN=ý+¢œ#ºþFS“–úÜ^´›t«XÔ…ùn®c 8ä)ç¸äõõ«kv¨ešö튷Êî†e9 "Œ.29>µ‹öû‰¥m³°ÉÝò;ñÐc?N8© ýàUŠ8ÃJ +:dýÆ»¡U-zÿ]YFêÝ è‰¸)y{ÈØdBä`ãç¯=9t–­uÚÖÄy8X”î\s´“×gY–rÏé'»,ÍèÜoóéZFñ•K@…HuR 0ÁÏ^+²›Œ•ÙË4ù´3õIx Ò:7tŒrrMP»Óa¶sŠDh˜2nÉ$óùšÞQQ»™•‰P ¥ó#œÔu¬÷…®¤šS÷WÌ㹎§5…ZP“Ó©¥9´c]Ç÷\áF1·±ö¤ŠÀ-¨ÔZ2ƒqHS¯wÿ>•-ý¼…Õ^Š n ƒž¾ÿ§J’[©®Dƒ*£äU(ôÕÂâ¹›gO=¢¬S²Y3Êijõ>ÕmÕÞïPÈ…_j©ãû£­,òˆ“q“‘ØÒVŒJ»l¯p‹ÎF=ªµÃGåɤwÿ ²³‡S)B{€;Ô ’œ•ÛŸá¥a4žÅÁò»²´{Áäg]Ã$‚ÚEžòQ¬€†a’ÇЬ}…sÐZûõ¯¡j#JÔ¡¸ubˆà¬FOå]8%ì«©³ Cu)¸¤v~>¼½µQ¹vKpc" •U òx1Éz<×Xž0ì>b¿¥zwŽüA£øîÄØ4rP#X€v÷C?‹Œ€zç¿Zó¹ìæŠW‡Ë?)*Hé‘ÅkšÚµ{ÇUý\YwîèZZ>Ç«ý†æF•ʺ _©?þ£U|“k Y¼€k¬Šíàha‰PO_pqøW%â‹Û;Gg–ä,…I ëè+èkÁQ‡3gFn£µ†k>#H,~Ó†ÛµFî•åž g{Ço,fÜ1Z:Þ©qutÀÌHεeÝÎD{BƾO1ÅýeÛ±ô8,?°WîSÞ¾´øí¤š"èTàž æ‹žJ>øØ˜¿åšãÏß¿ãRÙ4×–6Š»`3t¯"NZž‹¼V„ o(FO {YÝ,bW¡äWC é&—|C÷ŒÜóÜóïY³M ¨ò<ÿ2M‡ÉÎåÎô®‰ááݳ(Örv±”ªàœrSžÕq,¤”‹tT%äXÉÆzÕ»M1Úá¬e@c.‘{/%°~‚¶t¿Ø­äj· h#‚k™ƒã!Kí»¯Â,ª=…:ÑŒ|ÊZ.•$Úݦ–È’»£VLe³Âž9è:¹£Î°i÷z„…Í`ZEÈ“–%G#pׯ§¦† ·Â.í †TŽÚâå m˜`0qÃ2z“\üwr-‚ÌgY-²Ë·n œqŽíé]mGÒë¯éó1꯸²Úµ­…ÑGó&èáç!òÜðFÁÇc?*¯'ˆî.dxÚwtD9çžø<ð0yük.ÖæX®~Õ!|¾pB8®äu­ËdDšwpçåxÁ,F2¯Bª3’§»¹—4>dŠåK:¾•;ä篧LgÛ“Ÿ,R@pÄ·Ì@'¹ï]àªÒãÈUǹãFëNYTy®Þ`lÇŽƒùó×·zε -7*TÌR¡X 9Ï^¦]ÄÛÑ»‘޵fâjÞH%°9#­0Ió \R‹NÇLer(-ÃG‡]­ß½)‚,e[&¥sÉ)‘DÉ!nqžô—*Ð.˜èÔc>”¶>¡t¶°>X¾Ò£­(qœ…ÎB+cÂ-çÌ4û(Ù®ä•Hl`cê9­¨ATª¢È­' nHÞ²ð 鮺‚G¸ ŽËü]ø<žsÎ?À×<'}ovæKS’K0­zÓ.Öf‘IUèœƳu=OBdC}$14kËáíÜšúØ ;…ž‡KWŸMIuñq ¡ÄÅûÚ¼óXÓ¼ùŒ“–f'%œæ½7Äð&Ã"‚GsèJóïHÖìNG$œzÔf0IÙ•€“i4r÷º-±m²¯>ÇJoÚ¸nõÈÎkRižáÎþÇ®* %*CÂçÏJùª¥.‡· Íu1æÒE¼¿fÈÜ \ì*½®û ™RÚ4gò°¬N0OÿZ´.ÞG•\#9GÜp?ÔVvrEªBÓÉùÄÊ>ñÅqJœUEÊ­©× ^:öca%Êæf.ò˜Ö%Vcßñ«‰¢Ju··„·vYP¯-›¸íŽã¨«·úµ¸×o…ÅäOZr¬,«÷˜J1·®rs×Òªx®h"‘ãÓ`’Ü2¥0óU—æžéïY×Ãíw<­ … ôîAÆ3øæŸ´t¯N=葦ú¯ò,jóß‹Í:v{]Ëù÷HW¶qƒÓס®sNf6a‘¹–F~Œ@F;ý*V»‘’æãrF×2ˆöžËüYôè?:¯;DU#¶“8r[?Ž+Í«Sž|Í”â©Ç•!×(R ÇswJd)v¬'*qлtúóV¼åHB ªø!XîoaNºfŠò•guÝ_z––ã»Z ŽIY|ã;w‚Çý‘ýM>%¸Ž_) ’ÛxOñjŠÝ.¥¦àâ#æÇ·¥X·a]¡¸'©ëš¨&õ¤¶]ùÿiºŸ­N%ŒDñàåÀ ìzÿJ‚Hƒ|ÃSS"bäôÈý+x+hbíÔ’Ñ%GOß±,yTäĜ֯½Ð´eØI!#j±¨š'6×q÷Žx^½ªõ‚£¢Ê@ówïfëÜãùt®ŠnîÈʤl®Í;)á³Q3°/ŒûV¶œêÄß™ ³ Û %Ž}9ãüs±æ—v !¯¯Ò¶mV'‹zÍžù ôéaæïnÇ hÙ)–E’{™#9á{ö­Eyj$Œ€zçðëM·º $Ÿºª2I©.MåçÏ*ˆÃ&Ü+°%yìÁçð#¿Qè9EÇEvq¤ùµ9»Ë9-§rÀXðqP4f1¼ŸjènlcŠ3q3à±8-žOSUD1•8ô® ˜zçTjèS·Ñ¯d´þҒݾÎg™ŸâÇêibЯ§¶y’Ø·€¸ôçÕ¸-Öæî(•#V-…•ðROAN·»ŸNyŒ Ÿ>†VUì=p{qMR‚è56úþ²XÁµ­Ö0Ér$2;ñʨЭtþ–;ýao籂Ì,j»-ã äã?1îsX®mÙˆ·F Ôy¹›ÜšØÑ£È&<ŽYš·ÃAª©ö1ÄM:mF»âåÓíÀ¶pîÊz>0=s^oª]ùÎpØÆrOzÐÕõˆüÖŒ>vœžâ°î$2ÈN0¨ªÇbÝM/±8L:¦JÖ8™.F_Zµ*G €„` < †c¸jÑÁ\ža ü—S’¹Ú­ÃŸ[å¹$ƒóm$ úgü*¾^c¹˜ƒ€>ƒÒ›“úЍ¾VCW,IIº]»ð*öæŸ][9µÁp rz'<çßÚ«HÇ /¦wg§½[Ó¤-Œ±U$ç–'©ÍiˆRøK0‡ÉPÌ9êÇéWÒí­ãPK5û§ÕPÞP.Ä,Iá‡oz»e vDHÉ ydï×ëÒ»©=lsM_SkLER­,›æ1ì@*;cµ¤’yVÏq.Ý©÷”ŽX“Ô{ÖUÀÛû‹f‘²~\½×“ŠØÒ¬ávY÷cò£dcÇùõ¯^…¹l:¬Ÿ5Ù™}o{sp%+ûµ\$nžàwúÒÛiªP½Ë/ ª9Èäãœt¹­T°InxÂ1 ÷Î9§Ó¯®*§‰õk]#O6 Êù;}Í¥'91Fr›PF&½ªHH°ÓØ@Š»§ßaŒ[Œž§ZŽc£¿¦IªPÄÈîKXž¬}MYŽCŒm¼Þw)93µ¥ÙQò©¥ÖÛO„$lãIþ•3¾6¨úâ«m‘Žâ¹=Ëw§í¥„Jœe¸é¥{—.䟭C<Ž Œ·¨¦òßû¦H¹NGzÁÆrf±h¿7Ùü뉯.By1ÅߑԟЊ¿e¡Mo¡Ú#FÍ5Ôªþ^2UHÏOËó¦]éò>›­© ÷1©ŽI$û]TWïf±ÜÚÃaÇÛó´…Ôrd ¨*I½q€kÓ£EJ£æíùëùugh+VУcáÛ[IšBíw@Æ-ÙƒŒ cŽN:õ*Å–›c<³y°]¤VñæW¸Û;çqÐõô¬Øu;-0«ilæi¤ÅÄ×KHNI ¨ }ØöäTÕ.g•¥—T¸s);Ní±$äŒ?ÃÞº=¥8ÅY_ב‹Œä÷/›‹+{yu8`´•Ö0ˆŽe¾ó1* rO\W'c9þÁŠ'¿>dº”ÓÜHÇBìpGLœ.îØçÖ§ñ%唚C$,^pûå]»Ž=ÉïÖ³o%Žâ6dŒáË7ú Ÿ©¯3U:¼Ë[/ÌíÃÃÜ·wùÜ]™n AÔ¤º.œg²ý9ÏçYnÍe®‰R"2qË3ùSHñÌ» ]˜<±Î÷¬ûÛàHÄ3"l½kÉ­RÊìôiÆå=FgI<¨ØlBË‚yõã¯ÿª mÃinek©šy‚Ýp1Ey2—<›;J)RCH,cÆ2š —a|À éQŠšÆ8äG— ²®¯J¸9sZàímQ¢’ì}ÇPyÅH  $óõïU!Ê>Á lðH<ý~‚­· ÆQ]Ðmœ²V`ãß½8ż‚G¦µ‡x^Õ#FËÇO­tFÉÍ"¥Ái$ÎÐ1éRÃx B‡¯ÌqÛÚ‘­ ´2y§9žL!ÈíR”Ôî†Üu-ÛÏ$ÌÛá:ª§aÛžæ®YÊ0aT;äVQ÷}ꅲ¼ÀÌO$tßε4µQ!bìpk¶3zîsTqHÛÒàW•!‚ÝwÚ3“Üœf»m7C‡Nc¹tYLy'o}ǦNGAϸæ¹oÜâhí"€K)}عý+¯×50¬e™QVÞ0Áa †OÈcŒdõÏa_G„QTù™âbe'>Tbø©m´m Ïo¢ç¬|+9=¿Já®m§ºœÝÝHY›ò¶u»»ÝrïûFìŒcñºŠ:`zûõæ©0 6\©º²ÛÝ;0Ñöpß^¥·?Ë«%Šô¦ÍàZçögG1XFTäóÒƒ ±Âþµ1€/Þýh£.Ø £,Xð­.T…vCäDŸ#¥¸ž§Óžµ–Ò[¨T|–_ŸŽ <‰î¥*°‡ŠzwÇ­NÐp<ÀTã<÷)'з+7ú¸¼’ËNŠR‚+¯?(Tg;‰;¿ˆ94¦i¯-e0Ì60)æÈH%1ëסªË^jRJ’QÄH#P@“ßÚ¬ÛYȈP±”¡\–ñÀ™®ª~Ñ·~¦öi+cÂ¥w6éFʸŒÿõê¬ÃkµÔq2È™ä›ÿ­Ím8²…°ÛÀ B€¿@1õª­i(•„19U8 Š™Sz!©¦ô1.ƒ,ÖÉr«””LÙêx</Ê’æÂ}BäÜÄ‚8p0ãÏøš³©n·¼IZ6Þ†Þ¹ô¥–öòþßìЈ!ÏŒíôÍqJ4îÓîtÆSåV0ÞXã‘ííÕCA‘ÈùG¥eÝ£(0qß5¥¨X¼c*2»‰Ëgq=Ï5QávÊšó+)=ÑÛNÛ£.T(ا_jj¶IéW.a:Õy-™ŽÐÞخ Ó×C©I4G‚W“Ö…P½)òÅä@€\[ãÚ£¾zɧC©ŠÍŒóê;Sé €óÍ%ºv4l­d*nÈ%˜žƒ°«ñ« iHÝŸ^•›c~­ Ž7 mAêO­h¸íÏ^ÕéRqåØåª¥Í©v2¥DÊAûÍŽÞ‚žà’™°íIf>Pª8*vØXâ»VÇ+# ±†_SR ¥ ¹ $ŠXm Fz☂=˜ÂלUÍ>Uɶ‹g26zuª°Û´’1Œò1[hÈ©±!U®ªÝïs ³ÒÉzS¥‘R Alƒ¿ëÎ@ZŒû‘XºÎžö‘<ÍaG+ë]RèFç$q¤ŒácforÞÙ¨g‡OTcÎG‘ƒíP[E+³t±ÚÛ'ŒÖ„žÔEšÝ­´…X|‡o¹âœïdt6 õg?¨ÙÚùA’%ʾNW­P”[ª²EVôÖ¼öS¡"MÇæ#æƒÜqùU ¢*pyÏN+†¬%Í{”奓0náÇË·ð™x†>™ëÞº;Ë"PÈNx¬‹Ëq!É\{W“ˆ¤Ò;éT2¥PÝù>ÕVxÈɵ_’Cò¯Ö¡¸Px¼ñ^tàvFKc2H¤\ŸçÍ(5bh¾R£Œô$T ŒõÉ84΄îµNis¸ žjT…Šðµ,VŒ9Ïj#Þ¢æŠÜžÖÊ;iD±œ|¸9=ÿ®6C…äÔPÆ÷O”Õ òŒgëïW¬4ó+„e,Ç¢ã“^…*}‘ÍR}dOmyc¶Gzšeܱ©æÒïáw[²äq‘H¶“(Pýk¿ÙMnŽ%8ôdh¬|§Ž)È¥ÿ„â¬$3Eãwõb+µÏ©ÆÂH„˜ÆFzRáUsÓ#µœÁ3MeC÷X~"¤[‰Tåd¬¨îJãæ'ð«PÜqœûõ´j\ÊQåÜÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ü8ñMÅ…Æ M¡RÃï”éTFÓПάié7C̬HÈ+ÍT$vò¯±­)Ê£æVgN1äJ/BοçLûP7¥BÄ©TU‹g†Ã,EŸp'ÌéÔ~œÔ§&÷)¤·îÙ_LmI c™6!#¥z‡ì·ñGUѼAo¥?ˆ.­M£ùö’ÇtñÊ@Q¹X`Œ“‘Ï|ñ^]©]]Mj-¤›äóYö…Àã8PØÿhiw1j¶¬‘L gÜsÏé[a±o ŠH«¥ºîº™VÃdž•9;7³íØúÿ[ñN¡§ø„Ok%¤QNLÉohŸ»·Î¡bTd ŸºZëî|E¯üoñ­¥ß‹üI§ZÌc2Í®jQ¬Qƒ¼ò"mŽ$ùQíO”gåÂþüVÓ¾ Ù¥Ž¨ÉÓÀ#uQŒ>q¸÷ÚFÐ@ìƒ9Ú+¹k]Y4ÙtVM¾tciiYCÆÃî„SÁ#=ˆë^Öo†YÆL壜=èÚú®Ë®ÛögȪoŠJKÉßó;?Ûx_ÃZ¼Ö‰qksh!ˆÞEkj{˜öË€ûUcϘÊÜ=u<_â[Òl!ð´öN¶ðÁ¨é÷w^t!@ð mÑ‚~fB–”áWjÕ½7á>»ªišGÆIµ(¯<'«ø¨iÒÝiñµµÝ‹þéæ‰Â§— €è¡Ûå'•F3éÿµG†t?Š~6ñ‹<¡Zx3ÃzN‡÷W6êÒ.©©¤K\îf&ØÜI÷Fàx¿—Òu(ÔU"¬âÓW×U®ÝOi¹J›‚þ¯¡óõ°ÌêÅ„»rÊÀ€ ã€cÛ¾O<‹yµ™¤Ú^Ù*Û:Âën›[c${‚î‰9%ÉÔãÔh‰—T¼½¸³ÑÍŠ¬¦Afd%aS·+–n îçî¶0êÙåõ¨Ñ£%Ë'¤ž‰)køK£ó±òxœHÊNûméÿudx¦Kû+1¨XJû•E‰B¡‡žq“Ç9AÚYÒÚ$-,Ž8Ôd³à zÒ*ù…‘·mÏ(ãÿ'5ôÙ–›a*`Ü–º=uŽÍ;}Ìå£9Шª/øs!¸Ãò(•ñæ’dEU|)$9dÎGÆX4-]öaÙ&Ëy÷™ZVWnl2*å¾gÁvRí´×¥øÄÓ|/øC¥üñ_†´»½JâÔê±ÜÚܯ™Ȭ–÷+R‡Ë̈N…jñÏhwÚ´° [Ê‹+PpI8Øà qÆ}q_¡pnOGåwæ¦ì–Úµ­ß]öG&;’Z­~ó˜ð…•Äšª­œ` (;@ç×ÿZì|AðŠ mSÄú?‰ Õ¢²K{V+2 ÙA,‘ÃñÖDFèQØûÀ×=á—[+yÿä2#¹eÚOÊÄ‘Èd˜÷é^Ëû2[ü<Òµg¼ø¡©é3è¾ ·ýô÷RNv×ÑÊ]L{œ3Élñ˜÷,Í«d§™èçÙÍ|gB• K—V­}ô·W·m…B”k9si}/øœ¯‡¾xšËáæ…ñ?hv¶ÚÖ´Ö¶vÚŒae;v“:›€ ’%*Uñ¿ù”nvÅ/¾м/3iöWZÕÔò-¾­èqŸ²<ІKˆÙ›‚ñE±Ø¡pwv5êÿ¶ÎñsGÖ¦ñ~«à-GMðPÔ¤³ð^©c¥-´3Ú¬/—>qæÂ#+–’c÷Ë1ù«Uøû¢xzÆ{ }"êâ9J·Ù÷2gi݃õagžcœéƒÆb±´¥Š­V1…þô{=/·Þµ7YªtbÛﱇ«x*=â ! Wó>Ó*ùÉT㑎O¸«—âÑôñiey¸Ø2[®H>+”×ißjב=—‡lP¦µìŽÈ1žŠT6ç9éîs«¤|qÓ¯´›™µo„zL·’j*æÎ8ãebUpü@ 6îzç²9¾ Ú¸S‹³{ÛËïü¯¨cªÚþ§gð×Ç×Þ ð„:4hÓå³Y⸽’Ì,±«ÉlÊÑ͸ª7Ëæü£.Mk=Œ÷¢M Û,—ž_˜)rÝâ ü„óÅp?>#Ùè[èͤ7‘¬oæØ§ïPQ({‚GLã õ^>;¶²MWÄ>šîYäVO9Æ"$`aXðxãð+³.ibdÕÚv¼µ³éfº|Ž®.H%rÿ›Æ&}G¥D·Œçp=)——®Ú¸\.åîFFj+uw¹H×w U̬>[¡÷—23Ší sÓ¿­[†I’Â5½HIŒcžp3ŸÂ©\ïk托¿nG×-ÍÛ«À«r’”€WëSûÒmÆö²%Ñu}OÂÚ¬z¾œå9A_ö°sƒ_I|$ñ城¬üè%V»Ž í¶PÐpr½ˆÈéÖ¾a–y'O,¿ÊMt ƒâ»ÃÞÐ5Xµ%žK}jHoU<ØØÀñA"îÝU>fð³œ1lme'CÓÖC•y‹‰&|#¨8ã¹§|Q¸†ÃH>{$P÷$X‡· lR•ù±É; d’‡Ö¾O5ÂÑÂñ­4ý¤®äû¤¬c 7^ŒâÖš%ùŠ>1üLøµ­ZZjŸ¥:UµÚfA¨Í,¶¶¬m N`pèvÇÁ3²‚­¿{â_´-¶ƒu«Is§ÛÞI0Qomƒ#{ä$xáy\ áT8®×Áþ%‚×Ff¬62,©72|’$²ã• Ž8Ï|Ô~x/Ä~Ó§°ñŵö¡u©¾Òîn@½µ)<"#ŽC&ÐKÿË6ÜyÂb²¼]Z4ìãUé}ö½ï¥ºèwaf§V3•ÒŽ¬ùh[¡±/wz õHÀÉ-Ç_A]§ÁO‰Z€›R²ñ7ƒ­µH®m;{¹bw’Åò –0$Tc€~øuëò÷ñ?ÀŸiV²AnÏepÃ|ˆ¤´ ‡;ã‚FEY´Lð½ÊÇkg~ïc ÔÜg‚G@0<ÿ*ÙØ˜·Ïî[Kë}WCÛ©ŠÃV¦£zýÛë¿|¨^éZσFûHÙ¿´þ!éµ£ÚTcjK åS OMâþ ×>C¥ü5Ðn$»Óu{›ÝKQԴ݆Dh &4òî¤[Ä£æ%ÈŽ'Y™G—^ÛB4Õ/ïlQfcþ‹X#ªI=0½¯&¸½OUÖ4bšˆEÌB òŘåþ} íUˆ§R„q Í%¥÷òþ‘ÍK F­ýšKò·SÛôÿÚJd·Kï†ö½ñxí&°–úHXc’æâR_=Ãs2ª_G'ð^ªö³ñ$wVs²`‹ÍxÝîCÌFÝ¡HÚÃæäŒc'ƒÅß{ªÛÄÃ;Ë÷OEq:ß‹$ñ-´qÙȳy7qO$ð¯˜-â\³@Î6`ön„f±|jÒVá,§Ú&ýõ¼oóJ¾˜=ˆ‘ë^75ö©Úçtדî{xL¾4›¨¹Žšöæ=;Ä’[yíªÌÍ Ñ@¹^ÄuÚ@$gÛð¬/êöW×Pj\öžu«yh¶¬Û±Œ±b§KgŸçÞÞ…'Æ[¹å¶ñfŠl-!Œ®Ä³DCžx$g$‘—ê3Á*QðãUÔnRHlc{ya2ɉ„f6ÜAÈ9G§ƒÀç–"ðÞö—}t:£OØÖÞútÕ“|KÕÒ%³¾™f#|l²Èž¥Cñ»Á'½r¾!Ô%Õ§Ù-ÍÔq+Œ<›w‘ž3Ž1Œü½+«×>_i6_j¼ñ•ñ”󮶆SÜ66ž‡Œçã‘U|3à¦Ô,âKïê:Œ²n•#Ó® ˆ§A¸¨Éby=0{šòqªI897øþG¡‡T¡8£…Õšée– uG•bÉ{Ž0=ÁýkCÃõ;ˈçÔnÚ "óM̪äî~PMz>‰ð^;éWKÕt4ÉüÆxÚò\ª©³ÊBnÁãpùHçƒÌú‡Ãk¥t‡ñ:¦cp!NMMeÁeyQWwycæFÌœ™£—T©56¹›Ù]‹ž:ŒaÊ»¿øcÍ|aªY‹(¼á%Â8Ìó.@|u ¸Î8É'òî{ŸÙ¿á>¤ñIãëÔ1¦ÌAHÈè:à{óƒŠï|3ð—ÃÚLVÚÚABq%óܬÌnÁ%p78·€õ3jú~¹§Ç§xWMKa "úx_0 WuU…†æ$©*2€ò[ ëaòºÔñ”ëÔ4›²KE»útó<¼Ng ágF–‹«{»ÿ™ÎêžñÄTE¨ëMn¤0E;îlÇ-Ž3œÇn;-;Eðí¿ön¢ø{ì2ipÉ#j/~«¨G>W”Ws»0o”ŽG͸I§À–¶‹k€*¥ZdW?0é_EˆÉ°øŠ\¿ æRmuiÞÇÎhVR]RM%úúŸ 1³<ûÓrv(–§F¥íÙ‚3ÎïO­5Ìí<â¿(i­ÏÓmaVVÃFG¨Î)ñ u—uÒ³ƒ’1Ç5oS¸÷ïNópá” ƒÆFhM¦=´Ý}©ÖìvNqåþe§Ci<ˆ]S<öi¶ëòËväãÿ §Ë.ÂV›`Ò”º­[ðÒk=Õô« ˜à™×ïËÇʼ›‘ùÖn«¦Ëa3&åe @e`:¹Rœi©½™*Qs徤'£þ” £’zûTÖÖ÷[šæçÊ71³€ÎßóëIek=ôæÚ@ûIPÇïŸîŒu'µf¢ÛIj]‘YwmÈ'â´´_kº Š-n Dþ*ÄZ4úu ’ûO» ó.ckr¢4'å$žçŸn:Öf¿­«Ky§Ø‹x ~î û¶¯¹­ýì5¥Y™¥·Œ•ÑÞhßôÝgu·ˆl¢š-«#¼çƒ»ž}s[V°ø^ä «=hÄÅÔ'šTõ8È Œ ÿ*ò€pOî)è‘ùlëvc`EPAnyät¯FŽq]+TŠ—žÌâž]NNð“â{ÕÃ]øoG–Úׯ±¬ÂìA·HßÝÉè8ŒgŸF¯Œ|aä nõY£bT®I#ê3ÅxRj¨e#P¸È)r>‡µni>"ñªš—‘c,s’Tœç8Èçšôiç|Ò^ã^ŽçL§–7rOÕ­qâmz Aqx²¤sÆB˜·cqç gÓƒšÇ³øÏã=23Üí(1ìbP¨çþ_ZæaøÉã=4húõ’È‚RñHGÌ;ù²#>”ÝGâ_‡u]8C¡4r™ïUG Ž:~œUWÇak«óò»u_ð§€­Oâ‚kÈït¿Ž×‘Cäý‚Ñ£vÇ€ýìõÀ9àJ×ðçÇ-bÅNm™qöá°›‹Píœ~ùy} .Gn;šñص?] TÔîm›?yâÈúÿŸJkk~´RT’V’/Ö¸ÝL%Iª•[_ð¯Ôä•¢šùI蚥׈Z-[Uñ›ÆwíPŒª±©É;F8ìð2EkkþÕ´* Kú™ºŒ«HªdQ¸W¯þéÁçæ›‰¶škEm íÐO/ÊO>ý½«Ø|1ñ&×ĺdRÙx’8ã@ˆÉ%NÒ»ŽFK|ÄzsÐס«ãd£ASq[Á¥¯vž÷<ʸjØ{Ê¥ýà8ñ5 Éݵy­AT£² ˆj€q¸ç‰$’Ä“ÔÖ'‡ô SŢإ̳HØ $Ò»à\ç`1í^ˆoü'«X>œšT“O#÷h*2Ê1É<’1ŒãœTÖßÙ^>³k»‰$]Ío”]¬8v9ÆFsÁô wôg–ahÞT ¼’]zØÇQ®W£1üàÏø~üjÞ ³¹½¹µcó¤@ãäUË £ã“øÖ–¿ñâîàE¦m`€³³RvÙçi©ÏÍÓÚœž Ô¼EpšŸ‰î™›s l@É=3žp8€í]6“á/M·ÐY"¨ácf¹2îÄV‹ždÔ¥}VŠùwõ3ÆfÔbíBöüN2ßÞ:ñL±Í,Ÿf³‘u™³ÏN€æ}ÍmXü4{(Üø†æf#Ÿ,… ®³ÊÚµ:¾ºŽA$–ßÖÇ‹SZzlaÚøGL…vÉiæÕ® “?]Ù­(lâ‚!6èª:^YWWmŠA;IÀëÞž–×NÈ‹k&éT˜‡–ràuÇ®2?:¿i‡¤ìÚO×SÊsWw!¨áOT Ò‰ º¶qÄ `‘’?¥)­¡R#ÍšîCM;u>ƒR’ aŽ4&UÆ[·V&’Ä –éÏÈ `’^*,°\í×øœ›½»®Ûñà9Æzv«:nq©îî9ÇÓ` ®\EYNrvµÍéSP‚K[ @Ì2[ó¬8É&Esp…‚Ì…ŽFFs^•áïݵ”:ŽŠU ΧbqÄvëÖ¼ëFµ:Ž©Žà¾d¡rN?Z÷-¡²´‹Ê¶EÛ  Uç$d>ý+è2: ³”¤yyµiRŒTGøKKÔu Ô›V™üp#W(¯õ¨ç&½SE¶‘EkšDvÏ@¡sžsÓžäW1à«xn¤yî­Áèª1ÿõWk*Š0Õ÷ø*=‰ÇVs¬N‚rXñØT´ÐÍ"4³9Š^G¨¹àô®ùN0WnÈó’mÙᆡz¥\Ôü+âÝÚ Ý{óÙÃr­^_˜J%HaÁÈRqÔ`ú£çF¹q€2O¥gKB½>zrMkªwZn:”çMòÉY’iïw¡ºtfIþY0%du°ÿ] ã½PÓ¥—X°´{h•­¬!ü„ª1;U[ A+Æ­f|$ð´ÚÅûjäBÑBœ„‘–_Ÿ‘ÓƒÓ$ž}gG[[ˆ¢´[††BÙó[ål©\™8ã¦~9Å\EF–s%„„y££®Þ×ßO-¯Êriâ0?¾“³ÖËC—ÑþAâOÙxoÅÂníTÕmb Ì£$eÍ#ØäÓ9úÏìáv×IÿÖ¾†ÝÓ;¦NN8Ɉô¯IðÆ­y G}ªÚé—‰^!¨X®>Q ÁÁÁúP*]ÒàCo#"ãsÆìT³g‚Š~eÎpORô5òtx§:ÀMÊ…f“éÓ_-—È÷ÞE€ÄSQ© Û¯SñïQ„Ã<Š_soa3К±Ý©Ú¯Ëw79ÄÍ’ûF˜¥Gç†kéÝ›;ŸÂ‚PI5”mi®¡cŽJ¾ÓŸn B’nbúf–<*Ú¿|ØÏ¯ÿZ…e«}…¸3[’91ääOÆ©]êù÷3»°èÌåëQíÚ¼ö"‡]˜ Jòµ®%kÜ'Q²+ÚÄ;Œšr’à)G …ŽÝé¨Xtêiå1¯Gã¸ÏZL·V°8¡#;€ü I@0' #x‚¤@0rÛ‰ÉöÔÒ€œäþ¨:MÆYR¡wvŠÓ¿ñeÍþƒˆÖ¨`)u|£üsšÎ¤rÀŒzóW“‚j.×щ¨¶›[ጊ¹¡Ã ò?Ú ©ž~µL«ô«¾¼ºŠ3³Ç Td⪅U}‰ù!âÍ6=*}:;çɈM´—=‰äg¦}+#UþÍ‚=*7X’$ d`K>cǾGá^>øbçG“Wµ·’O6,¬ŒùÁ=Æ;×8~ x–öI&Ò¼#î4¤&ãè3×ù}+ÔÅeÙ‹I8§éØã¡ŒÂ+«ÛÔ䃨Ý@lôÅnÅðßŨI¦Éh‹,`Ý(ÇÓ<Ž*¤ ñ4Ú¤:IÒeY'`#fRƒÐçÓ9¯7긕kÁö;Z/i#Wá_‡î5}a¦û0(‹1¿„õãߥ{Ǽ%cBƒÍ'—yFHö•‰ð‹áD¾ÑŽì¥ç‘÷ÈGÝSÇÞ½CFÒ ÓbòUqÏ8¯Ð²L²Xl4\Ö½OŠÎs%Z´£¢Ð—NѬlm–(í“ Û€+Î}sWYP Ç´oHó–äö­ j³ÙKzŸeµ¼¹HRõðKœIÀ'’9þ^î#‡ÁCš¤”WçeÈùøÆ­y{ªÿÕˆt=Vñ&£“£Ù¼¯(Ë0S„^¤’: ž+Ü<ðÿGЯmî4Í8nb´Q5ó9³–¹åO¸#Ö³~|6½ð?Û­/î ¸iÜ´$òØîO$9ÆlסøjÕZEºšÙX(Ö䀂H%xêqÖ¿ã'ž>»£‡Ÿî–Í_[÷>Û"Ê•óÕ¼ûô6ÂÆÚCøGPŒm[ÚyàˆaÁÜ‘„ù†pP‡Ÿ ºý›tŸ ê·:üAª[j ©Ì–VƒM  m±#6íûÈÝSi8°E}*÷—~¿Š6)¥HŠZ€b[ ±ÛCë€+ø§£jú†³o{{g…RG¹»{Œ4n¦3¹å< Ûâ0y¦>•Ò§VQŒ÷´­øsèñ -IÆS¦¤ãÝ{m iÓÞÛéú‘-Œk°´‘Ìá¸:vžÁ#Æ+~MÓÂöý­ô×J·[c2 ùÏ/œãÞÉätÏ|ß°²¸Òï಴³h有æÛÎéÔ’w¼+¨Oiã°· ²Cqö©Ãpy,CÇ8î yõ*Y®gÔí§OM‡'¤ÝÊš¯ï­Ú´¡YšmA!»sÎG·ç£­,ÓCý¥¦T´[4€ç ÷sއNòxJžóh¶XÝ‘p<ÅÀ ’<ÆëÀïÁÆ{vM7Å7_Ci¯Ø˜&&$w ±Éà‘Ž½:à`T¶ïx«šGMøÇh\qÐÒ̾\Í9*ØÎ1ŸzÂÐH º«rHnØíõâ¿MI³ÏiÞˆÒÖ4‹—cò/§¹¨ÁiK;¶I<“N»’K‰·;òª8ôö¤@ã½9[šË¡/E¨‘ôüi%)ÁBŒ I¾üjD†ð­–$w¦† Ûš”ª±Ž”žZÐ;¡UƒtÍ-"¢¯Ý´(¢ŠF,9ëAp;ʇû¦¤²µ{—F2äp=iÆ.R² Ôb£JÁœu©--î–å8X¹`É5ÕxoÂPêWi§³sîfvŽßZî¼ð»MŠñu-ó"˺5nvÓñ¯k “VÄ4Öˆóñ Ü×ð—†!†õ ·B¬r㊹¨xw$ûlÈKÄR‘·Ó®’ÃK[K2ÿ@¦G§›«¤‰S$œ*ÿ…}ä0ª4”EcãåŠr¨ç¶¦à;xÿuóo~áË“×'½hX|>}GZMBሠ¹P£°§Ö»‹Ò΋Êù‚ù \Çä¦+ª0Jè㩨ÞêT±ÓÖÎ%ŠŒ3cœñÈ=»ñN•nvåœr}éJÆp95-¼7S‹kxG`J¬K¸·ÐOÿX滳‚»vG“›,øv7ŸÄ6¬EË\¨Àˆ¾yãå·Ó½}áŸ:#ϬéVWßdPa2Ç#"HÊË a_i+ÏO”šÏý™¿gXõ:ø©MºÝ°{i6±dO”®ÖÆÝÙÜO>‹Ÿ½_CÙøOJ𭹂Þî@  *²»ó‚s‚Èsøƒ_Ï!q†šª}}Õï£wÖÞ›yŸ¦ðÇâ#UªéÏ­­ª^gœiÑØÉª_³Þ^Fû®œ¥Ê!€’2Àç¦+«OZiö€XÛ©]ß»@§n#qÔóŸ­t/áëA¨ÞK”ÕcnÈ pOCŽ*kK;›Äcom£¢ŒÔ, ÕÙü/Ô|./ËTµȧvù$ȓ۶+§ BŠÊv¹•j’¥IÍ+Øä§Óõx<ÉìÙT\~u“#8¯añž ]i2\ÃqùWgqá‹?é¿e¾ÑpÃ`dÄxïÒ¹ÿÄŽ@··hãµO.@Ìé;ˆÇ¹ãÚ²­ƒ•›zšÒ¯ ­¥±sÁþ?¾ðÍØ½–1wa˜|š÷/ø÷ÂÞ ¶Ž}2ú ÁG™N9ã¾+æû„hñœ¬:y?øU¿ Qµ%ƒJ–UiÖòÛß–g8ŒOf×2yŘe”1Qr½š>­Žòß– ‘Æ nhºH´´É™ÜÜy_~zÀø!àŸxQÒ<9´†k’‘ªx?LŸÄZ¼éy$ñ˜ì£¿Ur‘äȪ>ñ;NHã =sßèü/áK¸õ M·´±‰#–;mìTÇÍ‚£žkžð_ÆŸn·Ó¯â }R†$ç¿^xüq]f›à‰Ðü"o‰ú×…¦°ð´ò%¥ü†5ŠæRLI†0<äü£a#'"´…Z•à¯k»v©Â|Ïs†ðþ‰y¦$:…þ®ŽÒ2»@—$`€¨Œ’F~RN~ð t㨲øƒe¥:ÝkzmµêùAQ¦'ƒŽ™ Ø äú}+–m[JŽ ÖÖ?Úf,¦ ¤hÇ$Ï8É뎂²5_I£M彉hå ɨd ¹vžîyéž¼W#U1Rºÿ#XrQZÏŽ>%|;Ôl¦Ž"úÁÅ«²4‡|NTà³|ÇpÁc“‚1êk̵-N(®†™³§ßF®E¤ö­Â¯,9;v•ç* àšÇñ·‰!‘bxn·¾c³(1®{½~€µGÁ~$¸¾µ—EÔ4Xü˳±. æL|Á‚ç’W'Œ}޽붅§Ï¿s)Kë–:v?fH#¹*zëÒ™¨;“>èÆ=1EÐÌá³Á\ƒ×¹§ÞD~Ç ÇÛƒÅAI^ñ]Z4Ù9¢N-b1‘Æ{RÑE°1D’È‘ ¶zôôà8“íZºg†õU±þ۞ɒ)d/"à1êHõâ´¥Jueh ”£M^F\±´R' ëëRÚêOf `IPô.ä÷ œ§Oj~®ØpŠ­W¢W§S@‹N$×ÚôñyIªNñ…Gb;dg^Êy­/Rx~ú0+õø¤–ÙüèÁèG¡ÅYh‘]uM#æüò« ýÙÈê3ÊäBnmM±«ZÉ扣Üë’Çsz›ØƒÔûÔÞ0ðÖ‰a§5¼AY ‘œŒàsÓßµexOâ*\Ë ž«$v̼ÁGnIâ¶¶®sÝlÎ/ZÑn¶üJŘ•Œ« œÏáÅoÚÆÐ[XiÐêpÊbù7Û»caùJ±ÁãONÜÔ-k®_´š]¤lÍ+ìÙ àpØëŒ¯^˜úÕ×·¸ðÍÊØÜÜä•€· '–JySØ‚£ã œ§‰ÄóA+Ý¢èaí+µcÒü%¨Mжm¥¬jçrHíÚXÀòàç îjßÔB¶Ñc’´5óºÉöÉ%QŒUSÙû ±Æ v¯3¶ø‘¤Of4½|]½º•.a—s©Áã®QÐŽn3Òé~ Ô5¨ZÜÇ4*Ìm™àÊvIÚHV8|Øõ¯Ÿ© ÎM¸Úç©gefCñT:vŒ–q˼²í÷¸98# äcð=z×5àûËëÍr+I®`}ß.Ï”zás×·9ª~$×ï¯îa†ê4@ƒo$iÎväñȃŒ?bÖn®´=3T¹hö Î5icžDùrpÃo Üã#9ê9«MjÂHדG,æ ÌpL½NNA õíT´Ǥ=üZn©PÜ'ïâXÁåO¯%º•ÁÍxñÃÔS•µéÿïö‘qGCw§ß s0´`IŒ`zœîê8çÓ+ òì£C{u™Ì‹ ´¨^Bƒî 9ÜÏNÕ»eã Ò#7 ÂM$‘–É\è…I;¹V9c'w;ã ü1®iÒXhÒͨ(—Ì·si˜ dîÛÈÈÏ9±Ð:\Ôª.}¯¨Ú懻¾æ­üE­Û¾µe¬iÍ"ÆŽÕ"VXÐ(vØU7à°Ë6ÎAÉjÌÓ¼#ªè^]³FË3AÛùW +Êáe##  ‘ó…]¹=ç…t%õ‹­ C ·&i¥W”Ám­Ï8Ç e‡û5³©h—š¼ZË߇2F<ÅfÏÌcÎr¹\c‘×®ª™Í+´!wægK.­‰INvô?o ¨GÝî*c¾k5ˆðç5&¥bâ"#݇5gKÓŒ°²çoZþ‰9Ê«V?9u"©¦e‹i7’ƒ#ÜÓeI#ùN}kf×I¹bÎb /rZ™´ —"G‰ˆìE5ƒœÖ‰“õˆ'¹ÏÀà±ü¨žŠzÖÍæ†ð™G'µð÷ÀÏâYm­!Pn—wELòOJTòúµk*kvÅR§MÍìŒÿ˧h—Í­kšbÝ*Lj¢|cyéœûf¶k9Ëe*~Òšº>¨ø[|—º^§»´Öþ]Å» 2\FÒE‡ˆÊIÒÇæp# ëþ#»Ö´Ý/C‡WÔìdž×LêÒ;¥Gp]¤’Y y99àãç Q•wv7E&Y#<«s^ýà=+^ñ‡‚ÿ¶“F¸¸y!|Ær# åѳ´’W`Œcƒ_-âf_[’dÓƒ}wNÖ²{Yþ~ˆÓ„qtáRtßÅoêÿ×SÒô¯û SÛÛ¡ÒQ8$ÎN,å‰ä@àmÏÕÚlºu¼,"Ô]CºˆQǘgQòýíÇŸ\t=5Îè÷V:‡6‘í‡ó‘º5 qÀQŽ{p:ôªCLµ¼Ö†˜²L3è,©¹ŸåÊ‚ze¹ÚO¦8ø5L;ö^Çê0®•4íqÿlàÒ,ÚëÂ7w%o.Îa†BþC²ÊH9#iÈÉÀ 3ÍdèZ¶¡¶uÔA,žJ—òKå¢ÆÄ ¯‘Ôƒ’j]OP¸H¯´›©a’(%߉ ØíyúžFÓœnÅ^¹•cðÕÅæ¡aºÀ”ÄH,ãnÜ•ê»IÁÀ!Haòµ7ìé(½_sHþò£’ГÂm Ûx·‹¬Ö›$¹¢ æDŒA¿aÏsÁé]V£m¥é{¥ðF®ÂÐÞ·²4jrø Ç9Ýœ/ G º%µÿ†o.tCosq,j’"¤¨Ä´€d@U.2 ÈV< ¥a%…¶•Ûº°»´F½¶Náò §óAë‚óɨ«;Á&iÚBjöR½ìo(”#|v‘!Ü#Þ0½xÀâ±t‡¿Õ5LÚC*-ˆ%Ný¾CŸ1÷pÃÏwéÞ Ò./÷ßÞ¼{U&ÉY'`~êNѵ$I<úéE¥Å$×wzeãK9µñ$³"¬ .åw¿„‚W’½y©u'Ê×A´§fdß,’8u—ÂÌÁáy\Œ±bvÁéP Fkml ŽIW),ç¸Îzç¦1žÕÓê3±¥æ·iêM×…Ia&ÞL‹òí,qœg“Û2äÉ v ÉæÊ¦-–KTóó(%C—'““éSé-cpt•ØŸJÕo¬¤Žn#Sò”ÝÄ9ÀÆÑßüj#:ý’â4ÓG Æbaåí èÜäc‘ŽÜqNñåù•f·Ž(ßr˜æÄzc§ëžj½…–««/Ûmn¡DU-$*Þã íõÇéXT¯IÚN(º0¬½ØÈ›Ãö±itº‹j3N0Á.f) ‚Ê0À}à1á k±ð¯Å S–M;ËóÞVm×›m—ø\$`ò$’ˆx5æš¶½}á‡hœâX¢Ä~l›âã?6Òx?Ò»?‡~øsñsáéÖõ­:Î;¸g!åF1‘ \à»?ÂI “ަ°uÛ›Z3¡U©N<©êʸüu{jÓLD;Wpr}±UáðËÙÎ-bŒ´‡œ×ß×\ü@ðb´yZ(Ø„I䌀O>¸ç¯·½7ˆüª¡»Ä¶ÊêøU¸2ÞãpŠþ·ú¶™%5SñeWËwoBµ¯„಴DÚ ± "·<Õ›»(RßÊ‚Ù@# ë].™§izÒ<–Z­´ë2f T{âCI·¶µ8ÁÇŠôã…‚…╼ެÉNÒ¹ç:î‘•çÈH‘ˆ ·Ò¶þÉo¢_OæEµ¤M²;˜9é튛Q³WpÊ„‘À Ưùý(Ò4£ ´ÚW…ÍrR¡ì±J¤QÓ:Üøw÷)xúOí;¹/¥UÜÇ;ÀíÐaךóífGܱã5꺖š³Ú²´y |§¥qz¦‚ײýŽ8†æ8ô÷®Ë :’æ[³«ZI=‘Æ-ÅÍ´©q‚ÈÁ€u6;x"Ÿw©Or¢D·‚6<‰p3×8'­X¿¶KY^pvõ¬™dSÊíAé_5>jz3ܧjš‹/{/Ù­ãÝ!§q‘³Ú’YdÃÊ máéô«š K=Ρo…û4&@^¼c¿£‘Š¢¤³³¤ä“Ü×3øSîlû E•ºÔRê*mX»Ðµµ;&*ñ°#¤##Q”¡%$õ@ÔZ³W>Œø5ñZmvlå™T:À‘*qÆyç·S“Šú¯öYøž|5âëêzŸ•§j’€[qÚŽx;OUÈî;õš¾×5MPŽóM¸(êàã¨8õëëÏÙ‡â/öÉѵ»‹˜ÒîÎõZvuB‘Ô>W<äÖ¾­×§Ÿä•°•£yò¶½VªÇÊã0“ÊñÐÅRvÒ~síxWU‚ÓûsÁºwÚf¶I£òà]¡ã!˜yˆ~óq´mþñ‚¼Þ߯ÓêÚPŲC=¸ÍÔFp‚X"–Êß.2X“ÐW}àïiSOö¥Ô’½Ê?Ú0ã&4c•C·q!yaÈÆßá#S^ðO†ü[£{§ê‚ ‹™Ú{É-]cw-–;˜¯®=óéø=l,#&¤¾¡Š”¢¹^ç”|<ñyãPºìöï$þU´ú£2ZÇ'i6Á Û8ù³ƒ‚Ã_Søƒgyâ ½9aûE¤Í¶YYãƒËbɈ!Ù´…!QG8*®y¯|,Ô´íRöûLzJÜ5 íd•WçÇΖr8È Ëï×î‘«Û]iòë:Þµ,7¶WSn°ì†|©P(Æñó’§Žsyªá(ÏT®vQÄÕŽîǧYk }«§‡Òúkæ¼X®­#Ô›*Ŷ£¬xÁÈÚ6€HàÓ|=¬kˆ$XïRò5»"!rè§i?!e ÆPŒ†áOÈH$à Õ5-Bþ+íÄ6IäÚG4,‰‰gË) HÛC@ Pœœq‡þ Yiž3þڸѬ'>S$ö dHÝ›iù<ÜÁÀìGÈ1ž+‰aSn'l± ¤úž‡¯F<<+›D’)”8šh¶EBœ©`F{ž0rÎméqßݪŸ‰¼àf³’çF×ã76êÛ­æ”2HAå@\`ôåN5Ç<:¿ÂìmK·æHñýwÂz®´¦í¥•”†/'–vœz`_×µw?|OÃH¯<7ã-=¾Ë6f’Ry‡!@b¼¨ãpqèy½cS׬æ-¦^y~K2 É ëµI<`ž=8ÁôÉ“[Y§†;›µ†áeq ’|îbGQ‚3žS“Ç|*F¼)ò­Žº2£VWgæÍä1Ì…%<JΚ4·‘¡Ù½Y1ŒV…Ú´‰ˆ›æ=+9÷HÞDœ:¶ À×ôµ_‹E©ùu6íb[kÑk†²»º´¼„ôÁ…uZGÆŸiQæjf+ËdÚLÓZ†›gpà Çs\“Ã"È%FH¤YåÀ,¡ˆÚŠUëP•á._OòJT«+M&z–›ñGá߈Ú´w¶×¹Ø¯lø@kCOñO€dåµñeŽÔb ’m‡Ø6c^E‚ip-Ñ~L3‚}²*®¥§Z„KQ3¤“l¨'ñ<ÿžkÑYÖ2*ü±—àq¼³ -kñ=†ÛÅþÕ®~Ãm­ÀeaÂîÈ?LSøJ DIµm3…—“黯€}šÜA Q†(3ϸæc4ºlr\ÚÃo3,47pï›O_Ã5ŸöÝk§(/ĵ•ÑÚ3hè~%Ca3/‡¤K‘4…®gFÜõÚ1ÓƒëšáñþÈ­?µ àÒšک›*»y$ãnïz˸Im¡–2®ŒC«F;}kÃÆTuê{D­¸õhRöPP½ÇZµÄ3b 6™£ðA9üé«“‘·,3Ò“;†!‡^)„dî’:â¸ÖÆûîH䜃š\O ÏBD`¯‡€q†ÞõcC±´ÔoÒÞòm€º¨y98«„䢺’ß*m•ƒØuõ£æ~öFð/†¯4q¦Á£ c}¿08ëÅaÅð¦M@º39¯by&-Y¦™æÇ4¡+éc±Ón`›œ×ÑŸ³ž‡¬é]ƒÁwò²ÚSn>nIÈÁíÎqÚ¸_ønÂ-t[_X#Æï´oNÙý+Þ´CkcáõxÑcE!UUqÇξ‹!Ë©àù±%d—ܺÜð³Ì|«ARŒos¼Ðüa6ƒgáÛûל™µ)#Œ´›—ª?2|ì§= z÷Ë?™tÄÔØJÊ­æùûºž ò§ƒŒðG°ÏËþŠ-kÅ–K§2\‹YÃÜã-’Be²@ ¿ÀýGí«¨Ûok8/gó#$Hv¸*ëƒßò—ãYÜèUÌëJ•¹\¥kmk»S•9¬/ºKò7¼ay{‡.5[ Io_ËòäµR # ~eöà@8¯.Ð5MãÃÒ ]IuöDiõHœC$csÌ[ ² Ù€XޏÜGGñÇßð[YMcÿ´éû<ãxv[H‰÷¥!”Y˜Œ `tåmü¦Û鶈ÖÐß–l¬ê³DŠ–Ø²)G9ô†IÈ;±çQÂÊzF7ô;*be«±Ì_çê|cf‚îTHã‰ÖéZUS¹æEWeŒ³‚G¬«mOÅ^"×V¿…wµÌ˜w*ÙƒÆúrA®ÄZ¯†5_I§4±}¦þdvœ¼q„pr0ЏÈÚ@ÀQó‚T ÓM¶Ð-Òî×R¶{Ë–;Qˆy#Ã)l“ÓHe9tõ,Nmi»¾éܯÁÆÊJÈúᇣxwIq®[}ŒÙFóÙeòb‚B£ä‡õÏñïÑø×ö¥øYᆇªNHLN_OPÑÂ@ÁÚÄÀ.zg½|ÁâJÒâëì¶Q2¤JIÔŽf|ÌråHÜN+Œçs—þ&±ÓÁTt!GÌÅ€P}+ëòï )b$±NTÕùVþ³ÆÄñ¥x/cƒ…íÕí§¡ô¦³ûkèÚ¥ôÀøJì£Üe}§ol¨ßógÓœ×!¯~ÓzÚê0êž ŠKy£“sMtC!𪀞:rOáÆkÃ.þ!èöƒ÷÷P“º&Õk‹½¾k>`¿òÝXϧëúúÌ»€øO/šn<ïûÏO¹6'ˆxƒgËèg»ý¤~,ÝÈÒf.Nï.ßùñU¬¾=øú)#:– ²ˆâò• !r¥™Žò€y‡'ï7Ï€£p ó+ÙÜ>È¢%¾b®Á®ZNûã'×Ðˇ8r¥7‡…š¶ŠÏïÜñ–e›B\ά¯êzU×Å›Mbsq{¯^Z•ˆ)I­Œ« Î6 §$óÕ°0rEt©7uM6×Çpi¶7–B™Ì~^ÞŒ@’<ƒ\1Œà‘ÕãƒçߟLVç‡<_«ivxHÕÿ³#¼” ¯ çPp¼äò¼{A>ˆü9Á<$«eÑ|ëì»;®¶ësèò~+ÄÆº†*^ëê¿_#âÛß,)KÇ*2Î0!To¢•Š´ˆrñ€ÞÄwükH(ôÉcyã2¬gh8,¾µÙ(ûCЄšÔËc"YˆÈ$ö¤w2E^6`©VLäqÅRžÊHAÉ'¿5Í(8›ÆI•Ìæ&Ü ôÁ¤F-ÎxõŸçNhPòá‰ÓßÝcXµ3k"DË æ˜dXÙ]Á 7ÍŽõ"þè•4—1£'Ý•7¢º%YîV½´¶ÏÒ§”:À–äœçð5ž×w/‘$Ÿ8'ø$ä÷ÅhÎæ%ùòªW“­À $h€r’O½rÕŠ½Ö‡LÙêFñ=«‘NìdŒb‘J¨ÈštJ'm²Üã—vHϧ=)v\K!´YÐ!'˜ßjÃMÍ»€zŠ[¦´¼Žæ à ÞÔÇáRÍ¿ÞÎE"Œ¸>¼fˆ·'Ô›Xõ'âÑÖKÇdŸ^%BHÆ?iïñSÂWÆå®YJðÑ•ù³ô¯)1Ëdy‘¸a†9Çâ8¨%±ózö¿·q‘ŠNϦǛý“…”›Ôôí3ã‡4ýZ+æ³–UY9VqëÿÖ¯eð÷ůë>fÖíâŽ@3ºP¬‡‚{ñÎ+ä½à úÕˆ¯ïmbÛou"©=«l7âi)B¬T£-ÕŒ1YgâÑõí¼ÖÓ«j~ Ô£»ie0Ç2n+FœãâºíâGŒ­b’ZKG ¬*Û€å}§¿lçë_iž3Ö­gK·H$QòÊ$!†AAô5«Å$Mm½qmë…7g×n3ø×•ˆÀpþ6£©(J ô‹VüS±TèfxxòF¢kÍkø4}Q㟌úF—hÇĺœR ŸÈØÁ^PØ,Iê³Àôç-Ôj -ç?aðý² ?»¦û«žäxô¯çâZ¯‰.®ß>ybI t†sLdl–“?Zî*+Ï«™b«;ÊMú³ºž IZ1KÐܵñ[,UT“Çj»ŽäOùz`Cz×.TMòV¢8ìD^å<-nið'ÅÍ%¡_ß*•^K0 ï4Ú^D·JyÚÍþy¯–‚´%©I(ÕÑåb²:uo*nÌúÒÃÅžBˆî>eÛÆÈ­M?\Ò5N-î~­uãùõýkå{?¾#ƒå¸‹pàŽGJ¸Ÿµ!t—($W ’Êç+é‚ëŠ÷)ñF«¶xóáÜCd ƒ¶)¹h`û2ª…gÜǹ­6±W*ÑÉ´Žx¥žÙdrkÅt¬{*jæ_ÞÉ¢tüêü–’JŒc túT2ÚHŸ6Ì}k7MÛCE5s2[`x¥VhZ2OZÕxˆÏËÉõ¨¤†3œ•Í:FÑ›KC5‰ 9¤•K (©eƒnNÓLêBާ§5Ìýש²iìVp¯ÕRâÕNN*묛C…à§šFcrë)AKsE+= ©be;A=;SHQÎÕ¤ð¡Îl0@éX:úÆ¢kR”v’ΑÕrHàcùU¶Ñï¤E¹ŠÙNAŽO¡ÅOS ŒœÔ‰4‘¦Ž^äwJÚc´ˆu¥} ÿìK€Ÿ4‹ž3ŸáÏÿªš,¦•Œo Q„Âd~µ¤óoFÄ*…E(ŽM1¶È0qKØÁìR«>¦göYX¼é‰(`O$ŽÔ˘<¿™2S’ *Þ^2pÇiûËž*;“ç¶Õ\ÛºVRŒ\v-N\Ú‘Çn vŒž0üxè~„i®LR0tB£ûÐÎá[þPN¨Ä,z)<Ó5–̵¨2&d‘PsÎqíC2íÈ<‘ÎWùRð‹jƒÓó¥—{·˜èFWŽ1RÓHn×?'9ÇËŽpi¹/çŠ6ñŸZz¶ìñÒ‘"ÃcÐR†ÉÇ¥"°“ªôõ¤A°ïë@X©Ã~úhÛ!ägê(¢:šZEE_º)h \Pù¾j¨tZx•¥Þã9Ûžµ«udñ1àí$qëÚªM#å?ZûÙÁ-–ŒÕ®fy@9ù1žƒüþ4—*]qÚ®Mj=1PÍ_•³ŠæqkFn¤›2îm˜ò£ôªÏ?0­¯,Šk>ö%ŠUP¹ÜzW-Ji+›ÆOb¡‚3Æ>µÖʱ±0),8ã8«NˆÎÊ ã= 6QòœŽ•Ìâl¤b,RÂÅAü)ñC—]‹Î9>õ¤Ö¡+I ¾Ó÷r>•‡²±¯´e)´¹06€ç°¨%¶x@óS¶En(pj'¶I›çŒtâ‰Q‹Ø#Q­Ì¸¢¨É–)’!›9µ­$)þé?ÿUP𨣖@}ø©•7Ršl¤Ë"ƒ·“ïD±ÊU•ƒu$œp}»Õ•ˀᡋ»,Xžäæ±”FŠv+´AÁ$cÒ¢–a°1ëW‹…aJŽXÙò6vâ¦QLjnåQm]…yÆsުܣÄÅ•H^€žõ¤©½IÁÈ×çk°È¨©;ĸTw2¤ì@sLb‡íÆA5uíL³Äuäüª;Ë}ä²[Ôð¬)+³HÎ.Ȫc¸6@1š]ÍŒ”5$6à Á§z|–Ê¥cŒŸpj6טù‘ 6ÞÙ£w c­Y’ÃÊã9÷ªìíJTÚZ‚’cLJNr:Umæ)sÔâP1œ§½4¢Ès“NeÝMTÏ'?‰Í>ŠEmÝ© ö§¾ibhäMß/uÍÚE$;’LûêªM’A|qé@”ä ÇR+ô>çÊ8i é"ФJ¯=¯*¶ᷞ:Qq¼£4d#åÈã5-_A§vfË KüjµÕªÌAeéZñ»SÍÓ8äñUÚ'BÅzg¥sNv7ŒíbŒÚzcy'ÒªËj@àgØÖ»ln¿Ê£–ÝLóXNœ^ƪM3%•ÁÆÃHwò­5¶RyŒªÒÍcsÒ²ö7Ø¿i}̹ܼŒæ…9íŽ9úÕ‡²“%ñÇÒ pÈpGãYJ = Œî„`ÍŸzŽXN±ã$È©Îò6c3Þ”tf2(Ú2šÏRÛ±UàXâT;Gª-ÛþQÇ­j2m¬½»Šl–êSQ()¤Ó3ü†`>Lâ‘á >SÔsÍ\h@êOåQ9¨äŠÜ|ì¨NÀqøS»8.WSV„Lüñ©`²V}îXœpX石reó¤Š ¢‚ÉŒ÷Å!Ul—vêÞW ¤…”t OZHö¡@=H…)C•ù II 4Y7˜¿Jqˆ+0} )2™ÆzàsQÜË9T‰ egRT·aëPùb¶4³—Q‚|Ý5»©9ÆÂó¨ä…䔯«À·j±@FI?8Î:Õ[™ešá~ Ê]ÔÒ6æ"º¶òX¨”}ÜóQÀ)'ï ôè3Wï­ÈI&1àªíPG úÔRÛ1EB‚!“XJ»¦­©Q$flJé7Eü*ŵ‘Þ¬ùç ö«¦Ùˆ)Æ‹‘.¤S2ü‰FŒSÅ´°°`:óZ %1õ£ÈÉÉSÓ­_±#ÚŸÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ü¹¿øàŸøsQñìVÚDºu„s­¼Ê©$ë¹SËn‘À;€Äž ® þ›] Ýx~ø:>Jœ’ØìÈö¯_ðUýê£=í´2[3©Ûwó•;‡!†wldŽOSŠé[Àž?øƒq6¯á½òM"9'{«‹ :f´²PAÞí*„õ$àr8çõ Þ¾U—9OÉë§i>žV^§ç4±˜Ô”iË×v—®¼â H“êštÑFÇ Î¤o¢­Y´ ¹' Ï5õWíû'üCø)â|6ñn¿áÝRßÃ3À“]SÈ‚äI²Kln-2ኛ›r¾€Mxßü)Ïíà–š#Gi$̓öÉBFƒ¼çâ'.8¯;œeu–’äk¤¿G·äwJµk%V?vÇ›•‘öyAêÆªG©_^Þ3H¶iXrò°%U}OµtÚ×ÂÿøZûíMoçÂ-üøÇ–NåÆw ŽWó¸zŠ_ }¶îFŠîÉ#t—/[í—€\õÎI8õíÒ½zq•f­-m_´¥9+2œ |U­ØiÞ][[ƤˆÕU‹JC(`ÏMêO¦yíVዟg½–þI•™™Â&ìs×ó®ëOÕ#¥¦ÅH‘q„L{ò{tüªý‹øzêïoÙPÈîK äcß¹¯RžY…oUSÎyŽ";ièyÆ£ð‹Ã©jmÏy-—•¥$÷àUY?gýâÔ¤RÌ¥“*æo•sßÔþUìá|;•}s¯x|Å,{f¶•Bª€0„™„€A+ž9=CÅ„±xtY#Vcˆ¦zŽq“»ùŽþÕ›ÀåÒožºj¿:ž?­Ë/Å%ã„Þ.ðÓ+•vB&x®aàŒÔµVú;Mvu >Pd±³EòJg%GB+è]Øx¦xtûýmm¡‡ ±^Ü¢@…ÎŽ'©8'8Ÿâß„¶Òê"C¤[®\¢ÞÛc 9 Êuä¯c>õæUÉ(:²­mî½ü¬ÿCІqRËÚÅéÕ~«ÌñKkKkÛHõ64e—‚·*{¨®ÃDkǶ±Ó d…º aqËú~"¦o‡šŸÃÍ^ãU°ÓQ­ôû–†þÆÿ ,ˆÅY8l©ëÁî1W4Yµ­>ã^‚Ùc’õ'S @……Ž@Aèy?äÖ¸:¥;Ikåµ»¯Qbj¢ºz~7} ] \ù .tÃ+’y÷­`½MSÑÌÒ¢aŒl] ƒp€ªp+ݧ¬äÉÙ•î ÝqY–ñ•e™È¤ÖæÑ)+ž‚±u{y98è85•h¤i;JÇ%âF‹æ†(÷1Ås—к’¬8èEw¶ºb˜žîdÀ#ŒŽOÒ¹}fÞ9/A398ãóØÜ<­Ìúž¾²^ê9iRTsV¯£Hmc–rŽõfKhfÜ€{gÞ«\é¾Uº0¸ ìßê°xuÏAé^O#…Ùè©) ‰%ˆÀу9Hìu˜üý&V`É,e±€ãŠœ«c£8.ørßà·Œþø;ÇÚˆàÛ¦xóâO„~Áqi-♄pÏm¾Õiwó#uËfXÌ‘)øÃÇ>(|1ñÿ¾üNðÜÞ Ô4ùîu+;=N­á{xÌÒÇS‰#dÜ÷c#“Yø­£xRÔÁðÇTñ‡µKëˆcÔ´=+YšUöž©"@aæ4¸‘ʶ$Ù¸ío›åê~~× iu­iÿ´Iüe£x‚³M«ë¾mýÞŸÃ1eùƒ¾Ù• "²Iòxþ7ÚFo^Ÿqëε9÷O¹cÃz¯ì¥ã¯†¿ô_†wºoѵ?K|²[¾Ò²[ùVãb/™°¸!|ÌHë(•G˜x/|(Ó,µ»Ýní kKx‡Ÿ$oiœ£ ¼H0ŠRC‡Ãb&É$b¶| |<ø“ñ~K{[Ó¼?nÚµÕÍž›m«=”QÚÜ8Äp–ŠT@·ˆK3m$*»gñ·Â/xBõ ¸øõ­mg Éj¶2M«½ÇÚC34Ñ,’¤#|¡BÕׄÌq¸FÝ ¸ú=>â'NŒà¹¢›g™ßø2ÒÓu™iÙáv̶¡LNÝö–ÚìœgžƒÓ¿#q$Ö× s ‰V®AÁÁï‚1]Ö“eªjººh‘4sIu¨ùâݰ²³IµB#9#uçŒÔÚ§…|[6’ñXør[¶ŠI"½Â‰L’B¤¨!ã+å;aº†V;¾Ë%âºøš±¡‹ÛÑ5¦¾æy3ôێߑÊé=¹fžWrÒn|ž¹äàö¨µ”kË€ï Œ Â©ë×'óÍ^¶Ó Ú+j†æRTˆÂŒLŒJ±Þª3•H$t%Gñ ÕоøÏSÕ­¬tÍêk›‰„6¶ÉnKË)ØÁó1Y"8ë‡SÜgô Nœb”¥§›8ã~ndŽ ûOë•ïšÔÒ£¹)¦oò`¡;° aÁ䔂§ óž‡\ð5í­‹Kâ62Æ6G¨Wm̬X6 Q÷688e®‰eáÛ(ngf¹‡|lÌêV2¤”ci'hËŸ˜/•ŽÇàp”':’NÝ/«vÑiw©¼\§d“¿¡g^h¯tf{‹=®­ý§â:ÙQ®¢ ’mändòÙ›<T’2¹Ÿ©jÕ.5KIíîì/]æxm$V[V”‚OB2:óÒãOŒÔuohñ–1\i_ÙÏ4:€˜ßb7Žw2_Ý˹¶§8B',L?|«jvööòÌ“XêXßrDøÀgÉ œœ‘Ç=«“/ÅÕÅTRåQVº³»]Óÿ†;êÑth?i¿¥‹úCMt”è"äñÉ$óÇ< çŽka,[fv×5áíRãOºK ÿ% ‘|Èš2>âù‡ÅtÓëvé”±½Är}³^îtçJ÷<Úôê*–Eiã?•ri¡FéœóDûvùDŒt‡w¦Ç-ÙÄxmüÞ»;‰â·RòH {×5¯jÐÛ_4–ÒQßf9®ÍÆ\ÑWFïÃ?ÙãÿtçºÕ¼Ce¡_Ç-ц;m~™¯n£·Å3E—’4ËHeV*TÈF\=Ÿ þÖjž6Ñï&Ö.t™¼1§=¯…¼N‰Û§”¡D[¹d çÚ’[÷rä,Må£|ËĺG„î¼_y¦øONqoc3"µô&'HÈÂFP† ?3(n„€T¸ÐÞ+øn¼›Y„r+i\ ùN0H `ó’ éÛ×Ãä¹Í|$qT¨·}W—–æÇáðõù/gÔê¾.|Lð·Œ3û^¨Övk—=Û²XÊnPKÉùÛ9˲"ñ¯Å_üAdµÔ.ZÞÒ2DVÌÁ,N$à œƒœ“]ì_²V´»¢»ñ5ºHàù1©É8êHô®oÄŸ³ÿ޼0†ò !»’$6’˜çŸCíN·ãi?i:6¿k~šýÇ­‡Æe>Òô¤¯æq‰¢Ì–ÆIb1’p…†9÷­†µÿ†~ ‡P±¹Û,ÀÏjI*ëžx<ÇzrhYÛùÆ•"Kœ(–2nÜ÷æ­x{ÀŸÛw'ÏŒ…,<çVâ5îÇ·ûsZQÃV…Xˤ—Èé©Z”©Ê5µ‹>¥Õæð_Ƈ0|K¸ñ•„®Zi£MHˆ¹¶‚.9YJˆð™·+ ÌŒd2W˜x‹Âº¦ ¦jñjQΪPÛ\3ÈÎ:Ì r8íX×¾E.™àKĺӥœ‚/`F`Áˆ*XÈÈÉí^­¦êžñ>›eöiÚE¸ž+y—t-ÝŽØä`“œ¨Àä×Ðaç 4å¯.«G²î“íÕocç+Ò©FJKÞãó]ÎøHmdEa3L[&êzô'±«šg-..F•zËÐ’¦-¿0lóœžOQøW_¨I¨4æÓÂÖÞS1·WifA<¨=Tç#=riž+ø?áÙô OÇ©E0¹¼©â,Åp¿ë mû72îC¸|„H¤7þFôä½õ÷t1õSyo÷yŽk×ôé­¤*ÈFÜíº½j[¯†Z¦§ë1\›Kë(î-e¸O˜©ùO=nR2 è{ƒLñÚN­`·ÚlLò·ÌÛpp=ýý½ëJ¾ËM¤õ[•NU(Íi£Ùœ}¦— ²7Ú…ßÙ‘ø·§.}~žõN[‹ë ™ *qÃ?lK¥ÞëWªÀÊä ¢ž•äâqÕå'ÏFŽ”b…’V‘Ì’9cêÇ4n¯¥#~ðIÊóÇãþzR²ç½y®û³­ØÈÅ[ƒWö¥´ô•áÆD£w™É8#Ž1øUG·—ÍB[ú?.Ç­ ‘t=”ÕÑ鯓â ÿg¿Œ¬ÿ²®µ]:+½?íÖÒ*ÉçlÑ|¤Mm8t%H;³Ú¹=KÄ-§ji!°ÚFÞTŽ Â3, ^0̧ žNy5¯‰ÐÝZÜêÉ$VÒfKrs#`2…ÈÛ®H9;@â­jχﯤÕîgÒ¦ ŠØ2"¡ !X±Ï#†<Žsïa+fÓib¬¥·÷_š{ß½Î_cB7²vy«^ü:ñn–`Ö£†ÖyHTpíš.AÎý¥A+‘Žä“ÀâÍCDÒ4ÄÒ|f!‹\÷‚MÒåÛ–ápOO› ž—ZðöƕƕnÈèÀy¦Qå8vÜcû:g˜‡Ã3)ѵ „´¶”ûXŸAö#ׯ^Õ­jsrinúÿ‘×F¥%fž‹¡Æ]4p:‰n¥v0²ÆŠùžç=9ã?þº~Ÿ¨kF`ÚUÅÜSC Ž„1 û¼ç¹9íÅnëþÒ¼=l÷·,³¸¸9–ÈÓ ’q“œñ“ÔãÖxsK½…u-ѱµÜm-¶Í;’>f9àqÀνy¿V©:ü}>Ç£õŠJ—3w^›‘éß.´é!·×l’Uˆ™EÚŽàŒÇè?Ø–'Ò|⟠x›Â׷֚ݦVºÒÍôq<ŠÏå¦ÄvØy–PYT¹çÀð­µð¸Óü-l0£ç@G8lŸ|qY^ ð†£¢§ˆì`ž2?yöˆåÚ‰Î=äç?Ê´“Ì(Ñ”)I6¶ÓnïS›Øàê´äœnzŒl´}SÂ÷+sij.ã•d‚I s>ÜdÃ’v ;•·m$Äakʛħƒµëï E /osˆŒòQ•ÎKíøSüñ¿ÅŸ5Ycñ.•¥isnÖÉ=ÜÞüÞb1é ÎI÷úS¼[㟅·z‹x“L¼–[‹Âô o–wW-Ê=2xÆ yß\¢­iòJ÷•ôõ·«Ôë§…­N\²‡4m£_"=bóÆ÷q &×­m£+•û l2ç¹yƒ­¼PÁG§\Ÿ¦@®Ÿá_ÅŸ ßßÞÏâ^åaä"à` mÚ=rI?…váêåµ1 TŸ5ûÞ߉5éã©Ðr„yRíc?Vø] ÍyiK—%8Èõõ®[ðÉ–%¸¶f…Á :ޣ߭z¯nõ]LÁy-‰…åèò${IL°cÉãŸojâåÒ4¸/#Üûå•~æì ŸýV˜¬uÙng†ÅViJR¹ÇÛi‚æѯÌm†MÑîëPNâ±µ}"âÉþXx«‡Ûֻ߸EG‰Ë¬v2<¦ñ4HŸO^½*†·á¿x~Ìy’ Fðñ6?PO\ŒW_7 V‹¯ùž•K<ÁàpöTSºµÛéÿU¤##´Wè§ÏÓ¬ßQÔmôøF^âu‰x8É8íøWCã†v¶úwÚí!’k›‹TX£·†•N8ìœäŽy¬ŸØÉ}âXã` L‚x$tïÎ?õoim«ø&ð. ŠÔʾK*È2 ’Nÿ¯ÇøÛ8¯ƒâ ›ÒšNÞoüÕ¯É0P¯•Ômk+þÇßuÛ‰¼G‘i¢Am“ùÁƒoa9öÁúŸ\ÖïŠ5/”BŒHà’sŠïþ)ü0ñ+ëâöÊ#{.V(þrÃ;I\’Oðú’È'€¸°¹[¦ƒƒ‘¾ÕÔ­WßOIjsáÝMEtüÎTñ¤&=ÑÝÉWUI¼]¬FþjÝ1ð¬Çð®Ë]øi¡`·PÌ ¡‚:g¼ï_Ñ5]!Ù^ÕÈÜÁNÏÿ«ó¯/fó]Ùž¦Xjú+\±yã­ZSóÜìãBGõª­ãBP—ŒHû­žEbÍ"¹ ¾9¦…'¤†¼yãk·ñœ0´RØëü5ñ;Äú ¢hÚ¼°*ž$ g׃׾G5Öøƒã<_¦Çlö–Q7Ù’qª.U~é Ëu¹8â¼[¯zÛðïˆÍ“ndbÀ x^{WN'.Z’v9ka!ñF*çqáïÏyÔu;åfg,>Sß’{WI-‚Åh#YíöíY>×Vò0"\.qÇJwŠ«kìVÍ5Óý¡K3ðU|°3Ç9Ï犉µ­[WÑΟ'‡­ Ç8–kôy0ªNÈÉ'ŽG|RÃ5¬-jªÑ‰N˸w‘åíPHNyUÎìíÀ í:ï„íuXͼ…ÄQdFÙ9Æ:Ž:séÀë_‚ñÖ:Ž'ˆªBa%4µ?EáÌ,©åQ”¾ÓlñmOž¸ŽæÞÏNŽ9¤'3¸>bÍmŽHQô'“œ>fø×¤Xi:µ¥«K)k·‰Ù£F£{œÜmÇLg§B~°ñ§‡®ü;1¼·¾·)¼»ÆÌSpç‚1ФtWÍ¿ô›ÍrÿP’EçEæ[, ŒÇµT•‘Ž1ϨϩÁ™–&XçB¤ÛŒ–‰¾ªÖüLç J8ÕQÕ=mÙ÷±Êé–¨Ö¡ ¸Z/ü3¥ë ¼²ŽA·HÈüª[(¾Ì<•Rücž½+CO²k¸Lêû6¾‚ ¸zdþ?Ìþ¾¡ ®V•sp|Éžu®ü Ò¯#‘¬±n$+.3ôÇJàµï…"Ñ.VtuöšúBêÑ. ” ˆQšbü'“ëþFkäÈ`0‡W‰É0uÞŠÌîÃgª{»£å­CL¼±l\G·¢`Œs»‘Þ½—â/€©|×¶–Ê£nÀ>â¹χöö¶n¿ga&2ò!e žŸáÿëV„vZ}³$«™6üÇ“èz¹Â1›µ‘Èë¨JR†­¶6:U˜²·‹ ÀÇëTç:}åš[j2(F˜Ë0 ø×žG8ǽC|âkµ ¡lmcŽ=ëÅÚŒÐHVJ€ˆœÁ$/°ïÅ:õãN/M‚£JSžáã4Ëý“b‘Ãi|‘ƸßèIG•ÏOuq¨"ÂnBn8ÜOÞ©ê2K0ÜŠK{UÍ+IX,šêþ|ü„Ç=[°?Zùú•êâ+>ßëB”(S]ÍvÑ.µ‹h¬¬üû–L ÑÆXøþ|Uÿíÿè–)¥ZèÆuDÚ#º#vO^ Î=`Xê©£fÿQyÈ!aF!úcüæŸyñI[Vác L)Ǩk¦ž"Í~Y~62• Íò¥xžÃð‚Æäx/l:qŽ{µžUû ï•$.æbʪ`|ˆì5Ko 麟ˆu™%½»™Üï˜9etÜ»å¶0¡ÃcÕÎ|øÙáÝn kët]:[ƒöèídh^HÙJ2íNý+Ô¼{á†ÚŽŒÏà¶£i áš8ÞÕ£*v–ã$…ÁÁ\m¯[ ^UiòÆWI+iªÚ÷üÿǯNTk·S«¿ù#Èo2´Ù9ö8þT[]˜YÂd¼£ ÂC’8àóÍhêÚ{Ã3£ÄFÓ‚ïYÑDc˜nAbHJ5 c$é¢Xc¹ßó©Àäâ®("S '{ Ť“  ý2 ,#8’A?6:ÕÉ`€@Ì#Æ«•‹Ëù’[¨ãx’x·…;#>r’¡*<Ù^p9ü*xš8œµÆè¶>>öxã§sþE.Ÿ¥êÜ­ÄÒ¬#.OÌÔ¤òãÒ¯é6R\ÜÅa¦i³ÝLò|·w4Ïø‡9<õ5´#)l‰”Õ›ÝܪÏsG ?3I ÂãÔûU‹­L_ YaC#d†ÆâG¹êknËÁº“B/¼Uâ»H-­É2Aj¡œ%ºøÈéUluÉuzV¨·šä eüè0K2@9ÀîHÖ­XaÒö’µö]_ËS‘IMûŠöíþgé.¥àÑä’ÓCñ$q²F×v2 S¿x|¼cåŽy®z÷ÚƱ¦Ç¨^ÜÚ9ŠdŽi C*‡îØ8ú÷é]ýï4ïjxSQ³[[ÙSË3Gh|²íO›*Ñ»žƒ8cëáÆuYtk¡pñL0³Då>^Nx£>¼{×óŠ’\’O©ú‡3Œ­(œî§ðÖßH±7º|[ TáÙF?yN76NW=ë\·dÿ‚—z®©xWÆzî‰isn§Yµ’Ö;вc%­™ž6 “¸Œç,~Së~%Ð4MÁF;Wî5YM«6æp €Fzd瓃Ãr+›Ó­toé°ÍæÆ²£ì«µ÷Á™p½þNsÉçí噦3+~ÓUŽ.ºžf;.ÂãݪÓNÚ–ü9£Aà 6ÏLðf”m¬m,RÊYP1f•ööñ“Ü/à,ø–öæKvû 2LF<¨¾U ÆH9ô8³òÝG{nÅà’ÜüŀС°ÍËÁÉác"¸ïk¤øgíÖÎñyq³Fcpþs•#ä€GÓ¯§…Kâk{YJí»»õ4¤£B—³JÉ+ßï¢Òôû¨5¢z¸P©€n2rsÓ=^µó¿ˆ/Oï‘ 0Ck$° ‰Jí ÀùŽÒOÍŒ•<ö>‘ÿ ¶¿Ó­ÜÊnaó9FÚ%  œàÔdýáÈÅT -uh[R6ûob;¢KˆD‘³d…GŒ|¬ÁÛÁÀ>¾¦·ÔëÆ£Ý4þæqc)ºô\[þGŽjš${5Ý”Aˆq¹Uyfõ¿ùõ¨£Ônm—ÉžÔ†–$…ÇáÔôíŒc¾xôŸ„ž)ûš­ŽžómÜ÷TE D ‚FÝT‘Ž:×å˜/"{ÈöF±Ì‹¹Ø’ÅW°Ï'òãý—f8Η´ÃÔNÖ½ºzè~o^|,¹*Çúò*¾³§Y@»á–mØ#gß8ÿ­TîÕ&®j·º'˜Ò8?§5{U·±¸2 ‹Uó£eVt#¸ëž£õ®iÍV§hŒ©ÏÞ9í;uåܓܣI²ÚGEŒpT‘{W1`£Qºò®erXäœ+ܾxÆÎÂ]Zx"šKÑ$J’©`‘€2qß–…r6þð®™q«\E ëp’˜íaeܼÁ“ÂR{Ž£šä­—Up„åçs¢Ž>´œK¾©ðãEŠ=½ÌŽ^0èAûtö­‡¤ñ|— öù-¢€¹#,IíÜGåI¨5Þœ0B¨$Ú¬Wƒé]Ão‰–þ¿k]NÜ\FÍE)È9a×v¥K úÊçVZøµ‡n›»9_|?žÎÂM25´ž{I[|Öà‡+ެ:csþ5ÃMe"È‹-‚{ØœÉã“ÏZ÷ÏŠ¾k[‘âÍ>UÔj×+ 2ŒÇ+Î3ŸzóËï êZóOw£hrH°Fu‚2ÁW8,}k›0Ë`êÞ+_Ð׎Ÿ±\ßå©ç7Ök'ïam˜9(ãÞõî_u½*óÁhp£Ï&CÝù³}8Î9ç·¿¹¯%ÔtÑ4±¡ §8­Ï>=Ò<-¯\išÃ4q\±MøUäcnkÏËg&`”Ý”´¹Ù˜BX¬ åÕÇSѼK¢Ë42]ÜBñ1|‚ËŒŒœ|õÏzæ[O·‚éLò1 ù>^:W¥xÞ8®4í.ö øgAˆUrq9q¸¿ÁÜØx^Ìud¼³¸šÙÊ—Yb¼€}=ëéq*1w·SÅ·(ÚäÆFgÉ ‚B®0qÈúõêÊ^3ªù„ãÛ½Qµ‘ž0ä㟭L&Ž8\º–rÑØ{×<fòHÑ:½«[4rÂdòÜç†jÏõãáÍV;éJä» IB¶9÷î*ÂWunn~o~„cõ¤²–í]m§·ÈVi&–_ºsœ}Ñž8­=´ùâÌåB. 3Øu cÃ6Ú(žÛU¶Ý$à›®b/ò• µœ‡]À0­ŒüÍÀ®_S‚Ö_ .½is¦[-ֳ佟ÚSí0€0o)Ø¿’ňÜ2¡_”_ÅqÙhQ¥’âúAºÖ Ü,pŰ3>\Aäc9ä‚2íuGÕY%Ôu{¡4*Æ)!Q¼˜ 8îdàòkÏÃS­…«8δª_Ut´×eòé°F¡ÍËnŸðOÔekȹµºc8RˆêÄ—²T>lzg°ã“]OÃ-fêçQºµ¹ðΣ=¨ZúÞÕÜÚH0 ̘=ý9àññhØJ>Ç©y¾X/nÌÇz/8b¬8èqŸQÅu>×uý2hôÍ=ãë0i_b±¶²0IôÏ`9¯ä¿íFk{·KêÁõ}Dø³áŽÍõVÎΟ+%Â8–Pä"¦GNJŒîäuWœèÒèÚ¨¼¸M¬RyŒ -” 0®\ã§<z{ÏŠ<%g­xhx‚æî͘c –Þƒ 9Æ=0;W–Ú|?ŠòÖ}TÙʲÈ1ûÔ+͆ôùFìqƒï_C‡ÇRšåÝ4xµp³Š½¶:­áßI‚{xwß_ÜmXî2xî20cŽ>™9¯¥øï­_þ {9äDš “ÈŠÝ>^ƒw8ÈÇ^¤qÄ[_x·M×-¬4™,7­´§Ïgû£rw`g u®®ÓÅš‰48"’(â•X}¸ºíóœä’H9‡ÐûWu⇺õͅlj³Õ ±Ì7×lïœLQ»’pI=rÉ8®5ž&U†+Œ8Ï~µý“æø<ßÑšnË™uOKþg昼%l%W‘k]C+Vµ‚ö),·)‘W%7rÈñÁü«Ì<[¥µ—ÚZi1LÃ=XŽŠ=Íz°‚å5¹®$Uòe‰B·u+ÛñÜOzæ>&ib}"Y­í#݆åPçq’zžµÓ‹¦êQmn®t`ªû:ª/fy§…ôyõ»‰§·Æm£ œò° ú‘[ºW‡tëhT½¨Ž6$±$…$?SÚ²¼!‹Äˆ.¤c·Ìsgbs–'öéžq]¥Î³D5½¸.;Ê?Ò¼Ì%8J—3g«‰©8ÎÈë¼/°Ò`‡ËÚê¸ ŒíÈäNÕÉêÚsh>%‘æûDí*10$ôÏ  «5>áœ"H„`ÂIÁ^ßZ‹µÍwPÕmôÍFÎÞ5Kd›÷.Äüü¯Þ/ãŠï«^œ ­ºhóéP«Ëg{›þ"ðÞâm 4½Z8£™ã¹SgpçŒg?Þ¯.ñßÃM[ÁN.¡ºŽâÎ^ŒªI¹ô8ˆ®òÕeû'œŒÄ(‰9 wúUkë›MKO“J½·X+°á2?ƲÅP¥ˆŽªÒîk†«[=×cœømãkdtð·‹.™m$q²ëŸdpzä>Gzéï¼ ¨øuíõ:Öu‚}ÍlÅYcºMåw'•Êž=Aã5ç:ž‹q¤\˳f0Rs½¿ì¾|rñƒÙô=_L±×4©mäŠ; ]Al\d…•Õ‘ÁðØ8‚+çj}r•e:níhâök×£óÛ¹êJ•:‘ºÑ2®·á_k¶÷O%Ê@v~ð’^>Pƒî޽HÔ^SñáÞµ L·Écº2AÊH„d0#Ûšú6 xWÄšn¯¬Ûø†ÚÅmåó4­2ñÝçš…Y#+!EùØ®“’X(Ì–Ñä2øcÄÐJÑڣİ< ,MŒ7$dú{v$§ƒ¥šÑÛ•ù«4ÿ_–ždÑÆÔÀÔß™ׂüTbš÷O¶Ñ¯<Í]±´µ$ìÛvÙsýÕÎsÇõZóÆ~ º*4ñy=’%‘R-Ý÷;‘Ž Ýy4ÔèR^ô’òº¸ùjUøbíè%º¼­˜â,Aé·ÓÖ¬jw§NÓÅõýÙÝqE.0Q,rAÎ@‰"†±ñ_KÝ&‘á+x_(D—QÆVÉëƒÁn¸ÏC\¶¡«O¨]µÅÔ¾cäüþNMaWF1µ)]÷[ÓÃVnõceø›:•ì³îØ@@ڒɺI{þñ¿‹¯Ýè=éÖsùR'–ãæpÍaä³?‡µkhV’Ë< €Ã† Œ’3Þ¹èÔs‘µH(ÆÍì~¦èo­[™Ì1o´Q+p¨zmn{wëÓ©­ iõ´-Örç.?x<ç¦NxÁ${àóÔkLÚ–…Õ¥­¬à<»rÅSWV9'×Þ±t_j1K–ƒæWu8ǧùõ¯â|ndêÖuìè|1  õKs®øY'ˆõ«]JÚÒâÞ2ÛOâpó†ùÇUŒî;[hã‘Ôu«©³„ᾞÆ)/$òíಆ%ÜÉ‘¿%°p9%†òµ¥ðCÚN‡£ê:ÖµšÒ}MàXc‘‘à)iYË…à¨+“·;úŸÃÛÃrÞ$Ôõج þö8®AT`¬Fá<ÌcžÙÁä×¾|pÓ“pÒH×32™ä#bÆ6²yh ê§;³Ÿ,ñ6‰¬i:D×¶šDúcæÇ=Ä1 @ ¹ £w*¡·àòŠ-¹½ªx¥)éÐó*Pjž½NËÁ–Z*ÝÂן9¶_)á?8ÀùPí³ä䃒:rzsÿü[ÚZiúEÂÚN|ë[‹¶C¹|Å_.B ;¹PP7µr©ñãá·‡®5½bêâæi-b‘m­.rì|áÔù<ÈÝrÓÕu­;ÄZ{ZÝÎí%ÔY–Byñäw¨qœp;7$à×°£Î“oCÊmBé+ߨë¨xNËM‘ÅöømUàJ’Ù$îÎHcЊÀŠ-/KݯjºŠI$–äÊm%2ƒÒW* ·oæãi<—Ž|GãjWvºžþÎ8Õí§±½hv0 <¡AÁ_—vNIê2|3ñöçOÔF§©Çoþ‡?ÙK£J̇=Ôä“NxÏðàc¶Ü#êpʧ4öØê¥š‰52iî´ñȵ€>à¬Að@:òJŽÿ0òOè ¡_Ï•*4R6èÜFp’1$«#‚G8õ¯Tð׋|iáé?±á¹³¶¶ˆGÕâb†R89œg‚GŒ`ã“ñ4q^4WÚ6¨^ ¤Ì¶\Æ‘º–è0@ò=¹Ãùµ|í⮞wG—™àá˜Qöouªg›ÞM=½¹šLqÁ*1œgãqíõ®OÅ^=ÐaÒd7—(‹¸ª1`w1^ƒâ.(àqa1™ ?;• É .3œr¸$ ç¦+æïžÔ|5âi#º“÷ẅ́ʮG*9 c8ã#Ü×ìÕsº8œ¾8Œ+æM}×ïç¡ò8L»ý­Ò¬¬×âkxYÓ%Òü¸€ÉpK¼£–p ýyǵlÞ^ù#QÉ\ôÍxÖ¥u¤]¥µ½òJ!Ã#ÄÄÄ)#®;ަ»M7ÇözÄ+±ØM´=ëÏÁætçe=üOc€œ%εOð7§gÜY[=MlN/äk/,$|\9âUm€Oæ;æ±u ìâ4w·ºÝGJê4»KH¼'o{;yq墼™Îq€£tçéžÕêÓ<š<ê“ä‚}É´èf½³’Õó AÁúÕ jÖM:2Ã%@êEkéŽàïwÅIwoö˜™XH=GÙ*jPó8£Q¦»%ôñÍ›€-´àuÉÅs6’›{´™“#({sÍu½œñ\º+–=1ÅrºÍœöWò+1ز‚kÂÅ©]JÛÖÖjûž›à­^-Bí$’HXK ˆJò±çŠ»®4ÖÄÈ®ìÓÈL²Èå‰õäž¿ã\‡ÃË«¤¼´?hùA &Þ›} tºÜöÓ_5¬lVvÃ.çùpONqù׫J¯>;nyµi(b9¿iú¥ŒrËå§”Ì$y8PŒçÓ$kÈõ=ÒÞf’ÆybÛ#`Âÿ.}†8éü«ÙµS圖R±>lí¸?wäOé^ivo,×û"òÒ%È[pEÜÙ`·qÇóù¾¨›_3ÛË*Êjæ¤zÃÆÀkR¬`çR ?QRÁ¥Ù$|³…9(Ï[ûØ«÷‚Ùe†3ƒót'¾qT'½W*1÷±‚kÄtáMë«ó=HÔœôZG:C•DÀÆ8© e”nŠÊw"BCdj± ÓD¡M(Ôè§diÃ+y¸?ʺ¯ £µÚÝD%v•·ÓÖ¸Ý>W2‚ØÀ>½kÐ<%¼6— +ï$MÜc׿νl»ß¨Ž cä¦~ÀiZï„u¿ÜÉdî÷éçn–FgPX($m çå$;ý·ÁGñÙîõMiaiü·1¢ü«½“ÀÀÏ×ä:— VËæÉÃ,í F¬+ÎN[ŽÞµG B0£ºëú\ãíª¹UÙôýOñ6´º´©K¬<ú‡˜¹²¼›gúÂY¤ÞÇ”TòË߸"±ô]+Äó_J¾ Ðä’éâ+5ìŒpÒ»V#äÇ:Îr,|V´´“[¸Ó4ÿ²Oq%ÌÂKxaÜ·@ÎÞ »…”œ|ƽ7Ã~›J´º½ñö×:¶°êðE9% Èà(ŠœŒG$r8nÉã£CÜ¢¹¤ú=Ö–3XYTÅ$›´W_3Å,4-&ÏUÔõSÑÏganehdŒ°Q&UÀV‰ ç9ë†ä^i>»ª%ë_ÜÜâq+Ëqr …”#H Ü€8%zSɯ¢þ!eišî›aqº¤®^éDaÀ!Æ-ŽŒÛÛ’£$†â¼Äžþ'¼±‚PׯžNX€¬¹ÔÀáø<šôr¼\«Éßþó³,*¦“±Çø•¯§ÍÔŒgMµÐô+e?#Ÿ¡5y¸\â²4Ã;}öuÈý>µ¦Ž_å<‘^Ý=lx³Ðæ¼^^Ú\Á˱+‹×n㺟ΚD.Õ<ŒWUñ:æHD0¤ûŸ âà×{n]U¢\ðwËüMxxùûî(öpq÷ާàö ¿Ú’ÙLSk.å-Ô`ö>½«WÅÛiZÔŽLäƒ ²g 9žÃ®=ë˜ømxÂ6~¼ñ¹®º5œ«gækðÆÊÓ*…)+n‘^0Öf+!BbR\üwáŸø«À×qé:¥”˜Ïk,Òdx€]ÊÁY†ÂvŽ¿6A;²zÏ…úµïŒ5Ûkk`ž!ºò ¿˜•ŠÚb¹À`ÛK"Ç€§–¯å5LE,BåW†§ì8ªTgAó4­÷ž£ã¿Œ|+ .…å²²}®CGÈ`K©þ¤žG8?Zêµ;W¾øeâïƒ:ÛÏi; ¾²žPeŠ'X•ÕA× ¯¾5|PñÏ‚üQqð²ÛJŽçTµ»—N•Lí,R23+¹až =qÆ1ô?Á½%~ þÉ6ÿµ¯Š6Ú†­â›­­¤C¨¬ÒAnª2óFt'r¢ª·ÍÄŽA/ƒ¯OæÖºµÜXzô§ŠŒÑZï¡•eðÎoØ·ˆí,浚:h—ªªãwêp$në_FYXü&ðï칩ø¿VÔ&†æÒÍ ŽçÊ\݆,DM“¸22ƒ¸ð’î<3à‡Ä-GXðõöµc#¤×®÷`ÂÊÁ¿Õ‚AÚÀpçœÖÇÚøÂåôã­Ë%¤«O‚fÊuPˆÛF¶ÓÔ‚~SÉæ¾~ÝHºU#¯åÚÇ£^3…kÂZ[œ‹þ+h—7ãOyÞ\Ç-ÁÝ$ä s޼ž‡Þ¸›_i/{5”·K Ñàfdå‰,@^N:(Ž2ztÃே±¯µ–ñLh-`-r×™e/·ÌeÈRW¨â0?„$ñ¿ÅÝOñö¾á—¿ò,Ò7½Ô-•¡˜©ÎñÞÎ>\¹Ý°Ær+ë²e*i(­-»< Ò¬j§}û³xrëÄn÷Zmë}žbÙŽd“~3´ 0Én?ˆž£¥c o$Õ †š˜šy2>bë (#sväç¾G#šäü/ñ[Yñž¨]x‚ÒÂ5F/¤ÄÃ2¡ð…Œc\c$`U_Æž!Óôa¬é:^û›‡b2ÔÃplå€Xó°u†Ý_kA.T|V"¥EQ«úWú΋jfÔn®nLQα\…‹/6x¹q‘‚9ã'Ú¹ox… {­gNÒ"ûUüƉHʨ\)Ü[°PÅùï‘ÇÚ|@ñã³»`û$›¼æbÍ!c„ñÁã¡äp+êšd–’\'Ï—n×@³•ÝA€;Ç@}}1] ò= âåmLVñ2jìúšÝ\Æ’IÌpLco(+ÅFyÀço9õÇ•þÒ½¥ÜI äBtø’Ú)Îr“ØðŸ¥v¾WÖ¼DRÙ¤¯óK\—-ì0u&IÈíŒ×„üPñŽ«â¿ßK¨Ê|¨.ž8"ØTV!AïÓ¯lö¯µáõ*µ­¬­òÕßð<ÙÁÖÆE=¢®þ{6º›Á¥Ýi3›c3ó<ù€À'=" Ón'†ébƒ;Ù°z“Úˆ7wqDΑ‡)’_º ÷5ÑxgH°Ó¼q"ɨÅ|¶“f‹y2’F'¯«Ô£ •ªÅ'Õ/Cº¤ãN›º;…ѯ¬ü5hÚÛ+6Ðñ¹û¹ûÔžÓÒçTż…‘$+»±ÁÆj¦­â¯í+Õ·•Š)WpN0£§SÖ» Z§n$V‘¿Ö8\ôÝ¾Ï uk%¢>^´çJ“rZ²í•¢D¡#ÉcÔ“V%…‚îFÄ Û€0\ q Å{qŠHòÛ8/‰RKåÆŽ¹>ÊÁq“‚kÃX½¬vÆGfÎqÓñ®×Æz,:´bä6K.ÒÓŽ+ˆ²WOhÏ’ RpkÂÅAÃÌög±…œe‡In‹>ylµ˜d„`ïÆåê+²ñ÷††¯¡iÚýœj³˜JOûÞXòGºRr8Ísz>ä⽌º©Q_dyØÚ’¥M´~€|ý§¼§èÞ7Ðþ(øKH‘'ð…ÄzTö±Ëo}e­¬¹‚H|“€¥À. "‘¹Ü@¬ø¿¬x§Æú?ˆl ±³m*ßMƒ:MªÚF<˜b‰¤;̬P;ÈÜîíkžð½‡/[xö{û9õ’FpJG¼YØ}Ð8ÏÌHç=»x-®îuˆâžÿí˜Ä/SôL»dŒ± ý9ç§ÿ ¼O¦xq®íõ«™ %ÄË!IŒyä»mıcÃÎOñ#ź¾ƒuƒ¤L&imC›ûrÈòZa•T.ÐHaÉ$’Mx™ŽNª¦švº_~ç©—âc9Ú×±ôà }w¾qk©lÚþuÃ9S† 8a‰ù>„g'¥Xµøykâ)/ou˜ÕRÒK›m>_–IÆ\R ,„ŸáÎG‚<ßö_ƒP½Ñ^_‰Wm§Ü3˜&†é¤¸ˆ*C1Îv§ ‰­hxçâ4z¿Ž¦ñ¾"ž;]2ÎK‹‰"»Ì²F Gå©ÉÝ#nyÎNÐExqËœë>mZÚÛu1¶Õhžç!ñ—Æ>#ñ%œ¶Ö …ä%µšH«µðA%€ä^xÖ¥ö@ÜZû½¡•¶ùŠI|ãŸ\o«þ|+ð>¿á¶ñÞ¯áÙ%šÖ’xµ+’Æàž]„X;XüÊyb)îÍ^#ñá§‚týBM[ú¦±cÝ¿Šæ—»~íÝÙïòž'Î JßûÏ;8MÚ-àí;£ý­f4õhÄNÈùÜ\©É'¶3íÏNcø³'ØtáÀ«{trîŸåd!T±#€9¼àç_AÓ­ï.ÖÖÒgS–VÎW8.I䑜1ãž9ÿiö— Sa-¼‚ÞÎ`m–l³€Ûö‚]Äd´1ÆG¿€©R[ìxXêTÔ®·8(¯®|9« …¾n$‡ Íà¨*x$ä‚GáÒ«xöëĺ­µ®±™žf–Öc´FHcÏ©ノØâ³<{q¾™5»OnÓdÇ+£Œ‚GÐñÜTÞ ðæ·c§Á«j²²iÏ•\źàå†7 G^¼ñƒõLv"i¯zNLj«œäôCÕ¼3á_ ê ûH½’Â7g‘­Ê‘ŽP#H7n ã9ïô¯š59ÒïRšXÛ>c’Hl‚yɯBøïñŽ÷įá}>“O˜G÷ò¥rqÇsŒt¯0‹Ì“.1Ô×ÜT¥GF8:Nü·æ}ä÷~|:J½Eg.—Aâ|Å‚=ÌXá¤×OðþÒkomº]bXåSäcÖ¹ý ÷M¶×mnµ¨%šÖ9”Ï$eÏ8'½hù^+º×- q÷0ŽGÜá d{œ`íO R:±©'³ü,tÖ„êAÅv:-[T6þ"7²Y¡Hdbh¾ÿ9ùºdqùW¥x+Æþ!|0ˆ°I*¬É=Ç<Øc“^kÿ 7†õ a¼GVã29îEt¿îà‹N•±¶æeùyÇ'=xýké°­Œ´fšzž6—6Þ‹M”’oQúÔ¿gwP˃ž˜5—g¬CxUÌ›H #œúÖõ»ÂmT¡ÉÛØWÓB\ýOœ©Íñ^¢úN¶4„©8TQϹ5ÎHñI¯I$K•y~Sëœg¯¹®ËâG…$Õ¢]KM€Б€O öý+ŽÊú9ŠJ…Y=x˜ÅV5­Ò糄tçM5¹ëZv…hš$6*T™¥RFè+ ÆÚT:ŽŽl­ ï¬ÑH:¯ÌXç?)Î9=>µ'ÃÍU®ôÙtaç(2A$³cæ(¹’q,÷972‡ÇÔt¯F^Φ+n¬pAT¥]ÝêÏ&$ú5ëi÷±˜¼¾%|pr?Sè»M¸µ·;¥ååÏÊ˃Óò@¯J:.‹}'üMlŒÃËuÆå>ùᇱ¨áÓdÒ%]̉„¤…S,Ùã#žƒ'€kÆŽYR/¦¾§ªó rV’³ü ~š=?ÂÉk¸gò‚± œ‚2Iî+‰ñˆ\ȱÛÈ’H7MpÌ¢Ž{æ½S±ÑÖR³¡( «3ÆAìkÄZ/ü$ž( °Ç>Ÿ¯jïÄÑ©R‚TŽL=XB³o®ç™Ü¤rÆ#™7` eÛךdV€;3ï]%Ç€õÞù׆‰IÀåŽGËÓ¯øTw>M;Ó¤Œc± 7=ÿÏ×é^°uy¯$zÿX¦Ò³)h\×j§ðÿë×Q­ê ¤ÚÃád‰BœIw0 m$‹Ž¹êO±õªþéŽúœ± >Ï|†÷§°õ8ÿõTö7:Ü Ë‘ys&û„GUÜ=8÷'Û#òì§cK–;¿êß3šrU*]ì¿3éè>$x‡KðÃx?OR9d-5æ[yܤ`ÀŒޤmÀÍEá -ìuhõ«›«tk]òì›;ò‚$±ä`óØâ?¾=è×ztZ?‹uвª|·3d‚r6¡ =[Û“ÛÑt]R Ni¯´ï[_D Â@ˆDJá õÇCÇô«Ž ðu!€ŽµÛs³õßv´í½.»ÆC‰Ã^îöÓmSо2ø˜é— ®‚·3]ß–¶ž1±¢‹-#ï~}¿(#ú(ÄÐihš<÷b7#4W0Á302 ï~£p‘מÇÛ¶”Ï e'pbÌH`ÀRb;Võ‡ŽŸM¹³Š($?;:«*œ`Œ0;G9ùxÉ9¯Í8˃§‚©,m8(Ó“Ù}:úùiwcêrýbÃÉ·4·}¯3´‹âgÄßùÓ£¶ÑxZ;;éÊÊ«åÆŒë¾Mªã IàõVƒLÓ5-|kðF.`±xš$¸ŸÍGØ\ l’FJ•ç œí5ÊÞC¢øŽ+}>-^ì42eÌ¡v;6Ð uQƒŒŒØç‘‚Lÿð›{ ˆáa\Œ¯3qž½‰õ5ð?QŒ5‰ôÒ®å¤oøsñ%¬¦šó[ñLq{”-¦å ?êãˆÃ.¿yÎÜ2*|b—þ‡‡c°Ó,c•¥»&¡«X6àYK.AáIÈéÉÈñ¼{•ݽõî¡äí>XµM¡®Ò½ ~ðÉäö©£ñš¢6£}wsa¶¯–q<¼‚Èï‘Ðc<޵RÁ©ÉIt9£ZQMnmÚÆífKàö«Çs#ä. xܹõûØ8ǯxÒÜÝ6—yxïæÁ*JBLÈ´t>Ø^8ø²"7¶³][n•€U\Ýq´+§¯®\ïm4å{™÷9ù¤PìNxéÎ3õÇÏž9×µ_xŽãYÕ/DòK+6årTIdðàÀWÛd4Þ ,J~ô¯ä´»ý>óÍ©Mbq á›ó}$²O3I;–v9,ÝMY¶Œ¸e\å¾èê"£ t㊚æh°ŽÀ“Ã)ÁwE7+Ó°ÈàxŽæR ±Ý‘ÓÚ":¾J©ÈÉØÀíö>‡Ú­iºmíõÇöv›g,ÌAcŽ}:þ5§cyau%ÌF9cr²Fz†A­y‡5ˆæ÷¬V½H`_ÜÜù›€ÎÃÇÓë]gÂ[éÍ6™s;¨s¹Æî>§šänàT´óeU‹€"çqÞúQ¥Ê,®Rõ¯Z& cÚNyÁÆ;÷ôªÃâe†ÅF¢ ´U|< úžèº´‚àî| €8Èêךì4-BÞæÆ4M&ní^AiãM#ZX„R”ª‰ Jè,u KM˜]ÁpØe +¿{{×ÛáqÐrºwGÉbprµžŒõ9ZÚTlöÅrž&ðTWL×Gcc (ÀcïV¼=®¾¢Ð6\¶y­—¸V]§‚½f©âiêy‘ö¸zšg§O}¢êÁÔ°d8%N+ª´×¬îãX§8f`Íœ9ëÐÔÚ÷‡£ÔÕ·—!`ÛÕzàt>ÜÖ$º-å‹bQ¸öeçŠâTêÐvZ£¹Ô¥]]èΆëKßnn4镉”7>F7M¼h'I…$SÉÍdX5Õ¤l±»(o¾ *園G!y%Æ9=ëhÏTÒ³0”,¬õ;­&ëûKIžÖÖHÖᇉ^¼:~{Ó<)à[ÿZßÏáÝ"ཪ¿hŠœþ^WæËcåÆpÀ‘Ú¹ý;YžÝ”Ààx¥zÃmFyÕ´åheù¤Q´*°Æd+‘¸ã<IÀÁàWqˆÌhá•|TÜ~(¾±òìÌ0ô骜µ“Ùöäp—…îl´r¬ œF«9\ñÛ¹íï\æ—gw2¬Qog9S¼’ÄýsÀ…{oˆ´x­õæ·1Ëbu1 íŽH=”wíÀ¯1ø‰ X\ÎÚeª*Åo¹ü 6îê9$ú}.Ž|># ÔÞ'oUsZ*Ư²{÷8ýV=:{ÄÒ-›tp€ÓKòÒáÞÀþgëR\Ì,¡†êÅãód¶òøR슷0¶Ü‘ós2éí@¢ö…¹ ò«îìÁŽ08ü4KjÑF| Ï…$—lí@=ÏÐvÆã{µÔôT’²ìxLRK ‰!•‘‡B"·¼-ñCÆÞºûN‹®ÜFÌ>rdÎpr3œ÷¬+óÚUªÐ’•94ÑõÓ„*«M&¢þ|z›Å6õVex ÷ÆWAã“ï^–º¤&Цmòp±cŽm 2NÕ8ÈûŶƒ’+ã /XÕtYŒº}ÛG¼aÂwèøÁk¶Þòçæ›ŒŠúIf|ï.xkzõìú?3çëesÁb~³…ÒÝj±ø¬éšÑÓõëØƒ¦LpKnÊwö OFS“í¸òjµøè³Ýßøž[§’Så/+Ó…ÆFÜÛŽ¾¸¨4‹º6¬L𯗠—RE• 0ðÙ^€äûîÎ3[·Vz_Žt4—Dº6—˜ä ƒž0N>ð¢¾b¿c”°µ#?-Ÿã§ân³èBʼ|÷F%·ˆ¼C©/ÙímàŒ ¬eB%±…ÀÇ ñÈïT|kâøRxì®tèo`WD³@Ì¢ r§Ž3ÏNÄ{xzûK~¯­Iy1EB¸Û€IÈ^í’rÇ“Óí[Âñê ›I¤¤??ïÛ»“Æ9üé¾Íéàeçü©«ÛüþlÆ#x×ZÕmφîµ41>éXHÄHÙ8$Œ÷ôéŒWÊã§Š£†ÂÂjå‚ë«m½O[Î2©VÜÒíÛ Ñ‘‡9zÕˆ¥Š< cÈàb«ù˜8 3ž™©¼¸øÃHÉÚzŽ sCÈí•ÉSäpN£ ·ùTW3¨ºmϸ–<‘ŒûÓng‘€ŠÑ¸.JŽOøU{·8e~ƒæzQ9ÙY 0¾ä7…ÙüÃ’4Eš»¿¥=Ì Œ$@Ä”“Ò5•’ØïZÁ¯zìÚÚâKiC#z×} |AH¡KS‰zed9#é\G¼~®ø|ÈÚż(7”µÕÄÖ¡S–=L14)×…ÚØúÁú-þ“Â~íËsÀçε¯®LMò·à y߇bÕ,u²¸Õ¸wÕÒx›VkM1dŒ±vp…Áè=kïèb[ÃÞJÖ>>¶{mîtÚսҳ仴sÐÖœš\/‚W'¾k“øq«™³hñ³Ã<þf»Ø¥Œ®þ½kÒÃÊ5is3ÍÄEÑ©d`êÞÊ "vB×ô¬™t项òæ8®ÒW)÷äÕ Í5n%YsÐ÷ãüŠ'F-Þ"§ZIY³ ÖÙWósÓ8ÒxJÖs$’€¥váËžÈâ—HðèIßD ùldû÷ÅmÛÅf;X‘C¶ØÐ¼h~Ë IÖ­$¢·oo™•Zާ¹©èÞÓ´¯ø\i·áíf´…Ò9­Û P†EäípÛÙXãæ¾*øl×W“-‹ ‘ $O¼©BWoŽN3÷I<ƒ]O‡µØ´}"]Êtyþْ٢œÈÎèälƒ“ò–Î;Õ]CRÕuyå²Ñ4ñ§=¥¼eî'¸eTV<˜Ü¢6ù°³vz“_Œa8‡—g5e‡\ôå&”]ö»·/Þíê}|òÕ_7Ë$–¾vêy¦±à‹ ZÉ­îëÏF‘#EÂaÇ8ÁÁü;šä>*Ýiž³¸Ó´g¼“÷$OPTîaƒÂ“…ÉàŽÕí_üGá_x*ÜÃk Ö¡ è²LÄrîN äƒØ u5ó±«kÚýî¥}w$ÏqtÁa\FÚœíÏ'²kîp¸üË„”±Tù%'î«j¢—[ëvÎ XzX¼gÍ­û³Ë©0ìÁIÀš§õÏÒœˆKdn/ü8õÍ|jWg؉¸bÊG}hŽF‚EœÔ’,ƶØ2®Hï18þXýiŽl87|¼œ{ö¥‚$àlw®DÞÈé'‚5A—É5Ä`H̹Aôæ§D¸ÆF;ŠîT†>Vp9ç­[åµ™š½îU¼‚&|[É’8$ŠŠ8znóóU™™¦ÚBvŽ1Æ:ñU·4Yžz“XNÉÝ£h¶Õ‘,vˆÜy˜ÇRjų „šÖbŒŒYN"©K<ìÑù}¼¨U¼ÂÿtíÛÜÓŒãh'[VwZG‰P¼ÕäWwï 8ÀÉök^ñèÔ+y‰€yGON?qvV­ue%ýœ/ä…+$€áHî­M§®»ˆ¯bìC‚ƒÒÿ‰æÏ C››±í? $ß÷ƒ±±´9Çùÿ'­wÖòŽŠr+ÆþøšïD?c4ˆç*wz ôý+T’êpmÝ\•nOé_g—WŒðñ]O•Ì(Î5ÛènyÌì'ò«v­4ùÀ<æ³,ç3¸&6Qžw ߈­Žœ÷M«¹‚Xöó¯EÔ…*N¬Ý¢•Ûò[žd£.eîÆÜj:~ˆnn”ÊB‘o˜ƒžqØpy8øÁxNÂçïã98íøW'mo©x÷ÅB-.­X ½ÅÆœ¼r9è@$5Õø¯Â>ð½ˆÔ¼UãÛ{©£gb¶b 6»(}Á$ ŠøZ|kV:XxR焤”}/«•î{¯‡åO ²šM¿^Èëþxræþî]r[Ñgh»`I[vof,`@øbÄc¦I¬ßŠ>;Ó>è7ú6Ÿs¦HàÆ®7ÃʧK((ÓœcêÖÍè½M¡RkR“»Þÿ‘/|S©^ØÝY Ð~Õ¹ ä/÷TgМwúcš²ÓVlE9ùAÉ9Ïך½,˜7SàrÍÉêyüI5#X˜?Õö-Ž+éç ÔŸ<‰„©Ò‡,Yâ@«’Ù?J•b1Ñ '·d@y_ÌÓ£„¾AÓšøˆÒgÕ9¢+kufH«¸cЧy<÷“=ÅÑÁÉÁlúÖÔlጹTuõ¬ˆºrîKmÎLö¢p´Rîä›o±-ßm‡<{Ò…‚3…CÁëS%Â0/@*¼ñHåà}i;¥¡)Ýêw |Eue{ÚH„†|uàõÇz÷3Yµñm´sË´]n¶®Ò@è¿?§á_4x>!wª‹#wå±!£lw…z%†¡ã34× ´Êì6uþ!ƒ×½~•ô/gŽÀ:ˆ·ø>ëÌñq”],J©JV’üOxðˆüS¢Ú¶–л[´ÄˆgD`€¯,7¡q‘È99­yÆÜjþ)Ží$¶²Œ†Hã y„àòO8hÿtö5CTøƒ­ZY4o{y†ܳ–8 Žçu÷®.}uMñ¹t;dnûØýsJž -Ê £‡O™îÛÖݺŠÅUçªôKD¶õ7Ç…"Öå_"id!Wbä’z;×5â}tHšW]¼°çªžµµiã«[eB·2‡*ëÁ¹ßøžÏRU·¶,B±''åçÛò£<$¨]=Nœ4kûTžÆèU{S!fÝ‚i\–9 "mù^1í_<Ù륦¥«›¤„dóëƒU­eiäaœý)–Ñ,÷ˆ·¢Cñ¿ËÁlwÆxÍZµâT˜"¹ ­÷¿R‹s—dU”b2H–\°Ûއ½T”ù¿(à uäþt»w`Å4€zŠÆ¤î슊²Çhi?J’"A$ ÉsÚ‘P·AJtv É¥Ö£: x•4+V²¿‰Þ X–ÚAÁ=ðɍů™$ÀZ#€AÉcÔæ²W2.í¼úUÍ:ÚS*¬k–b|×£ õgâØä(FNKvv>½+¨F'~`ldŒôëÙ´‹è5 âÓíí%2• Ž2Nßïp:W”ü=ð‹xªå¡’àÆ"eÌ|~¡Pcžæ¾ð7ƒ<-á­>6 (Þ]ÛC$ž!Y®_ý¸ÛY@g‘™?Ž0®«ËØyî%ÃsUÕ½’Ýÿ’óû€©­ËO¦ï ¾ð.¹âjßDðÖ‰6£!Ü!µRþJã%ܨ!T.X“ÑA8 ;Šÿ³õ—Â˵Ñs˜â±òNÜ©týMU°Ñ­í÷›$ÝØ‘RFºiRdnR²§Ö$‹nÎØëéT5—-=ÍÀ_P¼`b¾©Î0W<µF¤žæôÖÄ^SÙBTã`¨ÿ°´<ˆãÓ¡çãeñ±r¶Ádãqÿ}¯Œ' ŒýÖíXýf‹{,-d¯sÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ü`ñ&±©ì_5qÏ_Ë àð?ÏjùîòúÝ®˜BNÜðOjý'8…L%d¥+¶|žY8b©sEXÔ“ÄHØ[™$p£3ýj´ÚÝ´«ˆàöù¹â²emòNGlÐGA^±U‡¯<"Iw"™ aA=…E†oã?.À:R×<¤ÛÐÕh4B=zšU$Œ•ÇÖ€Aèhf Ú¤¤ ·4´Q³ ŒÒšZèEP‘бi«^iöÒÚÂP¤Ë¶MуǷ§Ö ¢ª2”âÂÉîX·¹†H¾ÊЀY²]ltô¤¾k‹ƒä™HL¯îÐá8Î=qßÞ«½qî*Ä ?ZÑOZBøuD2C2’¾^}Å4ÎÖR>µ£ o\íïH MÅœçŽ9ïMÒ‹Ø•6÷ m-6q7>¸â«ÁÚí,§–Ö«ÉbÒ+H˜Æ@ä÷¢Tî½ÐŒÿ˜­E:{KˆXS ð3X´ã¹z4-ŠKbŒ¶OÉE˜ E&ãéúÒÒ¢‘›iÆ(fÛÚ‹´€`b?°Æ~ô¨I@M@÷ÿ‹Þ3¶}"M:¸¶<â\…ÛÏÇ?…xÂèWZî±±£X<îcÈÆñžôjºþ¥ªI!¸¼‘·uËœ/ÐVçýI½åæm°d2’~@GLg5ôxŒT3lbçÑÁ<œ6åøWË«9½gÃ7ºD­ºœn*pk9åv‘Ÿ\W°üHø•à]L’ÆÊö…dÏQùW²Ÿ0“"¾yùzjós<6 ZÔeÌŽ¼z¸ŠW©1h¤'4 žC~•çZçX*…àRÓ\•8¥* É£fÒŠB’GzZ $Œ‘Šr1J760)¤ÛüåE8Âã¯?…FâUÿëŠ|¬˜êL»M³œñŠZž &Ñ·h§,9â˜çŒ`œú |V÷3€!…¡œy¹¬‚ÚjO§ŒñVc ðèãŒö¦.Ÿ5º8`úb¤fcƒ]i8îc&ž«aæÝŽGåHÑȃqý)UʇǠõ©bfa–=«kE™'b­ëÉuËóÆU-rÙQZ«j·qêi³é­fC¬¡”žÃ‘S*2“».3QÑ µU)Z8ˆ”cå 1ô«Ö°@ã3H0;w4³iQÊ­5«Œg…5^ŸÝíõfl–K‚ÉÈ=Å1tä-óîÅ^–)áš6ôÈëL¬Ý8­ÊU÷+e±]Ë"ÏBpi¦È/U5pG•§”Œ.X(TSh̶¶ÛÆ 1` åEkIãP5¨ê+9PEª¬¢n$ ý)ñj3ÛœŽ=vTTV ¤ÖÌÒÉî-íÃLrܱÿc/¦:w¥*§ªÊ–¥·'v=²d(pÜþ¬ 7½éÄÔR*mÏ9Ï­ 9\0æ–Š(¤ äζxÁçÚŸj€‘‘Mk َаÎ?J±š¯P@©-—jqøÓøp × K¡„¦ö"0g¢â”[zž>•.ˆXÔ’N&ìaW¯Z¾XÞÂrh¯weA¶<õ¨FŸ;œFOåZ°Y‰ÏÝêhí"Qš¯«ó»ØN·&—2JxÇï9úU¨.%³*ñc#¦FjûÛä`ÒE`²ñ·§­ThJ/ÝЇYKs>óTº¹NÔ¸4ÛgvàgšÖ %Ì%¡•‘±Æz¢ú¥¦³ áÊwu9œè׋¼ÕJR“ {U«`c$š·%šÂ€çŸ¥6ÔGùqJÜUÇÌŒdgŠÚœ#mŒ¥'} ):*MXØ_‚¹¦6žD›Šµ˜UBÙ“'ô#ŽÆq$`ç½'öW8µ”õÚÇ ÿ…[© ·ßÁó­¡NúX‡6fÜizãí´ã0'¬vÓ­SšÒ(ÛHð6x.»Oë]•…’¶T̨3¸“Éôa495`UV x¹ÏáVðoÝw!bÔthãdÐ/à.mÊÈ’);O>ÕÒm²ÛGÇáRE!‘w7'½F~nz±oo´ ÿè5ÑÙ„´°î8Ú­ÙC`» ñ€éQDZȫ0@~¾Õ×u9å>„sNª~^? t$»=€¤{ °n~„U‹kp¤qëZB2r± Á-HþËqrB¨ÂŽKÈ«öÐ*€¸éŽÝjâZÁaQ1Æ:u¥[TéùWl(òksÔæô®5$©«÷¡¦DF\.H=½ÏµJ™Éó®„®dÛeYtër1J§Ô)’iRUBwÈ=+J+\ŒmüTðڃǭ5CŸ :ÖFrè¤aäGaL}7hàsô­ññ´äŠž×NÜê=³[}V-èdëÉnrBðHxŠ«”°Æjí´@dÃ2¬;×W.›`ÈVæÞ2…eÛÁúÖ·¢Ù( ¡Ìð:>å$e[œãŒzd’x÷â%…tŸ2Ô¨W§UÛb;v*vW-ÞD Æå} Ör-Ñdº‘|+Ž:Ž?N¿ZдžÒW0ÅpŽÁwSÎ+JRW"¬[wF•Ÿs3\ܳ3¾739$ã¶Oon•qŠ¢}¸¨-ç„ùxã‰¦ÈÆá‘é]êÊ:r¼¤W¸Ž IEÇ ^h"n?>*I§.O8ªÏtÊœúÖ’zš¤y%Õ¿ÙØ§<”úŠo=ÏãV®.¢xü·Œz{T0ÇàÙúf¾TÓ–‡Õ'¦¤L®0ÅÅ )dÖ™·ÌE<¥n3ïYâÕÄ» òN)Òqµ‡sn>ÔA#m ð9Í:æÚ(—ÌV"¥ŽÎ$LK^3’*H핆À ^ÇšÕA¸Ø‡%{¢¤P‚„  õrÚ5h‰)†Îx©-ô´N0qô«Ú² zõ­aFHÎuWBŒÊ[’:zw¦¬MÀ }_ž×ûÜýE2(A“J~Íój%7kŒ‚ØŒ½êÜP7ñ(©RØtZ“Ërßw¥tÆ’KCQ¶1¯Ê£5<G$}i‡sžõ4Qª÷ükx«·ÔVL‘…ð©ím‹6[·¥-¥·™óã<úV½ªÖº©Rº¹Ï9Ù Ž2çíO¡ÁüéîG*i[åã𮔺è68D§(Zµž¥µ¶$t?[0JÌ$•K²®7u?Ÿ^;ÕÑNžš£ NúŨä~µbMØ8ÇÔSb#wÌ1Z1F‘¦÷`=tBf3“KAÚ¢ö$Ñ@01ŸQD×"±-´'êk2YŒ¿4™ÐÕÊJ È•7vMstòœo`*¬ÊŠ >•"8eûÀûŠ‚öxâL–úW<¥uvmÛDTº Œ0õâ¨OY<È”)‚==*k›ÀI9üê¹ç†ãÚ¸fâΨ©(’Û^ßÚ©O€NT;Ç·<ãñ54>-K˜7z¡ëùô¬én‡'š„{V^Útþ_³ŒŸ¼•ñ-œàùÅ£'ûËþÁ©C3mK„bzÜÖM5£÷ð O;{Å{-Ž}´È®«f›i¥3!‚~NN úU»@Í.ÆRê­-@ù½¸Åyp£YØîY- qcy`Û ßé“ó š+&óúæ´î£2FF)m!ò×j¡9éŠÒ4v[*ÍÆïr¬Z4oŸ5¹Æ0;SRÖ;IÀ’6ÙÓ~8¹•çCæÑÐÓœèw®Ÿª´–† ½ôl£ä!^„d`õ¥ÊFrkN×E{—Ú²…É'ö ÖòfA¸Œ£ŒUÇ QêÖ†n´ok™ lïôªË§]ZËæ Wü§<×KŸ ¶Ä@ Es¥Oüñœg¯j©at¸Ö!^Æ7|”–2Œ;0«r?›´•\à”c5 –ðH É“ޤTãÂæ/:ÉÊðIV9öâœ0ókMI•h-ô2’Â`Šrzfœl˜;³»‚6ð§ÔŸJ´Ñ\ÚÊ »‰—« ˜Ì!8™ÅTh®ÂuË”Å* 0äg¥h¥± {SôãZ«+sœúÕ†\÷®èSQ‚9g.i2¬…tŒúÔQZ\<¶€ õÏZ¼#\`€ –A`Ǧ+EMIêG=¶gl ©ÛWs´e¥ãZh’+[}å»3Y×­y!20 :] Æš0´¦ü‰n/a}åc#©=êª^Ç$…Žìã­0•J¡éÖ³î5ÊFŸ19Ï¥sN«Z³xÁl6˜Á¨&ž68ŽEÉ?t·5VK°c®ìÆZ ™ ¾ñ’OZ‰V¶ˆÖ4ú²×ÚÞVHÊ‘ØÖn¥~fɸžÀgQß^JËåï;½MgÜLÑ'šQŸž@ÅqVÄYYÓ§­ËYFý)¤“ÔÓtu ;Šs0^µËÌÙТ°dóøÓæ'fPySƒÏJaž7-‰FÁ ô¦©† Bp3לŸ­O5Æ’C幌|­GÚ£=}+:i¤iX¨à9¨Yå/œõ¬]T=5:(´ó·ÊG=HëO}:e“j©èk®o ËpÆ6@­·-ó`©ô#Ö¨Þhsèð5Æ¡à ’O^دjXv´<ÕŠR{êsçHŸr•‘pß{ÔUË]AÜÁÏL6@5³´ ›•V¦ M¯š»cDzôÍ\0±[,DžŒ¡Q™:Ÿj|–vÅyC“éW`H·˜®FÇŽ´_­­¼>j1-» ƒ©®f’½Œ]I9᳎'ýØ8üêõ•™žB²¡ ޤTqÊÑ0`ãÖ®À÷Òëå~¦®[X™¶Dþ…\ÉnH'±©­­#9ÌN`‚Á÷Í=–u@¯&XŽHŸp·11ŽY›zÕvŒuHˆ¹KK•µ Vs5»Á|2AÍ~‰woS_eU$~´¯q|0Îqš!ñ µ˜eT=N9‡îTùž†¿½q²&Ô–k¥^GÑ€cäþ…Ifº|qlH0ÀrXñTŸÄv_,²ùl9»þU{®;²ˆ”u€6>£4¥Z”2w*4êI%k"k‡h“ŒŸÝý:Zçcñ4å¶ÎIÆáÞ¦“Ä+¸ŸJÅb)K©§±œY¸¦ ¹ôõ©>Õôlúšåΰ'FûS •I9öÇCN‡Q[[|ÜôúÓúÜn/«ÊçD÷ "œ·áP´°ˆ÷ù~lšånõíF&!aÜ õ^A¨ˆ$f æÝ …Àü« céóÇ $´;šØ¦Ó0;½ eßEe#´ ©¬nẏo?ZÃin.7Kç7<Œo’îrçŸSÍcV-õ«wd8ïÍUeHÁ¹¤­+#dî®v¶æIãlÊ»B“ºVéÍT½×0|¨ Œ•~ïE¸³‘¢?6ŒŽj“Zâz{Q :œ«ðG8=©òÛ¼¤ÀÊÇâæ0HÁÇ ŠÅE¹jiukŒ€ƒ;Q<·&(N^Tí 0ÜG4¬ ¦Ø[Q–Ò¸PX䎤Óä»yÏ죵;‘Á9FiÝÚ¶·*r€ƒœüÙ?Ο#Ë+—wäûTAŠ™NxüM ØvDþl‘Œ¡éHóIprw/ žýþ•]f%‚þá1=e•NÛ…¬J@'¯J cõ¥.ƒÄ.« PF–çšÖ´²‹N²H¨&5܃Ž?Î*½ÕÔPfI¥Â¨êN8úg³Q…™ùó­)Nèä|Wð÷M»“m±XÜ®C:ÿôçô®cÄ~ÐôÈŠ[\ AØ€ õÜê¾+ÒB¼q_ÀX38?¨â¸ Ä­ÊU`Ù 3¤õú ò±‹ –‰]ž® ⬮ݑÌÞéñ#–U<Œ ͺ„E!ÙŒ“éÒ·õ HçÆqÆÅ<ÖlÚj©/Rä×ÏÖ¢úÝ:šjÌð7ùü)N{TÒD‰Ã.Ò# ±#Ö¸Ü,Žžb)¥`‘éQ´Î~ï,+ƒô¨Z&…5 ”!f=é2Ç©§˜ÓþÌßäÔÙ°*I1C‚HôÀ©QÃŒŠÙ19(OáMhZ.‚—,]t#Yˆ“n*S;œ`ãð¥äŒÍ0£ ù†09£Tîlcq¤$ž¦Šw”?3'ÞÛØ^qšœŒŒUqÁÍN¬ŒŸ3ã«S‹¸wn#ñHÀWN½ê5œ¯ÛÒ†i€\íôÍ@+•fÊŽ)…÷AæžE4¦7GëS¾ DÑ+TTR@H¸?\HW úÓ£€c,8úQÉ̆¤Ó¹žbmýiÂ̓‚qíZgŒŠ<¶n¤Ö…BÏB¹åkãƒpÆ01É50„tŸ¯4É, '¥j[xWS¸˜È¡ÅoJJ›# T„wf–{ÔŒΪ¾˜DÁJ>•ÛGàk¥MÒ¡ÍLž FD ŸLŽ•¿ömIt2xÚkf{Ûɼcׂgߨ-Ìm…Ûv@㯭X-;m\ª‘÷ð3Ï|RKùŒü‘Î+ïdã#â#x½ĺ4Ø´±›ÍÚŸ,D`:´g¿NÃÞ±n<xÖË=Ì »ˆÝ°í-×sÛÐW©¬ˆd1ÆÀžø© Âñˆ¤A´tR8®G‚§R÷gl1µ ’G”7ƒŒe¾O\žþüS/t;†Ë[TEé•NkÕæ³²‘64(ðp€SSIÒÄ{#ÓâÆ$’SY¼¾ Y3E˜J÷hðéüs<Ípef'¸ïíLoÞ*îòX׳·†´¸Áo°³o$œ0<ŸnÕ"èzfÿ—O* üË&1ôåþÇ¥s¡fÓG†Iá9íƒØUnü2ñ¹˜žÿ%{ÍÞ¢—ò×Ãe€Þ‘ã>Ü÷¦7„ôéˆú$i¡Þò7ïTûg~f³–MNZ&\s†Ú< £”ž~éï±GÛåŸbÕíð|;ðÌJÊöüÍ+)Èôã9¨/þøBy•®-¤8TYˆŸöqY<–¤WºÑªÎ)½Ó›æ8h¾¶’\<™$‰³ `{‹?àÖoÚ>ÂV> ø±ð¦þ£sê6÷–Œµ”psÐúø¶O ZuÒá—ùûLsøh·ó_æ~A¥LøX¢sìµl¾ø¦ý¶Úã©à·l*þ…¾ ÿÁ®_ 4Ÿ Gñ£öƒÔ¤ÖæL¿ð‡èÐZÛÛ6ÕÝÉp²¼êv$+ÛŒÆjOÿÁ¯ß¯üA§Þü;ý¯uÝ'JÿÄÏNÖ¼%ýÔ¯“Ì71Ü[¬#ûÐËÏ9íBÇpü]Vý"ÿRZÍd´¦—«ÿ#ùú°ø'ã;Ó†Ñ'‹þº®ßçZÖß³æ«ö•´Ôïí­ÝÀ*¦áY›=0Iü«ú)ø'ÿî~Ï> ñ´ŸdðwŽ´KÜùCIñ•ª\Gå7MˆÚ×Íó1#2Ù€FåUA´¯¼ü0ÿ‚(ÿÁ0>j—Z—†ÿd]"w¼ˆE2ø£ÄÚž»\ÿzÄÉuùGÅdøƒ#§¤iMúÙ~¥¼¿5Ÿü¼Šù3ùp‹ön@w>ªÏÜàtý*ÍŸìåf³úˆÚzÿ WõËáØWö+𖇃á¿Ù7á´60òâ_ؾ2ryx‰<“ß½_—öGýÔm›öYøt¼àÅ aôÄU+в˜½0¯ÿÿ€(ÌŸü¿_qü¢üý…þ |nñŒžø-ðËÄ^1Ö­mÞêm3ÃÚ{O"BŒÈF8PÌ£=9ã5îqÁÿà¢?ÙiªØþÂßžfUiÑÇ/ËÔ˜„‹Û^yÆq_Òׄÿg/ÙÛÀz¬ºÏÐoæµkio´[ZÌb%KG¾4i*¤¯L¨Èâ»+{ a€G Ó±Û1ÐüqŽkš¯T„­†£ÇÏWú ‡™^µW'å¢?—ÏÿÁ¿à¡Ÿ5‹}@ý¼mg,ñ³£ëšhÓ¢A't·F4Cè { ñ]߀ÿàÞ?ø)_5¸´½Cà]‡¬å¶2g\ñvŸäFÙBñÛM5¹ÏxB§q^3ý!Ϫ¨]dl…ÈÇÔŽ¿•eÉ¥øÆK—žÒê˜mE¼`‡æÀcÏ gƒë3ã,ÂQ÷aýêǃ {Ò“þ½Å4ÿƒ^ÿk‹âVïã×ÃX>TCq¨0 täÚåM¸ÿƒ`?jwdÿŒ†øq¸R)¯ºtçý¿q^êàŒD23ŒƒÍElªd–ᘼ€ñü²kñfvÜ×þ¿Èo Ë_Ù{? ãÿƒ`ÿki.Eñ÷áÙ‡gË–ÿ$÷ãì߇ùÅÿÁ°_µÓ:¼?|ê§æ q}Ççk_¸²‹G™JÙ¿'’6*>£¨îI±fšXÛ` [³qìÅZâüå;ó/ü äg÷Ÿ‡Çü%û\[ir5ŸÆ/]L¼Çn.®Ñœÿws[àVnÿÐ~Ü:¿šº·¼¤*Æ|™¥Önn76xc·ãŽùö¯ÝØ.#¾Ì¶·•cÁ1¯'èFjHÞW” “hìðúâŸúãœÛxýÄ®Ào¯Þ~ßÿÁµ_ðPÀù±Ôþˆ–_˜¿‰ç˨ö6£oÖ›/ü[û|˜e¸oü8·=ÐF|C;äÿ´E·OË¡¯ßÁ-ÈPë¡=w?ÿZ Yï\tèd^¸Ž@I÷ÁQIqŽuÞ?pÿÕìï÷Ÿ€ÿÝþßë–?ü5ßýßøHnzwäÛb¥ÓÿàÜ?ø(#\Ä÷ZÿÃ¥Náâ9Aç [·aÞ¿|Ù™€—D‘ }ÍÑÇ¥=®˜9¶”±Xcô5KŒsîýļƒ/k¯Þ?þ1ÿƒq?࢚fu«xn/j­k4vž%hæ¼ÀÿWŸ "¹í½•}XW¢|ÿƒ]¿hÙ-÷Æÿº„¢›N†qk¤è²ê÷1ÎÀ ” ˆã’@X¹jý¿†ÈFwCìÌ[ùš}å»2Þä–ó¬jñvsV6RKÒ+õº4¥åôÞ©¿Ÿùj~P|6ÿƒW~éªÉñOö°×õÍ:8K=ÂPé²4å’âã+à  åÆ©ÚÿÁ´ŸðO;9–Xõ/‰.¡uÀVAžU‚Ú©Á+ô:).îERÿž€~”Kzù"6zç9?¦+Ï«ÄÝi^UßËOÁXî§•e”ãeM|õüî|a£ÿÁà•ö:=¶Ÿ¨~Εô––É×מ0Ö{¶ ƒ#ˆ®‘1ùŽÅEÉàÅ}WðÓÁþ øEà]'á¿ô[‹ @Òmì4»7g”ÛÚÃŽ8Ë»3¶ÕP738É$ó]G˜¡Åj3ŽB5C=È, p6»ëý+Ï­Åc,«NR·vßætÓÃPûӊ^‰/ÈŠ×Ä0jhϤI Ê#ß•Èê*I'¹·ugÞÈÎ3´ghú(¨ñ‰ Ñ«)åZ@>:þ•BòçWM϶ÞYÎT4…¿ï¡þŠ…Ù«©$·7% ˜µqŽá£Ï뚊K•WĖ˼.süëÃÄDZm2êV ´Í*Ë5r=sMÕìÖÓH$Î1`Нe$Èö×4bºžucå„à€¥~÷â 5Í¥Ä_é0¹ž~o_Qßñªv¾wž-e†÷f2]…IF-úUÅxÒB±ÝaqŒ"œÿŸÂ§–Ú¡©¹-Q^âÎÞA储»~üƒi÷çë}.h®Dðj0ÛŒ‚Ãò#Šžd.¤<Ûñœ ‚ED°ÛH姆éƒøS» ¤I¨íí¼‰!V.0pOôæ«Éh†Tž XøP¢C1¸$‘øÕij³ò÷) œž@¥‚y$â2÷K.:›Ùh^îì­m,ð†HcH•¾P  ¥X—mФ©ÆFÝÇ8ú)ì Çl–äã¹N*¤–VPƒåÛŸZN6=72Þ+…¸Ø4ý™ÎÒÀŒóÛo4¨Kdæ+Õ’1Œ‚gÇó9ý*í¦žpË,rç’ ÙÏ_^j+¿ Æ&7«—Î@9 ¡l~•¿ù¨ÒÂ7ÄI,,ÝþsÇá“Oš¶³—FÝ\ÊÅ^æ4ðU1úçš•!báMÀrÇžGZ„ÛMi F–ÒEº’È@õã4 ˺[üÓc”ŠVb£èqI¾Ãä}YqÔn¥_n:â›+])ù G®Ný)²å¢Y$†eqȘ#L[å ~C‘»qÇÎ¥&;JÖ¸ù-<÷RÖ‘)Sþa'ùSŸ¸þð,€’qòŒN•].K9$lœfa“ùxŸVŠ<Ì¢’àõõª´’Ü…«,ÇmºB`mŒ¼c#Ÿ­hÖñ3M2»ų“ŸÄŒµÌÒ/Ùb?t#®W?‰©#ŽüÆ4ÎrNÜgõâ¦í-ÊVObO°ª¶ù.$÷R×åGؤsºÙG@)VY –—wà3QÉsyî\²ÿt&3ùš•Ì;Ǫm!tÀ¸LûI „q¼9ÇJªšº¹+>Ÿ*àríçRù¶7#æÀ¦ÖÆiûýA{;éú‰>“$¸ÛtÉÉ$DøÍH,™\w) cæ'¥á.3åG"mëž*sÀM™#Õ³RæÊŒ;#:îÚO41½“¡Ï–ø÷ÅCm² é˜ä“~‚µ–?…ƒo®ìSWc“ $pu¦ªi¨:M»™°ÙL­•ÜyË~ðž•8Ó™óg žœf¬aI2aQâ9ü*I'Ž!¸E&Ò3ÂæŸ;{ SIêR¸±¸X·Ú\eªùxçüûŠ«o5íÌ›äÑe©Û¸ì®î ׎o1wpyÿõª;˜ œÂÀíä’@ú´)ia8)jŒ«rw¼H-®A^ŒÛH ú ±d/#ænàŒþóúT–Z¶ÿ&#ÜNKàOJŠ{].ÎXþ×2Á$˜Ú%œXô\2I鎸¦çM«#UN¦à.™¦ÛBƒ9,%Æ}€#š°nºùë4hÝ_+·ëëUô_KÖbž{;9DO$_k–,Jèì’æùYÉ<,i×ZÖ…f¦+£ ,»„jŒK/#Ž@Ü?:—$öBQ’4Ks‘f$‘Ïoª\jšUµÈóõu› æ+Ï RzÖ}ÞŠ×Éæh^"–ÔIZ&MÁ®Ö©ç§¹{Ÿ x÷Pš6Ѽi ßGÊÇue*»/¯™Ç㵤!Iï+9V[Dïɉ“/—9Á*¤#UÍœpsnó#î–,àN+ jM )­ÅåN¹Á´¾3(ðdNqüêm3BѯA¹Ð¼A ;+˜§VMêpWã ‚ìF >X-¤(¹Iê¬jØE¬›çPyä`ñÿ|ñL½Še‹)n'~ªAŸ¯AT”ø–Þy…®•ç(ÎU#ó>»¶óùŠÚ]Üj*q†B›IüFF)(¶î˜ì–†~©¦xšÞä-„· %Qò@˅眖"­i+¯iäÅ{©+"¯-®ãžç;¿¥Ký­¢Zðí³*å‘¥þ¹ÍK6¥£Ü@ò¾¸¬‡üÅT~D×Öµs”£f¿]ÓüG>¢&cåêÊàœ*¬l€¨&–awlŠé,džrêî=Ï?‚Ôé73#R…fTÜV=ÍØý*༻Œ|³w` æ9¬Ý“²+Þ’¹Zoiš|d\ê$2A`Ô gZ]Æzf¸L6WQ§•aåššâ Aœ)û#÷Œ‘cûçšÍ¿žþÅ Õ†“ÎÓ”ÚŠ­\þ}ªÔiÉy“Í8½vþ¼Íï"ÕeóÊ3&?…ºþß¶KòâÑ&*£ï+#~›³úVd7Zþ¡"ý¿LxWnrÒ#?à5v{åµt¶¶”³Î1ÏáYr;÷5R[šz¼jénãÔ0ÛΛ¸¹Ü—h¸`O?d½ÇÚ¥ 9º Œ²’è*ÌÍu˜SzG°ƒ˜ùoΥ×r”ù¶5#EU,ì§ßµSºÔ,­›v%bü|Šzÿ!Yó\j0†Š @»ö(5NãRñ[ ˜5Kp¸Á3Û:müüiÆ—qJ¦›2ë„_+OžpOßB‡g׿òÍH.[_3ìÒ27Ex\“õ‘\Õ®­âÑyüI¢Èü»mä鯗ç[:^¦—2ª]_Bs*±£ä~$ }1D©¸gÌËñ…†KuˆÓ¤U•À`Øúä1TUÐ$¹û1Õ_~î0NãŒUÔ¼°TÚ²©ƒÆEdã#HÛ«üEx§S… ƒ× Ÿæj)a˜ˆ¢c®åˆ?Z²<©Úx#ŒY$BÎx÷4“°ÜSw![yØe›$cå Gõ¦¤åxhåÉê6Çò«¼$mC×Òœî©Ã°ç¦x§Ì.DBòü„¤ã®äoð (àyjõ9æžò(á$Ò Cd*tíŽ)ñD>°ººKç2 cl«yÇtÎ;úUM[Á6º´PÃ}=±Š_042°ÜÙÏ 0Èö<{Vå)4[„_CžÑ¾è:.‘s¤[&Ròigº;sæK#nw!²2IÉíí\§Œfí'ÅŒ¿cñÞ½¤(qæd]ˆU‡–ÅGÝù‰ã=ù5é”V´«Ö¡+ÁØÊ®hÚjç™èÿ³î£áë'´³øÍâiͤWQÙ•¶*U‰ ¶ë#îÛƒ½Û‚@À'7“à¤ë®Kâ|y¨%Ä‘˜Ñq låP[•$Lt®ûõPëÕ•îÿ5‡¤š²ÛÍœF­ð_KÔ¦–îÛĺŒò‡ se"Fÿ7¸È\NHÀ?{šÞðÿ‚ì|;¢&…i{pѢ撨ìO%¾@ ’xñŠÙ¢³r”·fŠœc±›a 5”2À5«¹¼É•§*L`ôUÀÓ¿rI晇e[Ä»þ×¹$}ðOøà+VŠJRCp‹(Ï¢Z\KºuGiÌonxÁÉü:«wà ^¹’ãG„¹\«Ó¥lQMNqÙ‰ÓƒèaèžÒ¼=;ɦÏ*Fÿz .ÒZ¯§Àü0ã6ŠžŠ¤ÝÛ-‘BOØ;†F’0brƒôúS›B¶nMÍÆ}Dì?­]¢Ži³‡c6? Û£7× @ùw°l~b§MÝ#1“NOÊ9«tQÍ öpODSD²•Œg9ÎÁS 0:Jzc ©¨¥ÌÇÉЀÚBܳgܨÿ TµD“ žžƒúTÔQv±ì@ú}¬ŠUáCž¹@sHtË20/0¸ÇåV(¢ï¸ùWb%´h^ùëNXBô&ŸE ²cŒÓ|‘œ€:T”P1‰ã©ü)|¥Æò§Q@ZÄgOò) ô§Q@¬‚Š( aEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ü@¥uÇJ|p'9ü³L‹•#Þ­B«+œgšúx+îy²m!žQ(‹•yZ°,·ûb¦ŠÚ8ò@ë[*M™ºˆ¬ˆÞâ¬Go¸—¥KOº:u:ÄѪ:Ú”µ2KC?¥Z^aŒØëHªÃ8úT‚܈ó°ŸjéŒl¬`Û“ YùK~e#˜æ£ °,'ÔUˆÆOZÖœz³9_bB…Wh`=ñVl£#U%Çp:~Uj¬pÇiW°ÛŠë„Væ2’Øu˜±´ ÍžÀ•u)\ÿJ†Öƒ-×ÇJµy‡~έuSŠG4åg¡4¨ÆGçW!WUvô=þµ^@ò ñÀÎ3íS´…"Éy2ì1€9ÿõÿœWdUŒ]îA2‘¤žrsõªÅxÃr}ªÌÒäp?úõVWã$õ¬äÒC‚¾£fp¸ªÒÈKtÏãK,ÎO5~ípµÍ&®mmFÉ&ÓqUÞNI8üéÒÈ{sëT®g`dV•‘´UÄ™À>µ1^ÔÙ»†W|åäR1Ðu®9O©Óa%psƒùÓíRØ¥9bAV-¶2´ƒ©<â˜}ª{‚A¿­@}«Ŷ…úÓЕëÍD@'4íÏÜþ”“i«½K 6FIÇÖœ¬|ý*·›f?ˆ¤.£~Uj}ÈöfD …ÇZš6ØûFy£nÖ"˜J¿@kƒTλÜЄ“œÓóÎ*¼pWæÚTtÀÁ«+ŒpuÆòz5b[8󜜊º!y.`‘ž¤úqQ[©8Ü1øÕ¨ «ªœNyÉ=X¢ÉÑVFŒŒŒ€GQR$cïc8ëÅM«}ãSX“5ÙjÖG4¦îVe 0•ÛÂßëI$tQÆjé´Êô¥XcP¥îçw?•\i+‰Ï±¾—K³>G<ž*ÌV„8Êä{Š–#’*äDsŽO¥uS¥†3›OR³JÉû¸É^•$Q2Œu­;XáX ‚1ÓBöæ@®ñFþ<þuÒà¡gs™K›DY† J‚{Ô—ÎÄj3òäûU¼“‡ç®@À?…Gw¨I)g“ž´:‰GPPnH’à–à“U^b8 ôÍCý¢ý<úcÖ˜dÞ>v#Ú¹ÝHô7PwÔV—çŸ\TÊÒp ,ònàʪM8 äó\³›7Š»y‹ gµVwE:RϧòÉ;W,äÙ¼"¬C$­œ/¢ÜYˆ=©ÒeI,´•ƒwe…5Ð?Rx¥fÛü$ý6Y6c¯>Õ-\i6Aso&ÝÃ$çžj¿‘ùhOãV¦’4„¹`Ilj:ã¨üë ò§¦æñO”…ÀC€IúšA6Â@?­6YÂwý*¿žw·åXºšš¨&]ûKv` zÎsTã>a%%?ZUC#€r}©ª“ÈËr[E',)¿d@r9«GGÔbcþŽÍ´àù|ÿ*q²u·ß$«v#ë[ºR»º!T‹Ù(UÂV-â!yJ­i$Û·‘œ‚+FÜÅgPObj©GC:ŽÊÈrƨ<~5:¨ ?"ýÑV­,šV ãjì§}y=A`޾µf,ƒO¡~á?•*DÃï~•׸«6™%5óœw¥W Ðõ© Šï Æ{ÖÉ6ô"NÈš¹³ŒûUëxáÿ}&Ð?•T¶B2£¡ûßJµoÓGÇÔWTŽy>¬’òUQäBP*Ãà`w©n#0»$Œ µT™°Ù=»ÔÔ•µ-K9ã'¥A3³òr)÷“Ïäj)dÎ:þuÍ'w©Ñ’ Bp3KŒÒ¼l«È“zVžLgíÒªJá‰#ŸJžáÎ6UKmb1\Õ%gczkA²¶á„nG¡¡‰n¦šÏ´óøsH&SÛòæ±±®¢<1³n|ûàÔ Y[‡'ŒÔ³JN0j”Óy¤¬g§zÎrQZŽ1rcàC´Æj9'yA*§ÔÙQŸM8(°»µÒKbÞ§L“z/#óæ­wÅE9‰Wæë7–¤ö(ÌHûqÅW©%¸Hg),­Øœš`d(w/Íž5Ç'w£:iŠP–ð©ÄH`OáTÉ%€U&§XYÓxsôÇJp“Gª½”NüÇRúÊ5pë;q÷•Ÿ%ã+ð?Õk‹¦-Éü+ì'*|»;Í2;:)Ní¼ç°¬û«+HÈYá'ðþZÐy¶ŒîýjÔžgßäö®Z‘.ÇL9“Ü’Ét9ö¥½øRKr§#šÖ]6Kh·d”c;AÁüÏÌËmÂ1;h‚çT‹ ¡2(èžgN¼a£_pNœ¥ªgH·QÆ‹%ÔofÀó¯J–&µ¸MñÞ!Њãï5=[s#Üy«“1?›m­M"hO=Z&Á§|T­a<+qº;›kT¹`Ñ•dÉÃ!ÈúV¤Zr… "ö¯=¶ñdúïlîIê’(#óÆ#Wìþ(j1·¶ˆËܧõÍuÒÌ0‹ITÁâ%¬N¶öÚÔÍU⻚ѳ:pH¬vñ­Œèe–)BpT‘RJ¸L­ôCêàVëJR÷dŒ½…HÆÒE›ÛàT¶2MSFv$¾G=1QKyÝȬ=CR­Ê°Èqøâ¹å5'¹´)ò­…‘ðW2'94éÜmÎyªW2µXÎvw5‚¾…ä•àdÒL÷8㓞k5o™*ØÇ½8_™ß5Ÿ¶MX¥JCîl–›ŒûqQJ¹ΧK<’Y‰ÀÇ5÷ F¥a9&îl“LK‚}ð8¨<áaŸ¯¯×LIU~½G­@ï,í¹‡A“\Ò›LÑC¹4÷Hç*ãžÂ£U ’O^Õ(Ò±U²sO@¤n<ôÍfäå«4I% þã'$¶Ž‰Xa[¡Æ3Q;Fƒ+ÍAwªÌäE-ÆÕ')sFÔj.RÐ’Vbª_4ˆ„ŒñJ÷ц8"’öTòvde½º ÂSR[šÂ-=JȪ#Fô]Ç¡=èCn-HɵBoã4᜜þÄÛHèb£*0Þº&µŽ2D¨ßFªTÆTb03øVŸ(¤”K¹¨¶=ȪÒ](&³^iTí36ÑÑwÂ]ƒ×ξâøúW¤Ü›½Î4¢ºÇ4Ò0@ý}ëN=âê×|SÄ<)q“øV2–Oºiâi ˾qÓ9ª„á$®)FOáv&¼µ’ÊP³¨ ‡ô¬ýBòâÒãÌ´•ÑI;W9©ouI$9$ã>µWPº†x„qœ‘ÔúW=iÆÏ•ØÞ”d­}I!Ö$›˜òOñ'øR˨#¡–3ÐôÏ5J¢ž¢¹}´ífkÉ ÞʼnoŒ˜˜ã’}j6^ì)(¨r“cI!^YÜ`ÉÇq@véL.{ôæ”6I”¹¥Ü¦>VÞ ŒõÍ1Áe Pw7Þ|áp(rF0hm± (¢Š@˜‚…`Ý)h¤ W§ó¥$M(»“o–Ñ©_Lu¨X%“¹Î -Ü›V`´Ø0ANŠY"ÔSh¡6ž€#naÏSïKE·`°Ë,æF@4”‘ÈÅ0èK=õÍÂá¶ ¨ãy²[>Ô”U9É»°²JÖ%œ¾:öÍQƒèj@ÒG—%d]¬:ƒÆ)åÔœãÄÞ³pì‘JqH¤a‘~êuö¤hÔtLÖªèòÚHôæ•ôI, çЊ¯«Ï°{hufJC¸p þ'ØÈèJ¾tY£ä6j[m=òL”㇓ÜNªèfr½GéLxvŒ“[Y…<Ô2XË»)º VLË0ÒMû*‰úVªiÒ ùÀô¦›  }O°—b•Tfý‡Ý‹…—ýðkI¬š5á:…¡`Ø Ÿ|RöMn5QÄ üPçð¤òàþè­(,ËãåéÖ¤^}*j„ŸA{T™˜?Fóå²$dƒøŠÕMão˜ð¸Oï‘ÅLºdj»T䊵…’Ü—Z= ?²0ëƒõjÏJûDm#0P:õ«6l´/Ja¶Ø1’1îi*\¯T?iÌ´eIí¼²ÃpÈô¨zœcð¸ÊW84ÆÁà®k9$™q—r±QÙú Iû¤ø X¢íŠpŠSIFãrH¯³ýŸÒ‘Q—øZ¬qÕ¿JpRN:P Éæ*œ¼Ò@vâµl¬ ˜eÔ1ížÕ5Ô6ë E>î3Zªå»%ÖIÚÆ&@åF~‚›µÏ@x«$’œSšGyT¤ªòË’Ûš)ôE4,Àn9ÇcZ6ú…üyv“2‚mœdzZ…-ÝþaÍ\ÑtgX¾M/LÓ¦º¹˜•¶¶¶‰än¸ £$õ<Õ¥8Î.äIÁ¢Ý¸Âî­HaôÀúTÒ®À@<ޤÔñHÉÜ­mV-¦œ·3VêN8ißjÿ*.4[« “ž†rÚMËùÓvw¡«·0¡H œãæ­(½Ñ’ØD¶¹=!côè­.$b¾QR:î­V{‹akuv–âBJ"ÎÞsØÓšt·-#‘,)Œ”Y·*lóŠéT ’ó1ö’3-í^æã쥕v2íZ3øbÎÌ$wšÜJíü)¸¾J‚çJ¨_<++NØÛO°Oe+ZXx5fµ3Y'¡uáë·iìõcqåÆ^EŽÙÔªŽÿ6*æ‰ðëRÖ¬žúÍÕÂpkFïC°XXJIJÛr¼ªÖ·¶'t7’‹€<ãéŠÞ8jqª¹£uäfëNTýÙkæQ¾ð»g(‚æ$WlùjO, ¨æð¥ÕŠ .áe=ò¸®†5ñö›ê©z¯)c™$ˆüÀtëÛÒ·‹|O% ¶k-5Ð 7e¸ŸÇ5¤pxy&Úkñ2–&¼l´}úkw¥°o‘«ö"§ç…¿*ô™5MBa‹Ÿ ikbŸ– fkvgUغnkdÆ@f1#®1€NqÏ9¬*à#nh»ü©bäÝšüN-%[€ðŒÐÕ•²›xdúžõÐÉáyÙË–SôŸðŽË/#±Ç`+àjEÙ£U‰ƒ[™Ëc6û6±f1cÅS{GNT VÐÓ®ä“gÙÈRzŸçR\h·† °Ã’x”÷Ñ•r©®¿þ=jÚ1túd†>ΩÆjâ|:ñö¢S£Í´””#5PËjKNWr^6šêyá°xÛž•4[¸*1ï]ƒøYˆŸN×(E\³øC¯jSl³¶0†\(8'¾©ŽYˆoH”ñÔV®Hàä¶ž1úÕ ÒÑÇJõY>ø³ K[¢(Éw—ŠËàW‹µ{æ²6Þ4l}¦ï÷hùä|sQW*ÆÚÊì)æ8][š±çÖ·óFûIëVC¼½Tó^‘wû3j–rAm¦Ý%ÓÈß½˜±Ä1œóÖº=ön´´Äšôr0쌠­(d™ŒŸ,•ŒêæøÇ™Hñë[3)©«hS"ù†2 Œô¯ "øSá[(U,£€¨ "kÅß ¡¾Œ/‡­Ueß$îNG<•éK « w½ÙÃêŒçmŽÎ8Ïô®›Dø}á]âËÂ62Y^]ÛKg{ü‘›IWd¶îãuÈe'uº?øQo&é'Ú3“‡«Öm¬Ÿ|»\¯v9¬)åË8ÚÉ›Ë2Â];ݣʭôÙ¨XªÒi×8Á„Ž+©°ð•ÂË—'ò­h¼"¤1þt©å’h©ã¢žço \HË•&¶tÿ ±z×[cáeÈ_,þ¶l|9´ÝýkС–¤ö8ªæhsZw†BŰŌÿ³Qê Y@)y*1^i¡}бþ•¦ž¶®YQWvÀé¬e 4yïã;ßSÇÏ‚¥ˆÉüêÅ·…¥†=‚"pk×t†ºÏ5Ë? x/CºÕµMEÊiúnlÓÏtÀ"8Ðr'ô­~Í¿¾é1xƒâWÁ¿ø{Ožu†ýwÃ×6¼Œ„**–;[9;Ié\ï ‡„Ô\’~¦«Vq½½O ÌXd¼ãЏž2€ç¦ÜWm†öža9ô:h8~•Ó Kcc[8äÑ8Ë⦋B(?Õþ™®¸h¤p"4ƒüëe†]Œ¾´ú³•:*˜ùŒÿß5ÐyÜbØ )›¤­5´lÿëOê˰–)®§ú ãϵG.‚ÿ©ýEv‡Gd!üêÑ˺GÐT<*ì5Šó8äðúä’ŸHhõEÔ|Ø&f†R£.\}Õ ­ŒzvÆà a¶˜ eâb÷ï^,¸×4kHÃîæzáÜ V®Oæ¿Èþhµßø$?ü«Ã^?ƒáέû x½nî ['³µK»%2×°;ÚŒdn&\(ëÐã öÿ‚u~Û_²“ˆ~<þϺö§Éfn.µH#ŽþÆÉC8+=Ý›Ío ›°Î>WSêõœ¿c;Ù'+‘–pÊýºc­xÿí•û iß¶‡ÂMGàÇ‹¾¤Ÿ­~ôEÿÓþÀÖÚ|ZLÞ9ø…-ÒD‚æåµÛdgDŠNâÞ(œàzÿÇ­v¿ ?àÕïÚÃ_–å>'|bðO‡"‰$ÆÂKBIœ&cÊùQRøV;‰Q– ØÚrìæñl)k}¤èbÉctùä€\c±`jìÑÜ}›ìÐÉåü¸,ƒ}29úûWÈË‹s›Y8ÿà(ú‘e÷»æûÏÂÛø5[ö»ˆ‰&øóðÝ@S’êŸÆÔqïW´ø5¯ö¢’þÑ5Ú3áݽ£\"ßMiôòÇo™£¢Œ;œ)dŒn^µû“o3ÇÏ&CòõfÐ]˜l„=IaœŽà`Ô®-Ï-e4¿íÔ?ìµÊöoæÏÈßÁ¬>Ò5é/|}ûaêÖ“övò¬4&™?™Ž \Kwr¥sÔyY÷®ªçþ aýˆüco&ñãOÄí^Ú‹[ZézµŽÆ<|̶í»åà県t¯Ô_´]¦¾YLo”’TóƒÓ‘Ó½CÕõ®Qºƒk`,…vcõ=ûk–¿ç8ªnk;?Eù#j9N]B¢8jºŸ þÁÿðoßìKÿøøÛ/íðLüA½ñ±žÒøIümæÛ•pòmã‰f8è& á‚‡UaöOŠ| ¢üBð¥ÿ„¼sáË}KKÕ-^ÓSÓ®¢Šh® t*ñÈŽ º•$r¥oÛÞýªé­Œ`DËÉ»*a‚O$we~ÑaAÆy¼™UœÛÔô9 ôgľ6ÿ‚ÿÁ.üiôÖ³ÚUÝÔSy7š‹µ;²I ÿY)r-ÁRrªÐ² ´¯Ë^{gÿÒþ– |Q•v“RøšÅ‰ôP~ȤžÙ$}kô^S%òn¬¢aƒ‚À0'Ó«Ýi‰8I#Õ®-Îy°þ`‚+º–o™ÒVi/›9'—`§½4þHüø·ÿƒn`Y$yþ%D¤fñ%§ãÒÜÖv¿ÿÒ~Ä)öË/Æ¿U$‰Ú?í‹R ~rù6§lƒÇ{~Kk~±5èuFÜ]sœ{Þ™w ^R´zƒÆÄƒýìûF2k¢’ÛRŒºÄ¾NòïØQŽ02Yw {Z¾$ÎzVœr\¿íS_‰ù£¦Á´_²_„æ{ï|[ñÿˆ×k¬m$´¶fBW vÂÌ6ò ƒŸº8¯7ñWüað·Æ­Õç¯ÚÞÿÃvЉ%—MñG‡"½•#mžR‡Šxpª7æB~äá9ý…»{<µ²ø™à‹Xä“K°k‹›­AG*€MŠc‡”('ñÍ~æhpê‰d!“LŠmc¹i0¾»š5äûd{š·oÄìÏjásŽ1÷F1éǵj¸³'ézÊ]iú‡…¦ŠkIЂ“Fá2®¸8`r=kï/ø&Ï…<ñç\²ýž?oÙWöˆ°ñV›t×>ø¬üGñ¤v÷×{Ý|–6÷%„©“åŠC¸…•ö-#dß:¤lÀU>™ÏZbÆÌË:G#(éóü¤úàu©ÌxŠy•' Ô’}Óküî<&R°SR§QÛ³Hæ´­MÐôÛoùSHÖÑ¥­Î°Ó]ÊûT*³Ï.é$~.ì]ˆËs[z;´ìþt0FFGË7×=³Ï°§ê7ê¬È#@s—”(õǧã\Ö¥¬[h7h¿\¾èßMºÊ‘ýÖVãü}x¯ 1sVHôe%{›¨.­fÿV»C$ŽÍ#gž¹Æ­Û^êÌÏ< FÀèsš«áYø’Ö9´ëøduPfŒH ^qŒ cšÔwº‰1n88XÛÿÕŒÿ“YÎñ÷ZÔÒ7j觬x¶×0¤M·åY2XúÄþS®|ÉÛÍŽì•^ i(QÆ:9«XZÜeg™NýÇÓ-£ˆª•en|±ÈôéRœ;i•–gØZÙDLÙ;Ú>‡¡<zR‰ç˜¤Ý1= þnÌzñœúSØéìqç2”Âá*=y"£›QŸOî¼È€ÝæI;òq°m9}ç½Vd+´hDdŽ3眞ØçÞšï¦éB¨ÆÆhŽ›l™{±oùfíÎ}1P››bÊÑÁœnð¨Iµ±z÷$·‰LdGr̤ä©e`?Jœ!Ú¨—Îï8äÃ^Ò+†g–I‡;bS?1R6 ñŸ&9%pØ}‰€=þb?­&ôÚ×a-™›a{™FÖÈ1£ñ'•KûÉ3ÕGgw{rI¹Ò$€pMÀÿÙMYEŽ5ùIúg5ýF¢™€àì/ÎqÆ)¯o$…$E Êò? °I•r’cÅ*¸Œ•/’9äóBv/‘ ‰!µ=ðI8¦Mpà`ã’çT‰c67#šˆ¬è‚;‚™'ñãùRóÑYDelÈg+÷Iïõ¨®íã’%Ž@ì`$_*¯¶:V%†YŒQ€Ç¹JHmæÜEÄ…ç¡~‚´Mos+]ZÅf6ÏbUE`rðä~Œg§­X7¹ —…‹ôŒ uéCCä’¢³’ÇŸÿU$QX ß ©ÆqïÿצíÐZ­x^FÙ¥Xr‡)³ t`¬`qùw¥’ùb“ ‚8¿:h¾³º<«¦Ãƒ½öŸÆ„¤–Â÷_RfiaRv‡ ÿî¾ø¤[E .áK)ᛨ“×§4ù"‡;FôÝÕƒ?3QÉiï3ØûÁˆþ‚’µÊK¨K× íÎ@õµVKc—i¶idÆZg„núnô«#C°XLîHè)n¤vˆ¥Â#ŽA•N?,Œô¦¯{ ««H®¼¼åÔ¹W?¦ib’Kfò݃×Ì óíÎJnŸ{q [5+»eô).å#× ~ud[ùÃmÌjÊyÊ?JRm=F—2ÐŽFŠGÆW~9CÉ>Ô‚ò’âã™03õ—:y@ÞxNv±VÀob?ɦ5ˆaäªBñ·PÊN;ÆÂqô+_Ùß^*I˜d8ʪ¦ïË$~uY´X/ãû.§áëg2²/@IÇç[‰m*Ä" Ub… å¬h gO?–)ª-Ó¾ç''…¬´»´oéë§Ë,x7Ä6äv`8ôäûûÖŽ›>« y$óŽre]¥zc¢àç½mI&7î±±Ïä)È‹5v-×'¥Tª·¹1£mQÎëê2{î[]“!ö ëœTV|o1škmN݆‹¢yÇ<lþXâ·äG·á4Ö˜ÿd?’3!!žØD§¨#'ô4¹ß-‡Éï\§d ´ìXmÃÌÏêC6)Z8ãŸì¿e‘HËÇ cßgž™Í]2"8 Øãî–Å8ê6…ÏRqjªå[¡›$Ñð'Ñ'L¶ˆSùàóOY"1ù±ÂdppÈ$=1ÓŒ*“äI[qž¥@üÅÙ&3%¦ãêpÙúàUÞ)jgï%¡ ÞÛÁ ¬NNN3ôö«Q]C4žR¡'Üg­V—J ´Ái`a9¿Ó½#B¶ÃdÑ®?ºTþt5´bSœwF¦Àå dæ²ï¥²eIêò2¶t%™œkÆjÍZdqÀ- nP7™Ùæy¨gY´«uM6ÊI×xÊ @*>®ÜþuÕ"Ž42Ç+(É~C?ÐTv:ö©<Æ7°Ìe¹}Á6¡98¬9*-z{HH±¥w+yt¹âà—ÄŠ·$B9ç‚ÙúsS#³Îê1׊G‘gˆÿ!Y·wd‹Šj:² wÈ"R¸Ã0?)«d©(žÙUHÆÃüªÃZ‰@yرê8Å)‰Ða_næš–ìõÔŒAJ±² ãœS_L…˜)NA#5kÉ\î8$t8¤8a†N=é)4?f­©Y ee0P:•àÑs 2£ˆÉlà•ëŠm•&2áŽGVlãð¥xâC–#“ÔœQÍgq¨&¬U·Ô"(cœ`H+'\zãÒ¤Žxä;S“ŽJô?JУ1y2r1Ï5Lè©й‡ºnEÁßž*k•½DÔ’±&Û&M²3Ád{T‘íÉò¢U'¾:šŠßO¸e9l’Ìÿ…8oµeI¼Ùõ1Ävóõ¡µÜV—bròNß¡‚yÄ‹´ù¦S!ãn]‡ʦòÁ‚~˜ÅO¨Ò“Ù æ‚Uøõã@b¸Gò§´x-ôÀ¤]ŸÅƒž”ŠWlUd\á‡_ïTßÛÛ²Îr;”<~U>ÕC’G>Ôª«ÑH¦­ÔmK¡Ÿ.½ Íå%¼’qæÜéŒçô«>dr.ç·`Hä©]·…±€ÀsJ<·Npîx¡Û Z}FypÉÌh} §B=ˆ¦¥´h FxÆæÍ"ÚÆŠKD:sšAi!ínmÝBEBT–ÀYSÔš{N‘ü¥ÿ#J“¥@çu¦®EÓÑhE˜ä¬¬¼’ÄçŸLTˆ"›æ’•?Ä´¦áYIWQØîþUÏr0•qŒ‚Ã¥;6ŠêLåJãiÛj)-­&Qö›d8é¹zRy²MÊÉ)<I?…,°»ôr£Û-:ŠRWÑ>ŸamK0Ö£6VŒ ¢ˆå”)?Ö¬r2ò:OÛ+‡ÒŸ3]H²ká)&›§¬¢]˵@Ü!þr'·P#ÀíµN(Xe$ƒÐûÓšA@¡É¾¥AIt^×yXÔo²òjTsŒýi±ÄcßÍI·éùT›F.Ú‘&Ê‚=HJ‘’qjVÈšM­Ÿ¿úRVê#±?w#ÜSƒÿמ^O'ô¡Xd€h On{PT ³1¥'Ðfd ç4—AŒ€& ØÅ:5`0Yº÷ÿõR´*Üdþ›¹ äxµÕ‡ªñ’)@äµMüìà õ&œ@“îŸÊ&+Éåãp<žÀšiß’Czb›·Œíé“Ò„Ú718éšRJ“Ͻ=”’lbš§ÃlÒ6å9€2È>œÐ*8‚eHî)0Ô`óÇZ\6ìç¥^àQ€(aN{R!±ŠVbíÇZq&´IÓk’9çi¦&™n¸dñŒMY¢Ý¬'·{%„H0=Í5´»wpÌÌqÑ{Uš(»³‡b¿ö] ;–0ûØçó¦ý‹—k‰„‘еEaɈŠ+XÐ|¸üªB™ïúRÑH¤¬7Ë÷ Çþ×éN¢1ŽÆ/ÞE7Ë÷¨ÍœM'œc]ä`¶9"¦¢€+­ª)P8n ÑmŽ1…û£>•bŠm¶.XŒXˆ<ÈO¶)L`õ?¥:ŠCµˆÚß-¹d*{â—É㉧Ñ@¬ˆšØä9AJ¶Ê¿ÆIÆ5%*#ò`)D*§ Óè ,†y#×ð¦}ŠAhUˆ9¹ þ55 o–CúP#ÀÆêuß/Þ,w4ê(¾PÆ4ß³àñ!Æ9%QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?üA…ÁdqÐÔ¬X) @úŠ£ÊFG™ÀúU–AÝÁ‚+ïTÕ›q’#”K$ƒ ä€qššÒ Ç•uó2:Ôê«ü=ª’Wæß-Kˆ¤Qº²¨O›qê{Õˆö³mÚ =9¬…œÅó!ý)Mû¯Ý=ë®5’Z˜ºmšWwl‘Xç-À©lõmiÛxìËŸóíY}ÙyÜôã½,s²Ÿ½Þ©V•î…ìÓZ-¾ª×>ÖÀí›^¸ž¿ýz’ßìØ—Í¼ 'o˜ç½aÁw2 Öð–”Þ!Ô<¥Pbˆo›ŽvŽ§ŽŸSÒ»iU”å¥vrN mè¡~ØéÞ4[/Kyù6ÞeÐk´…0áºCò¢žAcÂŒ– Žûá?ìÍñ[ãæ¯®Xü 𶳬'‡m>Õ©&Å®ŒQòüÝËêðÄ‚ Á*N ¯*‡‡|*Öú!Ó”_Kl­,vñu`§ó팞àdô¯ÐÏø#÷í ðGá_ƒS*ÅÅ¥½ßSˆøÃðsá~ YéðÞ³§x’… ‚=­§wHQg‰ã‘$2°ôÊ‚28=kÐ|Cû.ùŸ®/_âî“áÍÅk&¥¥%œÛ\C,²O„7rm¸Rff¯šxTb¹·¾Òô½~óÃ6ú‚3Z\IÝ}£íVòœoŠU]Ò) ä.àFãóÚñQ“ÒÌúl,”í(ìɼ;ª¡0éºÏ‡‹D¤¼?ºvc† BXn@ApÇ<[ñß‹þ%Íá‹­oLû5šÚB|«ç‘^_”‚ab™Æ ãëX«-ÌRdÔ/$;±¬ì¿{îüÙwgéžÃ5èþÔñ…ÚêßÃQMöAõÅÒ³«H]NTñÁ\‚ÃÎsƧ-޹C™µÜøÅÚ¶¹®ø–ïUñ|:øv.×-«¥ª¹ÉI:v§Spcv߯}iÕò}l{¡EPEPEPÊÞD*aŽwõ²Œ€Ø†{Ó@ؤ”1èF:wé)ßs•ÂĶ÷ ²dÂ’ †ö«)zÂ<™NOZ«$¬ÁP"¨¢ç­#L„UÆM-q‹eÁu(ûÿ¥XµÃ®üý*ŽD€Ôô«p;¯pkXM™ÍXµ¿ñÊžrGʘ¨˜üc×ÿgïÛx¿ÂóEseªÅª\Û³Ÿ)¤XäÈfA€@VÎå]Ø ¹ýbÿ‚YxóÅ·²ÇÄïéþ-’÷⿊´{Õð¦‡- ctÞTm3"ßæ’?ÞȱÓù7 ~/:¥R–.­ÞòŸõqetœªÂ¦ñKo—cç_š‰â½þ·ãkéæ¹’Ú[ 5²uhÔE4ám f‰‘€tdƒÈVL}ÞwJ±Ö#Ž[›uÞÙäÃ0µØ±HUw>[nФpÇŒ``€u.o5y޲ú§†P¹KfŸNXщ´!”uB >§j–QM¤Jú{!‘&{&šD˨p ¶1Û®zõ¯“ÆY׺ëø~,÷pßÁÝè÷}hhWPÅ©-î·-Ͷªÿ42*y€7—æ Ï=ÇãZ·^7°Ñ|9r©¨‘ î%Iïüí°¤eØÇç£9c÷rH®FÏâjÚ!¼Ô5s".nl¬ã·Œ`î  ÛÆI=‰5æßÿiÅ>¿ð—†ôI÷LûRòG VP¶ŒO#½žØ=9^MÍë¨áàÚº»è¯ÜœVaC Oß’NÚ.å?‹µ|n¯ ø[f¦mEÌP„º/Í´°ÎÀ î!HÜË^NÅÞFšW,îrÌÄ’Ïõ¢˜eÝ÷8úŠý÷-Êð9Ue†‚Šü_«ê~uŠÆbq“ç«+fé '©¢¥z'0ljXϹ³W'9ý+Lí_¾¿J# ¿Z—ÕŠŒ¹Y…ÿÍ”íºHœç,¹æ ½Ð¡ ¹ë]2vð*­ôgnö3ŒVR£ F´ï¹ç>(øAá-tºÓ$‡B¶~£¯ã^wãÙûìq¼þ¸‘ˆòg –ú^ç}4h$+ø¬ †ãë^.3+ÀâSç‚OºÐöp™–2ƒÒW]›¤ð?Œ-Éøzä9Û?ʳn-îm%hní¤‰Ôá’D ƒô¯¢uXÞBË‘ïëYó[$ŠQ¢Fއäx¯›«Ã´¹½Éµê{Ôó™5ïCîgï_Z7¯­{åž…áéIkÔ’Š?Ò£¸ðÇ…£2?Ygþ½—ü+õmuQ}ÆË8¥{8?½ ®Hª0M{zxGAžUŠ?Y#‚,Óü(´ù¥ɤÚa¹ÜÑŸÈT.Å=T“)g^©¯¸òrçºþtèæ$á—œÕ2ÒÇÎï­6;™?ÞüzWŒê¥¹ér\Ðó¸F}E<\FܸϡZÍ7g•¤Ží”Œ®xªUÕÄé&l$àŒªñžôø¦$fãÞ¨Ç8 ’=1VRM¼·>Õ¼*6Ìe´4mîv)}õÁ$ǵZ·º~9ÅeBêpqùÕ¨¦öéß5ÙN¥ŽzLÖ…!ö™·µð¯ÄOñz@od€\åwÆ‹¯=x®Z7wm¡¸÷.Ÿw.©GwånHç#鑚î£]Ó­.µhûJr‹ê}c§xJ÷ÅzÅ…ž“}küsù¶Ò^º¬lR) ÜNCõFAf'!N~›ÿ‚oþÐß?gˆš‡Š'š+ÄþŸÃW!±ìæÙ.+4L›JÌf‰¤ŽØÀfíqñ†¾%iRY¥½ìÈö†Ý[j.æ^ ¡Îx5êø—ýWNñ>‡}s§Aml’\%åꑺ¤ìáYwI… J Jîb4ñ6 ×ÿj§g/åóíý\ñ0u+Ðq¤Ý¬ô=Îßâ7мsñ3Å~o ø¶MJÄ]L|ñ=ÃݤXÚùà ƄÃ,’…B\(a¾Ö$¶ÓRïS¼H­¤9"”,2¸ÜÊ1žõ§ñnÖ÷Æzrøçà„>*ðì^'Óí Ó5 ßO¤XÚM‘NÐC ‘åX$D·mÑÆYeÂ1&¸¼gûZüKŸ†µïøº]CLÔâãHÒl¼s^3}¦jz,í¦kž1‡)ƒŒ©8%O­u~‡Bñ óZêwWÐÌD×2H¯< b¨€´g%GAÓnvžm|EøW<š5Ÿü.îì&ûdrÀÁá'r¢³mA‚[;pOÝOÓp¦>6hðu[µM5VI®º½:¯¸ò3jo‡UྞŸwÌâj"qR嚆èkõäÓ>PG!Æ)<År6öõª÷R¼l§$ÔfF©ækbã–šU†o0ª¨,C€“òòx'×õ­«½'E…ã‚×\Igl™FDŽ5,’ùÆI=öÀÎk›iïЫ8$UkwVµ&‹;œº8‰È¯0Ácñ3楈tÒÙ%ù÷ü=Nü5\=8Út”›îÿ#¥Ôbðì6ñ¶©¼Ò:(•6°òN9ÃÛ(ëÈaØc9®{Z»Q•e±’¹Æ0+"÷ÅÚ÷̆îã 9Æúœ×5qânUigÑîcßÎÓÎ#¿ø})á#<­iTo¬¿K:kSšQ^FÝÌåNù[õ¬»ëÔ9%ð=«Pñ>±)1[XJ 2!÷ÅE·ˆµI|±.}©TÄó;E6uà â¯&+›ø‰#?ŸNk«vÈ2SVmþk×¶ïs{4‰—äÕiü¤i»_R¿ÆÈS|’¹?t¼ ŽäXÍW·7-½M èór©\a¼´bÚþû¦É©X.UïbÎ9AT¼C¦øÇO76> ‹ÍUɶžà,ŠÎ0 ½<žµÈÛx‡Ã·™H!™Ë¦LaTž¤÷À®¸µIò¶¯ëþG]<+©dŽÈk6hû¾Ö ú‡£ûzݘâõ÷Î$ªV?ð¯æŒy‹xIL+†nÇ^¹ü*[•ð >\p_I!fÚd3du-ÇËøþj¬ÿ™kægìã{r¿¸ñ™åóBâ™àœc4¥3üF‘7徕ùómŸ_ÐRp@ÇZC’ààdPÖ“|«!9#4€¿¢é—Z³J¶þb숲”MÃw`yϯ®z7^FKO…P¾Þ7£=*œsËo¶Ñ»؃úSå’k‰NèÂÙ+àAUTŒ´ËsJ)R3¸¸#ƒÞ®[Ü©6(ÐVk[Éy &ž†I™£5Üø'ãtz%ðƒQ´xcó¶QØÁÂüœôëõ«©C*Çtt¤ú­¾íŽ9ÑÅQZZ¢]ÿ~çégü3‡ìU­ü ÑLciS[){§I¤½µŽ ‰ª} .A=X7¯éßÁS„>¹7(ÕŒ—–ÿðç<³'‡I:n?‘Üëú…îI… uÚF2±F‘Ä«ÆÆpàL˜œdyÝïŽ4 )'º²¶Øü¥bdnxÆ2½;ãóâ¹oüMÒ´ M6Þúk–h­ÔxbU²¼GÍ·œö?Q^TÞ'¸Õ/‘¾Û-´UÔ”t\uÈ#¶:dzW«ƒŽ#&„),D§k{®Í/-›ülf°‘ÇÞ¤à£é»þ½a¾øÛàøÚKUBùåbÇË’0Ä>AÀû¼çëXëûExÚgûd2¢«’Øçð Hüp}«Ç&dwhãa±íÈÏ®p3š©{eÑì'“ÐW,ï—ºÕÎÈdø$ÕÓûÏr²ý§¾]£Kss=º#m$ wqÔ ÇÔ Ðÿ…ÿà—°þг–i£ ±º—éœ`Ó¿jùÆ #&%RWÓ«£O·†=¶ñ€vü¤ôüiRϳ&½ä¾áÔÉ2ëû·ûÏ¡!øëðÞêÕ..µDŒÊ€ˆ˜n<öôÏéïQkþ$ w.¡o4¦2V(c,ÙÇÝ%AP{rqïŠð5Óã$ “9ÌIÏéÚ§“Ãó8X4ËøÝתÈqè1œýkOíÌkŸç÷²\wRyéž!ø—á³ \hzEÄ—ÄqI"*{ýÜ“Œ23‘Ïz浟xæ8k+µ´Fà"Û)cÁÉ%³ÌŠæ4­[Y´–G’)Ð[œ<ÀEÇÏoÐÕÍ{Æ]Ù$¸³Iw)óf9Ç@ÁǹÜZæžc*Ðr”Ú}¶:á)(ÆóÕ“Ÿˆ^7]2]9|U/—0e‘1 9°;xãå#­dØø«ÅVšQ«ÜÉ“G5˰uèy'Óð¤¸Y#îâ5uç}«yˆ¹èÁÀéUáÔ-%“dJsŒçmyõ*Ô”“”ßͳ¶ãÒŠû‘>¢‘Þag—'•ç=Ïÿ^§é…J"[n?ÄÝ3ëô¨ã¾Ò¶K¨BŒ:ïp1VíšÎí„6úâ²I[vRÜõç=)ÓP”¯¥þDÉÊ1µŸÜ2[‹µ¼’Âu+åÒmÀÀïÒ ‚}ZÊRѤ'{r$c8îOÖ´¯d²ŠÜÁkÔ'çl‚îÝÉöç8ª —o•IÏLõR‹Œ×¼ÛeGcŒŒ“A\õü©h¯š=p¦¨# TPiBà“ëØRÐíß?ºØÿÂÁ©¯#ßœóÅ!Un£4ªdO¸ügjù¯¸îhizÃi07Ù¬ÊÜ@¹G9 Wǯ|þ \¤æh™Æã‘QD÷w2µ…‰ –U‡SRùÚ™€ÜψrOà ûtªS§¹<¯r..ðPg¶©I§ˆB¯þðUÁ¦Çs˜º0l‚9úþ?¥];¾öëU§¥ÄÓHµn—"îREþ5¡§]3dÎMP·“í24be€”ÞÙè¿u­M/EÙIª\Ή M´æM¬p3žœñÏzè…hSW¹…H6½âôM$c÷rmã«ug’T,Ýýïþ½Q[»-"ŽÒd ªÁ‰8Ïsв—Ä‘Ïs•=Ïcé^:±–ÏCŽPh²ºT7vÁ„Dg¤`ÕËKÏYF¶ÚÍÜ6á·yK3laŒ`Žãc¥BŽó2ùa m<`·_CÇÖ”™„†KrŸ¼]zæGNõÕh«4Œ[osKU“RÖ#7i {cŽÖO•9ì­ÓߟåXϦߩËx¶òL£±Ôuö>¼ŠµitÍvVT›-¨É<Œ‚3Ó?Ê´õ#¦ÜHÓÅx…¼’›D,¡±ž>eŸ|VŽœ+^IêB“§¥´9õ´¼Û,û‘ÆØyrãÚ¦N’X±8ÇCß$ôÞ’ý™q\ ¸ÚLTÖ7ÐF‹nãjÐ6Ñ×ô¬” ¥g±£”œnB,–e¿•#Ø2#7?°ëõ©¤¾ÒÖâmdÅY6îJÇŸ›©ÿúúÔ³kF>Ëaioî,ó$;Û=¾gcýjýORx™î6ÊŒ‚'œß/8ƒòúãëïF‘Ò ®÷.]YÚ›E¼—H{FLƒ¶ì=O ZÍšéà“}Ž£tI³9=z÷ÿ–Ã|–¦àûª; d¶.¼—bx'4朒qB‹QÑ™HòF²×w®:È2\³UÏ¥l5´Àco« 3ÙÇ`k™Óu%yFªŠÐ§gmqj>[©UHÁHåÀ"§ò,T Õ•”pwŸÐUÈô¿8…Qƒõ­m;@²X|Ùí˶@PÇ9ãÓð­éáe-•Jê;œüVŸhu‰ÃØ3_Óôão0<½¤ŒM;S¼·¶¸1[YìÛòá†ݪ+M\[βé9;²ÙbO#ŒŽ€¿ƒV¶h§»y!Ts…,¶ Ï®ùæ«Üê2K·T „œ‘ÕÁ á¹;¹Ï^kCšW-IZå#§JÙdš6ÁÁă×õü8äRG*ûYÎAÇ ù÷7’Á HZ#µ—1(=$þfµ9&.dÉí$ŠÍ¢öîûÓòñÎïZÞ<´ºAi6—C ͼJ~U`0 Ï_óÚ°õeò ù:®qUŽOAÓ°¢Så–‹`PŒ•Ù¬úå£6ö¶R¼'¹ëÅ9üSƒÄ–?t° ʃ÷…(VR$*GLkYlÈöTÞèÛ²ñÍÝ„eDNÙ%Àôû¸#§·ÿ^Ä-àˆDÚDŒTY®‡?øís3+3$³K3rM1q“Æ~•qÆb"´<= nްüHˆÌ%mG9!nÉü¨ºø©-ÀÀÐ㸛¿nÕÊ• ssëL‘v¤c'® SÌq¶·7à…õ<+û?‹ÿ3£>?w çijä’2ÒôúqÒ¡“Æ-!>]ŽÎã÷¼Ò±€P sHøÜw=ª3÷—à†°ôzDÚ.™3›%#ÓÌÿëTÖ¦µR¦‡R+ç ñŽ~•Ï*HäŸÏ&¤ŠÊIŸËŽ6v=—ŸÒˆbñIÞ2ÃÐꎂçâ%¼ëºßÃé ž+’= ŒþTŸð²¥dÚÚB;´ÝJ§¦øÅZËѼ/vøÈK{V‘±œg¶H›yéò{˜Ln8(GOŸ×1qws%að²ÑFçB>!HW¢¯á>?öZ•~#GàxywFæŸ$ûæ©xWÅþÐ-¯-õO‡º~¸nm(öiãû<‡•|™–\tl©ÉȪSê:}ÖŸ,#ÃÑCp×AṂw aˆ)'vIs~\gšk1Äý™~ú¥õ¾oüÍ…øšbmßÙ x"ãÿ±§ÜüZ½•vE¦4j9ýÝÙLõöæ¹ Öà“‘‘ÓŒš ’Ãy Ró¿v +‰§È§w$]žŸwõ¬TŒ–ݜ穧¤\î'µCÅâdµ—ùì0ëdoézä.æ-/A»’}¥‡•~8ëZîüð;ö»ñÖ‚úÿÄþ Õ­cˆ³ÿai¦î`˜$±Ž-Ò±'nV=‘åvWOgp²[ÈêzVþ›ã ^Ö^òYVhâ†àªï\…|ŒÍƒÔdã­)b±1VR·¦Ÿ‘¥+ò§êb$Qu8üjU!ǧ{Ód·{Yž %ISƒ‘‘RÃ+œã¬SRÔ/rM¡ÀÏ$E¯oZ‰TäïOÉ3ôÅmc'vI"‰q×8§[Ü=µßÛmÕcQœ¬Y úäŸÇ9¦3ëšTo˜…‘ÆàAÁÆAê)Í6 ص«_µìHŽYöÀ18PNp¸= Ï_^µJ}>+`GRÅwW·9?—Zßñwˆ¬|U5µÖá(4¨l4èmæòÉ)— çHÌHÜÄò…P€8ÉÌÓ`³–ò%ÔUŸ÷­ †`¾ #®?•L)ßo˜98¿"84S$AÉž¢™u ]ÌŠ!•©ä“ÚºmsÂú÷…¡°ŸZÒ§·‡T±šlÓ&Ñqn]Ñd^ ‚QÆA#*Fx5’mï´×œ<‚¸1ã¿­uº4¥ddªÍIêQ¹ÑZâÏÈÀßü-ŽÿáX…]¢— ©Á®ìWˇÊBªIuù ëYz׆?´á{»w r«’?·×Þ³Ä`Ü×47EÐÄ%+HæøŒÓ‚›;/-²Ta—+Ég< [»é¯¦Üɹ„Iùqòª…=…y:§fŽÔ•ˆÈ :Ò*àÒXáTñïJr7p;P *öé­?ÃŒš‘R0@‘ˆÉôÍYŠÎs¿qýØ!çëÐñüé9E;ìS̼Ϝg§½lé^“Uµße«iñÝf¹kk­J p ‰7–Jê!Ã…„#U‹(¯µ¿à’ßðL?†¶eåÿÄ?ÚÅGÁºL‰isiðÛÁ7ò¹ ߨ!¸p$tÇ4A&]èÛ”×ï§ì ÿßþÉÿUqOü›ö§¼ñŽ¡ñ“NOxwQ¸+¨øñgþÜÓ4‡&2ÇR¸ÒÍÈÓʉVIщ’<»ºí/_ðs+øÇö‰ñˆ5ïÙHñ§Â;í´o ø#ĺÃÚ\Çjñ1¦Ø÷VªÆW˜ïŽ.Ó‰T) ñoíñû_þËßµ§Ä;/Šþý§ð¦±©i±7‰íôùMµ­ÞØüĵ„\Lerˉ¢Ê4iä£FÒM¤=§2Ñ+ƒºZ~¿´ü³â'ìåköù¿h?‚^,ŒÛMv¶~ø¿¤›Ñh£rÏäM4~g˜£)-,ŒJ¹aŸšo|7<³ùM*æFwVç§úUû­wÃMHôó©ùÈê9æ]¥àG#·ù/ü_3“•ªÔ‚²\©w$w!‰…[RKWqGÚ9FÂEˆË´²)åñì)‘´i÷ª{‹ûëÒëqu!Y•» Ó ÅAåÑOÓ4+ØÖýÇùƒnì“ëJ$'ø{úÔe@8öõ¥+´ãgÐÓW%¤#n½i¿2¾øÉör)þQ8?÷Õ8Æî¯ëNÝÇ{¦È“ŸZ|voÁÇé^©~Ê¿¼/¢CâèÖš ¼Úh¾‰|KªÛi²Ïή%Y.3Ž<µ$ÃVÇÚqŽR…Tíb2A#ÓÔ{׫J”*/wS‚¥IGs%íJ—ò5kJÒ`¿b“ê[¶à˜§v¹cž™Tܸä`š¹%¢¢ñ‘ž™¤[PNXþ•»¢Ñšª·:<+à†ð{_øœ5•ØÒÖM&}hîãžs+€—Šfc ²‰WiQþèù¥Ç2¶i#ˆ&æáAO×üô«fF(éO03’Ë9뚪tyn·ê©yð7ödÔ~%ü2ñ—ÄøL´(øODÔoç·¹Õ­e¼•­müÁ سù² LUFTÄŽp"r<ŠÊÙñ¸©ü«¯ð7…¾"Ë=lj¼¥ê’¶—f÷—ze¬’-µ¹IŠ) ÜA-òóƒÖ›â|BŸHO‰Zφo†™«ê2Eo­6œÐÙÝÝn>lq8Q2w*}ßAÚ#EÒ›”žìn¢œKc.mKXÕ4k-6÷_¸¸¶±¥ŽŸ4Ò2Y«¶ö(§ä@ÌK¼ä{‘éR2—b¬YY¨\ºóWm –æU‚Þ"ÅŽ0;ŸJôiÐVWGê´ôfRéÆÀîPCÏùïW`¶Ž&ÁUlûW{áφÓê:d¶ÚÄ7–…‘R5ÿkÉ#?•t~øwá½6·=¥µÍÂ'Êï6èÉõÚGès^­®«Õiêyµ³*0Ñ»žñÃv§Ã‘ëÌÑA"È=ò¨iꓸœäp?âml É,ÌW#Šô¿? uÿɉ/¯WS[ÙŒBI -ñ…Û rÄuàWšÞ]› ª#Ørµñ™´§sƒ‡,’×üþgÒ`gábá+®ÿ ókl®\Þ"¨ärH®÷á¯ì©ûGütðž©ãï„?üOâBŠIuoHЧšÊÅP+?›:¦ÈÈVRT¶pÃŽk?à,‡ÅQøío­^xB ^#âM/×C©\YŒ™>Îó©„?|ä»ä~³xçþ1ý‘|ð_áoì“ûþÆ:†•àø‹HºÔÿá7°Ó®™¬m&ýë-º«¬·’)}¤É¬€2Û‡“9NöÜè½µ¾Çæç¿bˆ>ñÿ þè^&ñ‡Äý>X¥Ô~é>¼2XÀ2· tÓySG,R´QÒV2æ®Ñ¿öSöYÿ‚YþÝ Ó¾$þÚŸ æø]ou¥]ÛYx+Ã^ Ó<97‡äYvÄÖSKu×’1=äépÞXb’f9#ú“öñŸìûv~ÐßðØžøy௠ø¾ÁDú6£¦x²Å5é7¶ÌóK¨é–wr›i¡iÐsšÌÍ<Ðd‚ÏU¶z‰PFÒ°JFwÃ)‚;ƒì;óÔªôuvgƒþÄÿðNïÙsö"øcà¾K»Ø#‰uoÝ\ »»š(bƒÌ”ĉ>T@#,Xû—ûkÿ¯ˆ5¹„×6á–Øˆ¢$+7Ì¥ÄJpÀ(#' ÎHtqiÚnš|ø4ô·wc¹à·q'$“ß''ñ§yÅñrXýÜãð5ƒr—SEe¹âÿ·/íð‹öýœ5³Ó|GyƒðûC™¤ð÷ƒ4‰¦òäí¸ºg#í7;HÊ…^vÜÅ¿­?‰ú¶‡/€µ(µë2÷L{)WTÓµkA,vÆ6ó!‘à+&àY•”K)¯åþ »ÿáý°|+ûvøßSøWû.x‹Wð÷Š.F· Ü|5ðëi±Y^/˜¶ê°[ìŒÆÅãhÆB”Ú±šß Ê¥ï­GhßCáYešWß4!õcšk^ÿ¥ZÖ´]gÂúÍ߆¼K¤]iÚŽŸpö÷öÖÍ ÖÒ¡!£‘GR*@ ‚ªÄÔ×¢fFò°à´Ü þ#NeÜsšj€O5œËÑ ŠÇ•4»Hþ,Ó•Y¹Å'ÙÓÕ¿:ÒÂ½ÄÆîAý)ɹ³æ údS¶ þHê[¡ BÝÍ- ¢Š-’{™."·1¬ŽJ bp;zâ´tŸ‹ë˜ã™BFHó˜…Q‘’Hþ@Ÿc^“gðÊÁd•Ôÿ²«œVµ§„4ÛR–N;~K'’™ñ•3H_MNUðßÃ{?XÍáÏø‡QÑÖÚÔWQxm.SóJ‘˜Äª¨3µXä¶7™Ø:$Ðþ'…¿¶/¾ê3êW ñµ¤²Ei§(#HÓH÷L꯹J˜2–Qåž«M³±Ó®â¹›K·¹Hœ7Ùîwyo‚itfº{Äz—ˆ|?.¯y­xn)ïî"‚] Ið¼62@/É: {Xíâ8sždŒ¹‘[©©äªñWõw¡Íß+vüóÿˆ¾ØÅâ ‹ Ý\Ü銋,·–ٰЉ a¤ÁG-w6⡲q? µˆ˜ÏÝÉ Ѽ¶Æzä«cŒö¯º>þÄ_´GÆÿxwâ„ü á{}2ÏP–kÝOQÕ#µ‘¬å$}¾î/4±²ìrª²F·±emÅgø¡â¯…–Ó|âo„ µ‹­M[|Mà]Zò9ucs4³¶ÇEšYƒi¶È‘‘Gcyó– EN §gf®­¦»Q©Š©whö½ìÏ•¾ þÎ7¿}NÆ2ú/éDG –VÚXZ9-å#iûL½ ù°d‹‡¾h3Íw øBæ(Ã3[M{¨¤¢Ö?02°„ *YUc¸©è$ÓF«®¶‹áqy© «ãž —=Îç++°Ù”Vo™Š‚ض]vûÂ7©5…ÌÚ¥¤âFÔ#½k{‹YÕ‰n;L%H\mä2稯¯† †½H$¿ë©óRÄâqìÑ%·Â‰Þ)Ñ®¼_¢x\¸Ò¬#-©ÞZYÌðÃC!’GU*ˆ$ñœÍs¶ú¯‡Î´t4HØùy“çß#‚@èÂçŒóÆö¯ì§ûyÿÁR>'ÜAâß ~ÑþÕ<%¡[C§jÐüI±ð¥Ž«Û³D²é³ÜÉi³³ÄÅœ EËÅ¥IlŠýšýˆ<[û|høý›ðgLøWo ò øWÀ·zuæ›iª¼Q¼ÖÇìȪäqómVl)ú|¾/Š+á*¸Êœ[ò•þýf†I ôӌݼÓGó¹ðóþ ÝûH~Ú~ð÷Œüð{Ä7ß ŒÎƒ¬x¿Ã:|:«è÷(›n%m>+„¸s ry 0D|*ù«ô§á÷üÿçÑôý"üGø«âS¨Xm¼¸¶¸²Ó¶ÞnE.°,¼JIl!/±Cc´‘û c¤ÿgÙÅaQ$j  Œà038Q>“–5%äe%«>õ¯ Ï cn1ø×Äf9…LÃ*ÓѾßôXL,0”#N#ù4ÿ‚¨Áþ;Á>~*ë~/ð·ƒu+Ÿ„÷Þ"¸·ðwŠî+Å‚1¼7²Ä1ì»~V ¸«qò°ÃÿêÿƒlhÛ“öyðçÆý?ã7‡|#¢j:Ä4zÞŒ^i-O”âÚ[rÆç„aåHÐùNŒ¿)w5ýürø ð—ãçÃ}Sá7Æ/…VÞ-ð—ˆïm†½áÍff‹íRE ™ ) $H›ï¨ q‚Uð‡á?Â?‚^Â>xoÂ*,K>™áý D ‘$H\Db±¢ 'qÚŠÀÉ*ÒQ²ÜêqsNìó?ØËöð—ìeû9h?³?ƒ¯µ]oÃú žXõÛÝïo²›‡Ž2¨‡Ë3´’IJ‰™w8TQíš>§h¶ÆÝ­À]«+#<`[9ì9c=ëf7•ÜÄ’®Uy?!…åßï”ÈW ­Éüx®~w-ÍTv9«éõku‰U"‰buŽãÏBÃ#32lcŽÁû­ûXæ™Èâ@_ryÎÔç¦TœžzçŒÔZ[[9[o´M®2å;SޏÏNÃÃÞÖDI4†ÒÍY<Ù&‚à~ý™ŽäÛO óÁêH¯c6ãrߊ´¨µ¡ý‹=”J÷‰Þ9Z71í!‚¸ÁÉ;G^=ëò›ö‹ÿƒ°ÿdÏÙã¾Aû5üBÖµoë–†&†êÆÞÊîêÖW‰q'œÎ‘³§úÍ…ÕyØOôƒö×ñ_Ä¿~È_ü}ðW·³ñfƒà kQÐ/nQ Z]Ae,‘JCSµ7 ƒ·‘Œ×ñ/¨j—úÖ¡q«j×’Ü]\ÌÓ\ÜNåžWbY™‰ä’I$žæº(B5/Ì +vˆ^/¸ø…ãísÇ×–BÞ]oXºÔ%ƒÎim<Í!]ÍË`¶2y8ɬiz~µ<'á=kƺôРq6I-¨£«1ÀÖ½ÓöOñ;L©ªx¢Ê8ÿ …äaø þuîá2Ün27£ÒÓÈÃÂᤕi¤Ù䛘w *kÙáý˜ü;aëývöâE?9%#é‚GçTçø#áK9Ë'‘ÿVòñÀ]‹‡ó­b—«ÿ+œÿÛðÉ¿‘å"EîqøÑ¿ÑI¯[_x~Þ=‘èvØé»õ<ÒÅàí-SM¶t%æ®9!ï%øóL=´Lò{{[Û¾mm$p:”B@üªÌ^×fl Ny2`cßšõ?ÉÂÁç *¤úhæ\J¿ìUŠM‹ûK›áV<íü/­¬»8öùi¸cüJrxKS#™aV?á]Ìšku£:q¿åPòº~cXé>ÇÑãNÙPÄqÏS¢ÒÕx Šþ’%ÿ‚.Á1mà6V¿²®Ÿ3Èàf]BùÙr8-þ‘¼tãó¯Ž?à¥?ð@‰_¼wáØ¿àžß < áÃO¸_ÞêZíäyq#¡ˆ¤R5È+‰?»%›ø}Ú\m•΢‹„’}]¿ÌùÊœ7„[RNß×còÈŽZCÀîMI*ë•#íŠú§ã?üçþ ‰ðBÉõ Köh—ÆÖ "Iwà]Z@†/…f,·,yÉe‰‘@å…/ìåÿ0ÿ‚Œ~Ò ºðäÿu/‡6Vf).u¿Û½ŒK¸€"‰J´Ó•\œF¥&ÒÊJƒë>"ÊÝ'R5ceçg÷Ù8÷5MßÓCæ/Å*Ñ-®,4êpÝ[Ios ­ì‘¤Ð¹Rñ°R#BTðJ.AÀª1Äb9GÆzíà‘Œvöãé_¢Ÿñ —í´ª³§í/ðçÏWÁOµêaHãç'ìÇ'Û{óIwÿ¾~ÝÚZ@lþ8|4¾ifÅ˵Ýê,K¼µäû>¦¹0üU’NOšJ-ÿ[ØÖ®G™Â+F×õæ|_àÚ›ãoÂï êøwâýGE¾Õµ#u©øMÖï`¾ºŒÅ$olíÊž[ï̪²3F›‚¨XüQñ¾/ˆZMâ|Gø}g¬ëwÚ‡Û.¼U6¹©û™6ȃÎ2\¼RíGDËWÛ ‚ÌI'éŒðoü»Àz½½‡Ãïx[Ʊ]HQ®tAh¶øçs¥û@NFâ{ÏÊr:à_¶‡üïþ Wû%|8Ô>#üGø1¬_hvеoÀÚµµôv+» \Íj¨Å¤òÊnqYÖÌxs›ÛÁÅÊ÷ÒVwüͨá3™ÅR•ÔvÕ]?¨ÞxÊUyõ˸å’Eg²Kq„]Ͻ›œð¢<L’Ì1òÚÿ¶/Æß~×?äø‡ið[Â^Ò­4ëk ú•pü{iv$i$­—bÛW%±µB€?Eà’ðCŸ‚?|¤ü\øŸûDxâŒ÷>*ðIðn¹aªiÂK2;W5‹_³»nY ’ÊD|¥Ð©UþÔ¿ðmwì-ñ;Á:´Ÿ³Çƒî¼âÃa9ѧÝÕÆ˜n™••®!šI˜ Ã(”Æüí`¡G‹‰âl¿‰^Ò2I+mÞÏkþ6=*Y6/Mû9/——Ÿè~xÿÁ3þÿÁ½_¼2š7í…£ÝxgÆPé¦+û_ê—6Ú%Û©B×V·–qÀ– @†iwÌI€ãõÛö5øWÿ„ø ¥I«~ÅZ·Âm6K Éq}¬xÅÖ÷WÐiLé#Iqq$ò\7æFÚ¹AƯÎ?àÕÚ’1,ÇãÏÃFŒHÞL密T•Šý—äÈÁ 1‘“Œ×ÏßµÏüöÂý”¼'mã?x+KñR^kBÖÂ×À–Wúµé”Å#‰Ùc´ýÒ@»‹ P3“\pyva7ɵþËOîèuGŒÃE)áÛkªkïêIN©i­XCªè÷°Ïk$a ¹ŽmÑÈ„pAèA9©¤yç¶anœªpOºd×äçüÍû4~ÖŸ²½ø_ãñ¤xOBñ¼×µ ëžÖW\’ãrAûL‚+hÀPꨳ3) ¨9tý`´ZxÈɺœŒ~ƾR½«Ö•;§g¿F{tæªB3KüÌíC]¸dÓu YÆÄ° PsIK#È6zŸRjwË®ãýç2CôË^ÝTjâ6“ïI$)ž?»Ž¼×ô«Ë¨iÚŒN-ã™¶1VJLã5Ÿ-ÄúÂI%©h•Áó-È>‡''êxüä¿Ñô»#çEdUÆå c'?'óïPÔ$îT\Ò·O3#ÆvšœÖq&…e ˜1FÄÈá·+’;žéŽüQÓ.ÒH8 º]ó|ÂëO;î1ƒÇ >`#=zíO±§ÚK47±3É'îÒôìØ£¨R«“Ϩ'žµF9µI59&"¡Š À’sÉ<(ï×$н9mØ„š–£ã’ᦊ-^=³¸K @• ÙH眃÷q_Éüûö@ñOÀßø*¯Æø+¯u¤\ø¤kZkik$ £o "QŒ~ìܘÎ3Æ¿®Í鉺û\¬û†þ3Žá†}9üpkðÏþFðV•áÛBñ¥·Œ­f¼ÖüMáâ&im"†æó;¶y{]œ¦–Ì\ªŒör ,èÎM&žÇa‹©ÃºýOÊÙóá]Ï4YŠ«Œ®êÏvR¹Ób˜eÝøa%b|±øW@cSÜ¡£Ëm*Q–æP©8lÎ6çÂXäC“î*§ü!×wnV+g¥IÈö®üZŽç?ð–4qÀö¬ž›f«R'Éà+¸P–ÓäûÄuª7~‘#ÉjʤpÌœõB¡†gëI$)0Û2‡ÆsQ, &´.ê©«žC7„K¦åŒêGZ©/„çNTõË­Ò`~P\¬»Ÿ Cœ*sé\óËâtC0—SûR²[¹2£‡W9™§ÛɬĥX¬£oÜ1ö÷úÓ¡Ôí瀘fþ ‡“^ÕNãÄ7v…dL–T a¡ˆ±~G#Óÿ¯_‡$Þçè|ÖÙ’M}«î/¹b @õÍH×÷÷•ŠÝ[#ç‘®6ãé°ߘ©­%¸¹‰n'·)»æXå ºÏùâœÑÇ\Û3÷2?)>^Å^]ÊZv‘ö;·ÔdÕ&‘Šì®_b.s÷KÏq»ßÊj“ÃrÂØy®6âG†eÂgÜÿJ."ÓšLÀn]Ç>RO¹žçŠ’¡–P×Dy˜¿LñøÓJ+Q7)+Ž‹l<:D¼0Kæ[›¸Ì/Ø©ÇsÏ^zš½5Ó}ŸlÐÇ(*GøÏ5Æ *_¢|ÀíHðqë{ÕgHLè†æAÑ]Ë|¸çŸ½ŸóÞ«FgË(ìsÞø1ð‹Á^9Ô>%xá_ƒôOë*ãZÖì<-oýò³«°–x‚¼›œn;ÉËz]R[Þ45ÒÛÈûqÁ\uÈÁÏçžj§Œ©H¥›~ÞòþR-é!¹”«•ûÛx#ØÓwcN]Énb»Þ°Û[À‘•Áä‚=ÇJŽÜÎPJÄ !q+H¬=r#ñ¨ˆÞÎ>Ü’®Õl0 zwëÿë©õ ²xáù8ü ¥²µÁ^÷.´ÐªÃ‘q!Æ™Ûï“‚~•-¥õåÕ¯˜l® u'jÊ¿'§·Zk‹©cÚ®ó¿–À¥*%ЋÊi‘Áê<¾>•6ŠCN]FéݙLè×(^]»Ê†Vÿh`œ®µKq6¥;²Š8œóÊ›†;Ž:~~†‡†E?+:ƒœ„Œž}AíUní/Ø#[ê¾F~ò<$–ür?­;&Ƈß\N“ [!ÉI[<ôãiôöÖ«Bùà+8Š)CîDº‰‰ÀïÇ~qÆj¹ÒõHãg‹R…‹FÝÈúóÏ4–—³<¨íîÌÍ ŒŒrãÀ>Ü~U|ªÄFL‡P‚ïRuÕ#ŽÚFQ‰%ûQP ‘œ½1ŽÝñŸYt·3Ȧ;«Y6±%`›r ãããøŸÿÕÁ`~Ú˪ø+UøCñ ´óN™¤k×67Lfò(ãߌ^E^yé]ôøË'›´¹£ê¿Éœ³áÌzøZ?óGÆBTè(2¨Æ>¼W§kðOø)φµ»x‹þ Åña/l¯žÚìizö…°+Õ㺷- Ñú:1±5¥ûþÝ‘y®øöø¿§Zت¼ÒÍðöú`Tã‘äG&zŠõéç™E[rÖßoÎÇŸ<§0ƒÖ“üÿ#Í ÂƒÈ4Ÿi-÷c?Z¡âßè_|Guà߈—ø{Z³(/4OÚIcynYC®ø'U‘2¬¬2£ ƒV´sD×ak­ T‚î%ûÏm*¸_©^ö®ÚX¼-ghM?F¿Ìäž½5yÁ¯TÉ Èzçò¦˜dq§ò«Ì^JÊ•‹óWMŽ~v]&ÖÂf‰PGØFËßב[ÙEÜCv²H¡‚4ÎÇý3Q’HåăÊ˶FçîúäUk¸ïuBb¶ÕgÃ($rÜq‚:ûWóÊ»[Ÿ­¤¯±Ï|BÕù4±Ê Ï—˜ÔŽp—·¾¬Q¯ød³)×mÈ‘¹_4~¼Š|šm•ÄFK–EaŒZL0£ÔçŸçŸJ=Ÿ} UZú•Ìkl×%Ý"ˆ3ÊûÏ N1ÉéÐW>þ#¶¹¹}¼ϖO>á€eèensÀëëVä¶¼’¶ónÀ‘q»{£¡í†8+ÃëclÖ×^mÎ÷Üâ%rF$„9ç''ßµTTbÍÉö0üsðóáŸÅŸ ·ƒ¾1øFñ”]&›Kñ‘ohÒ'ݓɘ:±S’ÜŒžk‡“þ ÿÿùñN™q¥_þÆŸ n×çŽÛáæ»ÞHò;zW²Kd²¾äÀ\dÄ ?‰¥E  FÛÜ”•&ßÙm1©ë©ñGÄø7ûþ ™ãíAõ7áž½à縜Í4ñ,©rĪÇ9š8בò U@PÅxßÇø6;öeñŽ‚þδ_Šü©£ךk %OÍ WÎÐGË(9 ãú€ÒˆcU{ä@s¸Ï9þ•Vâæê-ná.ƒ$z ×£O9Í餣^V^oõ9%—à&îéÇî5üˆ$|ÜC0à¼ãñ¦4òÃ1òtìŒ`¹ãòêÀYLdëšc›€ S¯ÎZ3Ò¼Dzíh0Ϩ¶ŒäwnsøJ‹såïx¶8\bœèÒ°!²§®Z‘@ˆŒä“Çjw w)Ëp‘&rvòyÆG¾*”»™Úf–1)î® mì>lUëˆgŠ:+©0G1‘•úŽ* m ƒ³¬i,„oRÇëZGEs)'{“ì +4ò,¯¸…uPpzòMIm¥ÚGÚ|éd ò²¤xSžÄÏ×ùSRÒ£—ÞBÒù@$}:Ôj^r0²ºˆ¨?2ÊÅ Ÿn?­j”ŒÕ·4šÚDdG¼å‹ì}°r*½ÚZZ=@*€¼—·Èooº1ùÕk³«Éiöe²vR3˜¤côÉ8'ðªmsw áŽòI–b2»† Ç¥¦û„¤­±§c©éÑBE½ÐŒÎçgÀÀëƒÇëR\6“¯Z{¸¦P] éØzÂX/õig·Ž_(üÎìäþ%±øŠ±eix$0ÜévP°ù¢HÄnOàØÏçTà–·&3oF„:^•{çyvê ÁåVg€Ódi—2$ñÜØ7|’`îŒÐc©úžÝ*ísR²•tÙôÅ1H þò'æÏb»†?åDšŽ¬ÀC†"<õ¸OÝžÝ~cÞ§%r/íþeØ~É{r#¸“4ƒ–PLž—Z, ·œµBÝÚ9›?—ò5å$Î~Ñg9&ÝÇ×¹üi·7]„ñÞ_1·yFÈÙ#’C#R qÓ$}häkaó7¹·+M§ðÙF¡ˆa,?J«u¯Ý•vµ·eçäÚ9o²¤ñ*³}ŠöþhFFß´D#  = |>$ÑÝÌo«ÄÆ9ï€:þ]hTÚWh9ÖÉØÔ_ԇä$…NTûô¨mÍÛn‚úÆð™¥,7ª²€{qÚšú!ÔZ4AòpÃŽàgõŸÛZeàû8Ô¤ÎìŒAÏãÍO-µJÁÌífËñé¶’²–þé‘¶ÿ.”²h–Ç1¤i#’À}2?•T¶‚ÑXF5[ÀÄdƒ8Î}«ðÙÉ ·sH; \*exõ–»åÓ$µÙóYÆ;eX˜°t©ìâò!"Y£`AÈ*AüÉþµgÊ•%gÊý8R3ô'Ž• Řœy÷HRÀ©Uü2#ñ¥ÌÞ—Ž—±/Ù™þxbUÈÉÝäúÔRYßý¥¦2 ‡ ßõÆj„öpÈè þÐBTÑÞ©9ô!Øæ¥]ÜMþ—.¤½æòø>Ÿ(çêhMubj]…º½¸7kâÌ'`+ú·ð«6ö²çϹƙÈÌ«†ÿÇAJòK{Yþ{{ã´H0Ï=³¸ýqŽj¥••åÓ4žÔT2ïi]š<œôÃ~ Š¥Ë$?y;—¯Í£ÃºçT¨ù.îGq“Ûð¨%Ñ<1®6i Áà§ ?‡zž++{rÅti†Iff¸rõ;ºwà …|g¡Û]ýY®[8eÛóžýO&œ\þÍÄâ›÷¬Kk éH8$Ú=9çóæÑ´ø¤R—h…HÛ‚=~‚¦“T³˜yðBèBŒ™-°¾ éY×šŽ­}!K v‚¯ÓŽ„ïÛÒ’uœQÖ¡VtE HR6Ð'qHÒ gp¹Írž„>fr[tÅ ±ð$L‘Ó½*¸b@®)kƒ¹I$cîÐKDo-°9$dð2?JŒGʬ‹íÔÍmŒ» vSІo³4›œ{(Î= äȦ‚o.[4Áü™ÏåÒ©®šÌÏM“x<þ&µÂ$5]óºd$Tr]|˜©= áV¥.„5mÊæ9üÕ‘DY–.Xa€1RÛÝXÌÊYb(¼þU"y¹m1Ë ;þUÝm͹”‘Ã3€·Ò‹§£ÍP“ Ô+ˆ£àq“éþE68$ûAk[£Và¸.>¿ãPÇ£j¶À5¼¶èAåUÈü1ÍY‹Ix[Îó sÕóù{U{±[WÐ#µÊÌmc.ÊAvŒ®sŠl6ö° “ì!ËZ7èjÌVÒ+—–]Þ„?JŒef.×n«“˜ˆ\gÓ;súÔs=ZÚ²µâ µò¢‚C¼ç*¡HöàU¬%ÜD¹Qó±N:~|~U®R=E˲Eòã¹ Ž]‹,ׯŒ Ø®Ð~•qŸ)2‹–Æ@»ÓY..,ÓäÎU‚’G ë“è)-5›y\[øvvgËfãý+mt‹H¢¤jÍÏÌÄ>§Nm*ÙgóM‚±#’\·èF*ÝXì§}ÎNû^Wc h²n+ƒ–Á‚·¡Ï–*Ö†ÒÜDL¾{WŸ*P}9ÿ=+¡“N´Øn?tÀ'ëÏ÷ÓÑÀs±n 8þT:Ðjɾ¬È:åì*©‡nÉÜCPÇ9¦Eâ)îbóÊKV p%„œýpóÿÓ¹ŽêÞ5Û´¯ÛtÜûê¡òõ+å_Æ žWË”ÀäÏšJP}ÓN×3´íb=réí`I˪ä\ÅF:ôÎ?1š–æaa2Çwª¡¸•IŠa†ŒœœqÞµÌmn„ÚÙ+¤ª—À'êÅgêz ~"ѲµÝÞu`DÖÓ; ‚?ypzjNJ÷Z"”=ß2­þ«â'JK‹ç2ÊA`ªÅîw•àwÅ[°¿Ô&mòMå—P^)UIŒÿw ߨ5SNð¤šFŸ‹k`mí-Ód"Éñ±ùUrrôéíV¢Ñ®£„DÚ½Ãa²¯,lçõÌþï†”ÛØ¹ÔAy‘X•('þG­G.®.2‘y€¨ù–XJ–öàU›;)!Aö‰C±\3üù«AâŒìqè1Ö²¼SîkiµØæ¯å–îÓ¤še§v÷F r[9ÿ ¯—¤Èâ<=$É( $™i+o’0[»c“V(¡6„â™ [F˜XßÓ'—ïN¢Æ’JÈo—ïG•ÎKS¨ aEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ü$¦–›"–©Q÷Œâ¾€óÀ"Ž‚–zR;ÀNhZ«€ ƒÐÒÒ**ýÑKE®EP€F(¢›¸ö\þ4y…˜ ìo”u«0\@'§Z¬¤³mõ©–ÖRÀŒþ¬9î)5Ô¾ 7;ZK{‡«Ààgïâ™ 2& «3†<Iµ×·«0Ò#—iÏ–ý°pißJa)ï\œ`EH„f´µ¥c2k9]NÑ œz/Z½†@í ê VYã†.?QSAp®2[¯Jé’µÌObÍ£˜gßžµ±¥vÑyk(QŒ5ˆiÎ*Õ¥Ò!Ä„`×uœº\æ©õ5måºxÌF`Rï’Mhé°Æn$’¸Ô¬[ûù˜œnäóŒõëŠÄ]FÕFÃ:“Ô*¹g«CCä»`å±ÜzWm:n͜Ӄèk[i°‹’Ó®×0‚àv9äŒvô¨ï­`‰–3 œƒÉëžà~Ÿ'öñº3ùxYmÄ{Džž§zÑiou|Ûo$‰lâ!È€‘ŸÿUt§ «$ai'ÌÙSTžÞ(‘K¤…˜‰$zÕb¸‰²ÖÅÿð?Zí,ì¼=cm²¤C.i˜RxcÓ ŸáCRÖd·¸ûF›¥Z4˜*&¿ 2ª@Úœ çžz`uÏ ­•Ûû‡N»–‘G4tÝNâ o"ˆ›{õ×â4>…ޝåY·k/žíöͰ«ìYñP:‘Á­­B;ýBW›YÖ$\‡–2BG¸ dF¸QÀôÍQ¸ŽßnÓǦzŠóêC]´óÜ섵2æD'|Ìî[h‡ ߌç­0*ÄŸ(Ï~jo2(÷,j\ã˜qø ŽEÊàÕÅ+&t&í© ¸91Ú®ÛÜÄ"ò®T0Îâår܃Ó5LF¤I'¾Z‘‚çýÐN7Ÿ¥(Ë•ŽQR8·$c ¤YA$W¿Ùü!ðì $6›Ž2 ²0þU§€<# 7A°ãm³Œ~|V‘áœ[Þi|Œåžác´[>ly!ƒv©bŽiÛe¼ #Šƒ$×Ñ—ZƒãRm´{ wd…¶Lcòâ¸Oˆ–Öíšcˆù¢ñÛ8¬ñ°ÔÜ¥Q?—üJ¼q²¦×Ìó m®aÿY_©¢˜¬8 7™“€T?\U­R6Y ¨ÀÏ"ªŒ3´¯<’µàJ<³å=h¸µpù]ÂÈÁ@êsšž(4eL>«>ìrØ?ÃùVž…ª ¸…v¦Ø¶¸Û·¿ãT5-SÒd1ßÙH˜8Üc ¡ïøqZJŒã+]1Fqn×b<;í îÙq÷a‰Tþe¿¥Xš_Ï‘mªÇåŒùY« ¬3·ÿ©Öá#\P¹öI}Àí{ܵowáÈgÒ®Ü“Ë ÁÿÄZÖÓcð¦¯+ŧ5êJ±s/^8àVM¾ˆX“$ŠƒË,7‡¿øT1Iu¤Ü‹ËFÃ/Cí[BR¤×`¸@aw_™yÏŸJKé­N¡ö5¿{×”™#†Ý\ œvóÚ±e‰" „VÉ$r}ªékH·,ð’;v “ŽFxÈÿèU%'gdeÉ- òÚ b_&(ã,ÿ>ðÅý=01Îrrxôæ¥þ‡3È|¢Í¹FÆ-ïÀ¯ä_ZÚ¹µ’ÙšG%!bòHIÇËÀ==MLº÷»šâ5èbP÷Îï—°ö‘µµ­É¯C˜OH‰y ®ABwsëUÄ.[É0ÊA~¡ã>õÚ6ƒi&(g¾2qúÔCGˆ|¢€ZîÑËáãU\ãpõ•yáëˆíÚQj7 ýà~eN¸¬'š4†*Øè-|K-¤›’røcšÑºñÆœö¿½˜*äÖužá—·k±¨2À’Ûy †8ÂŽOÿ¯§5­¥ø/Áú¬†¿TmÀ£LsŸË§â+Û„±Ò-}ç•5Ak$þã‘Ö|O$²;@ †Ï_©ÿëW/q#\ÊÎì['æ,rs^âƒm:¼ºY’EÛ•kt,§Ø Ÿ§­r—Ã?é·k Óä:åv!É9Æ0{×—‹Ãc9µWô;ðÕð®:;ÄÚz†DIÏlUi|¨2G@8^ÕèšWÂÿ}¡#‘–ï21Úº¨>xÈižDö¶Š1†EbNO©é×ë:y7·W”Z~…O4’’3À¥Óom…7¨Ï*à×Kðîcos%§ˆ¢’{k’ùÎ\/üÿ>ÕÒx§ÀÚ®‹+\ÞiÎa¯ž¨Jdg¿nꆋc“ª¢¹~]£õ®jX añ û®Œèž25ðú=ûZçÃoÄc¸ÒÀE$îO½ŸqéXw^Ó<Ö†¸)Áùqƒé]äƒM°M=dg“f2[8¹ë›˜íX´“ŲÙ=ýk·OŸ*G5 Ö–òl†_4»e¶‘@FOÏøÏói"9e°Øö®®ÓÅ–öªGž¸a‚­Ò±µ4jW¯èja¦£§™  §ÔT ±X&pz©¬e©¯2–Å‹y¯Ö¬#¸<µVeŒ;涃ºW2š³p¯ Â碖ʉ26AàæŸ¡äö©k[$îGKÁ,“O¾yXúÅ[7-°2{Ör6ûÐc c þy¬ûvk{`Ò†`£°É¨›ZFl-¬qƒŠñãQÁ|Lõ¥'±Ði'Õ¬— !EB‹lÌLdÅrÿ*ý‡Œõ-"ä_ÛhÖ#ÊB±†Mˆ1ÇÊz3Û­sVÒv»‚>`+jÕbkbc‰‰\m²OµuÑ©Që±ÍRœ/ï#¹·øû ^HcÕ4+«C€C—W¸ÏÝäwÇ¿ õ_ ~Û‹Á’xÄžðGˆ ™ µ­þ£át‹R·£+¨Q0å„Ò;Ø–,óUÍ¥¬‘°hÂx;×5N9®-˜[|¢-Û³j  Ç9õô5µLUyFÕm/Áþ9cÿáÝ^gÓ¿®þjöš\¿ uM`Z_é(ÚÆ•¯¤o6Ÿ|ƒÆ“ U¸ŒíIÂ#àH¯ñ×Ã?Ã{×Eñ—“7•“iÄØåBŒ0G<õ5Íx„¡³mzãʵcióŽ~ëÉútäàrML—Ú΢¿g¸Õ\@9aå¡'$n+¸d“žyÍMLM:ôU7ÚÙ·ªü2¨á*áªs)éÛúG­j^8´¾L–g‘¥NÓ™pŸ}Šõ:€°˜ Î÷IRG~+ÓÅÅ‹§Ù¦ò¤P8 ë‚pO¯õéT'½½–M¢þS|B»¶íÁ@žz{t¯¶\äÛ•Wf{tñ‘в‚º<¾c¨ˆŒÌ²ˆ8ÍBZéÈÈ#>õë(/ krÒÈUIRÒäGœp=*ö“a Cp«uáë+•Ü»’uêAÏÞ9#Ó¸ö5„rIͯÞó8A|ž/æ±ûˆsìjkyb n \Wºjÿ <âÍs¦xbxm…ÕäÚ8’GÎî½k‘Ñ5y¬' fÊg$zèg¿¶òVe›pcò² ƒþ¾µBÿy•zu­ÐÉÕg¼±Ô å*¹ÐZµ ömhÍoµÙ¹-œ•ö¦j°¥ô^ds|Ùäm8ë*1=…ʱà:\Ò”¨ÔktÍ¢£RŸfh]ê_bp9È=¨[‰~`§éÞ£¸ºž(ÏÎYåXäb¨ÚÛ™\²¸P:“RêÔŒì™Jœ$®ÑÕØ\Çq˜Û$È©·É5…qìñëSɩ̠cq»î–7ã]±¬¹u9¥EßÝ5<ä'8·—šÊI®¤å!cÿ§.¡v‡È‘Ø,Ýò«XîC§# °Žê3ºc…+¸sÍiÆñȆynufâ¹»k—¸MÍ8r8È'­K‘,°—* *º–}qÚ»i×I$•ÎYÑm롹Ð2†ÜýàZѶ™c¹IC3cœÆcùöþ]F˜·‚æòÂBI"óéß"´ cz šßÃndó pïŒÿÜ?å]”ª>Ÿ×Þa:jæÛß[Ý>ù®˜·&I•ÏLpsøò{Pׂ$aÔȯÜ9ÀätôÏçYvדN±@׿Ó½œ ¹Ç<²1 psŽFqYš±ººº1éÞ#Ô¾Ì]·5²6@#î€BxíÀÎqë³ÅJ+Es5†Œ¤®ìuz–“§y¿ÚwI)U’i i[ådòÜð3ƒW¬/´;Õ[›Ópª6¦õ]§œàí99îk’K#lÞȪAÙstÁïN#ÓÛjd—Ó[ÄÒ¼R‡$Èò;»àõÏ*A?\äŒÖk0œ^±V-àá-¥©Ò[hví»Å¸…;P÷?Q¼Ó¸gDÇeŒú ëuÈtŸi‰{=á• åó78ÿ¯\]߉5-FîU±±ÂD2à •Ææ9ÇRãÞµÄ*RƒÜʃ«WÞ[ ð=ºíÚyö«Ú-Õͳ’ë•*xÎ gÚk°Ë4p2yŒäUêIí[ÖZ-ÍŧÚŒ·!qSF1”¯ORªK•ZzØowvÇÌÙ#*µ¾–÷÷F6(Ý€çÎO »%¼±¬2GZ³¤í®Äî½ðqééZ¨sÊÒ3æåâcÜè³Y³Â²ãåË õÝ&Úæöb"pcL‰Iû¼û~Û\Yi×E§†ØH¼ìzúu¬K›9ìâöÖqG<€ ò…õ'¥\°ªºØˆb\ÕºœÖ¦ëa4±ÍFbà,q·y9ý*µ•øºØû˜MÂ2œþ*ÖÕ4¬ ‚P2¸ ŒAùTiš¯ü¶M‘©ÆO÷ºWéÕö–èvBpäóÊÂÃtN¨r¾PxïŒÿ>´è÷^©YSå'§­\[.-Þo1^8’]§vHSÇû}>â@[:–ä©_»ìkeJJÈÊS‹W-øbæk=B ˆ¥\4eàY¸èB·[ÇZpƒW¸³óÍÑv4‹ ‡PØ8g ÐtèpAkÃ~ÔQ¨Ël|˜>v-€¼z·ë[~:ñþ®]ÚAyekåéÖËn—6E½¢Ü¢—ÿ’ˆes»™dF ¹'ºeAJ’Œ¬ŽuW–¥â¯þgÏÞ5ÐÓH•LV,…ðÌã„ sŒŒ~¹ü+7O½dÄE ß/Í]_Å¿A«O<–æ5F;a„ƒc<ñ’}I®_I·V¤Û€1€y_|WÅb)Æ8ùF›ÐúŠ”ð‰Íji²ÜAÈÈq“üêµå²] ÝcçqÅl o:À@·‘ÆöF¿­U‚#y±ÜBBuÉ?AÔ×Dé95(Nɳ3dÖñ•Gr§ø‘óǦ U+$Q "–lò¿/ÿ^ºa¢Ñ渂2¹Èh¡+ë×úR[IaŒ¶—{p¤þíTlQÏ^§=é<#i]Ø¥ˆKesÇQ·b åp žµ¨—Öè©2+.>UxÃâ¬ZZÚM¬Iq©XÊ¡R4ÚCœç‘ž*ÝÖ•¦d½ðìèÇîùa£\zrÝGÓ½k 3„nšùÜÊu!ÏÔÊš}6ÆQ,PÂ7üß"•$“Ó¯ôïS¤zY+yq"§æÃÝO·AÍE%†—µ² ³š[…l/¦ëïI&•¦²«Ín7/$©Î}¨Qšè¿¯>[-Yau)ˆûU¢Æ¹*†b:’è87›9çñ vªÖ–>Èž6…Ôæ0ŒAýz«{}§E(C¹Zpæî=ÿ·Z½4¥xÛï¥NnÖg]‹£’òÊÙ Tê,#bzà“’ßÓÚ­iZ½¬¶ÂóS¿¿yæ ÑGFÏ÷$óøÊóû­OM¹—r˘~C¥j‘[)ŒÞ^Le%Ø—5k2jJú¯À©&´g}}¯èFso"Ýb6,χ“ŽÛ†k3ÏÓ%‚_]D¡Ø¬o)lç¿ÙúW&Þ$m«öK‰‘¸ jÊ:™o§Ök¦#nÀ]ëÇåD³UípX)S[ÍÖ•bÂí!#1ÚÃÍ?(Ç^=ý»ÔlH¢1Ë…• ²®A‚ s—:å¤rˆ£±ó6ŸœÈpI¦\k‰†Õ“Õƒ–ãÛšÂXÚlÖ8YèXÖ¥ñÎx‡M¾·K€Ím%ä‚]ŽÑ¹]Ü:²œt*AäT—_hÙdž&fÏ?¾ Ÿ§W_âÿøãŶPê_¹4‚ xrFO8ZQÍó8JêVù/ò²ü•œoóæz½ÿí3a{²]ý•°Õ•ƒ÷sû¬8ùº÷ÎkUøÚ5%EáÉ#ñ7ŠDh{qÉéÉæ¸5By$œúâžQ9UëšsÎ3:›Ïð_äL2ì ?†‹ÿ2{Ëéõ–[·^ƒ9 {žõ§£ø›NÒáÚúarɇÜÊA?—ù÷¬M¸ÀlÜ R€`*ñí\p«ZæŽçT©ÂQ³ØÝŸÄÖ·cIÉÊÅ þ­K§ø§DÒæE³0e‰Wô s¹‹nB(ÿ€õ£ËV„Ž>ZÑbñ \×Ô‡B‹Vhìï>(éú—•iy§mµWñÅ ÄcóÆIÈ$ö¨5ˆ¶7ry–Ææ%# ŠŠ3èÿ=1ß’TÚ3Óµ6NKµþÐÆ;ÞD,&m¢›Ævò奞õÛfˆÁõÎ}{`UYüGg2¨ŽØ‚,å™~O$JÈTSÿ-áž(V!rŒOÒ²úÝg»*4)Gdj\ë‰$‚[}ÈûDƒ'׫Ük7—;]²°à•d~T!ó¡˜v­)W¨úB ìK5ÜÙe‘Ÿvw1ÏëMiÔ,“–ãsgƸüx§4g•“Õ”ÒAãæã·N´ìAL” žãô§GŒpi  ¡p0@ ƒCއ4´ÅvwéBÑ qC²r9ñš6íêçÛ4êl€“Ú€[«©ÆÙ'v€Y‰ÇçP²–êçñ©¼ ¸Âõ§SÚ§–åó* (=:‘Nf1ÓªPêsAE?ýjiX9ÈDlÀ†nܓք‰Bt>äš•#sÔÐJ¯,4¹bƒžDAò?Ù¡¹)è;Ô m¤d'¨ÔÒH9˜ÀAnûPCt$œtÍIå"ýâhX‚œî¦ȉ†F=OÒ” c¹Á©dçwëÍ/”=hÐ9†2HôÁ4ÜÎHÇJ™ANi6“üCÛŠI$.fFʨ1‚=iÂ0ÃŽ=êBê)¾PÎCΘ›¸Â¼òØ=¹¥«œœŸ\Ô„Á¢™‘³Å(8ãפ¢ì`ˆü(‰rKs“ÞEAvQH ÉC¢”:œÒÑ@Q@#.îô´PEŠF'ë@ EƒÈ¢€ L7÷¿JZ( €zŠ( îìih   Z( Š( Š( Š( Š( Š( Š)é@ FsE0³·>¼Ðè¨Â¾0Çõ¥%ÏÝlþú)7Jp -SIÏ^8õ GcÏZL€OÊy¤wéOrùqBØ}Kßðkâ;=ÃÔH¿ÔÐ|=­“`qŽx¿ã]¿ØŠ‚H?•G$[JãýêöÞYM-Ùç}v]Ž"M#UŒ|Ö~Yªò !s±²°ê`Ší®$㎜V}ÄQÜ>f…_7 ×5l cð½McŠ¿ÄŽfg½tK ißyì#J±LªÚ!ëŸçXýJ¥·Eýf™ÏSâ´»™G ô÷®€ivÀa-cöÏ?ÌPÖJˆrì)Ç$õbúÌz# t»†\¾ŽÙÿ eÍ”ÐÊDQ;/sÅo=¸NÙõ¨š2£¡üêž6°Õ{³$¤ãÉlúb••ÔàÆß÷Ímfêµ·ŽJÍá™^Õv2B¶ì:0çÛC"£2Ž:äV°‚BpõÍL‰Î^1øŒÒXiÛG©Ž¡‡Þ ÒÖ¼úe› ­>Ê1QI§Yíù#lÿ¿RðÕÕX36мtx›…Vù¦\i'̓§F©t*$58¾¥J)ÍëÉ…¿#M!‡ ¤{Yr²Â’: Ðr:·éA'QfÒnɦ¶ÓÔÆ”£‘ùP ó“À=h`Uó[> øw㟈ž%Ó<#௠_jšž±–™ggnÒIs<Œª‘ –bÌ ê+ôçáGü%ÿ$øƒàË/ø£ÆþðåõªÍý®jFx *‘žT Áb¤ ¨(ß1&g(E.fR±ùZxVöȤïõ¯ÒëŸø4÷þ Îÿµ†Zw„<%.§EæYxîo*izˆ!HXÐ+]+üÌ0ð(6çKz†›ÿjþßW‡S½ý¡>Çxè Å„77ò›'pÞ-€lž9=¨u©%«âM ääç  Ç8ëí_´¯ÿX~×ais¦~Ø çšR äX_Ä‘¯ý3q™?Jô Á’š‹­ÏŽ¿à¡vðHÉ¿RµÒ~yª¤6Å#ß&A;™3÷N3QõšdZO±ø:Žz×êŸü[þÅÿþÿ‚“~ÍÓ|MñÅ߉þñ>ªÃ¥kö'ZÒ"µº»’5If¯lòùD6“ÊÀÆkõ‹öOÿƒ`à™³W…$Óºžà@UŸNŠÒB¡y÷¯D½Ñ¤ BÁÀëÅbj,]Ô«g¨ãçUÀr­ÝK¤ýã;9x>´á`ý@ð®„øoËÉ@ØsLm&SÏ–Ê=q\ßT’ÜßëèÌO±°$ÔrY02çß´úSäíÎ}*+2XðŠ„»sj‰PilTj«î`Ëjz†?CL[)ð™­µÑ&uÜcn:T©§ý™2ñlpAõ¬V½Z/ÛÆÖFitÃæ£EŒ¬Gž™­9¬.dró·áž)ÓÞQ(ûb¥Ð}ŠU4Õ™Él$ûÜô–[&Fõµ©o£\®õ¥Ô-ŠEå/.\tª½ƒQ»Bö‹šÈÅ’Ùv# ާwZc€ü«»<“[1hòʦAp£ŸQS[øbå‘Õà;·m—“ÏóëÅGÕg-‘N¼ìçL2·ÚiÂFÆFA>µÛi¿õ=A¢´å€V<{qÍx~)|OcàMM›Y×õB+ ;EÒái.'¹‘Äiœ… É$Œ‘US©Cž«å^b†'ÚK’¿#•Óü-=ão{rrIV/‹$´þÐ[[P¡aY—fÏ8 œ×í§ü‹þ ‹ñÇÇŸêÿ?ਈ¼¦^Åð„´=rmX‚¤–õDrˆ—iEXœ¬ «ïEâ¾´ÓàÑÏø% ž¥ Ò^üRc“sCsâëvà h1Ï>õábs#‹§I7æz4hÔ„¹ª?‘ü­½ÌŠ!bö §ÐW¸|&ÿ‚iþÞß´„×þþÈßõ;‹Xî,.í¼zÑÞÇ Ý@ÂÝwpsõçùU‹x¢1ùS[ù`­p¤gÓ““ëXÏROü‹²µŽSÀß<ð×Á¶~ ø{àÝ+FÒí u†ÇHÑâ´¶X‚á"ŒMÝJÉÍlx“HÔu:)´ èm/â*è×L2á1É´†ª²†íݯ§QÕßì®ècÎåbTž=yçðÅKk¥[É'Ÿsl ©ù.;wú×<åîê‡,‡Íi=ÄAHq¼Å)÷ö´–Ö“¤Š’I Ÿ¼u# ßB3ÿë«›¥o—*çLšycŒ´H¬@àg5Š} ´æ¸ÒÑÛíŽ Œ€ONzóéI!ž&FwöçúTV·WM)`ñ· yߊ¬Ã[ŸSE[x£´‹™@K±ÀÀ\$“íŒsZÌIÅ¡Âf1DÐZ»—>@\ÿŸÎ¥Ënˆ¥Ù ŽYäÜÇ¡'òùâŠ) Ã?ÌT–Žýz*Ð]E‹‹ÆP¤ýÆÆãOupëcù%†x÷¨ßF´—;ÇOAVäbÙùºúTk`êóQ|«¢´_ãmOOû+é%SWë/ó?®?àÓOxÇÃ}®£ÿƒÂ÷oê6>øuö˜–påK–Ô ’XÁ$²2r P@éoØþ ¢ÿ‚zþÆü7ûAÁqâÏø·Â§ÎÑ.¼KyØ­îƒe.–ÚÐ4‰Îß1™A;¶îUaú Óê 0XZ9ãæy9>ý)Pë>hãÀ?êãÇ?˜¯/Æc¥ÍZw×C®††-%eèSk#ª ‡%¹ùxÇ©'Ï5-¶›wêÁÐàÌA׿ô«26ªS)n¹#¬’€ ÷ÂÒâ[Í{X° áRr}þ^~µÆæìl¢›Ð”A:FA¸~_¼Šr>´¨dˆ ~ÖeÎ3ŽAØïL›íAA{4;±€³ÿ²ÓàžX¢ â8lcèfîÕÍ™ ö”·–î†I¿Þ\„þ•šq¤_f”oÜä3îõÉô‘Z<Äyªê1Ê“þоbó‹€|£Œþ}(æ—F 0nö"†ÊÉŠ³[í’…V@ÛAëƒøU›i 1PÙPqòó®:T>|¥ÃFe88Ç=Æúô…µS"2r~aAÁ4šovR´zDð>@ÆÜä´d>´Ùš9ÁDŒ° ä†:Õv¹ŸË2^2 ^vÂûÇâH¨¢ÔìÂn´eÙŸšMù—~Ô(¶K©SZjMÌÿÁ±_²’mo¼MñÃÇúÐŽ×eÜqÍif²È@˨îPd—-÷ºñÏaá¯ø73þ ïá}qoõ ø·ÄÖFŽm/XñdÉŒHÏì²)\tó0rr }ð<Ë’âklg—Ã09ì@§[XÇ;Y)Êíã Ïë^ÔóÜÞjδ¾û~V<¨åy|_»M^ÿÁ¿à–WW‰©YþÎ÷–â 9 KãM\E+»db÷nÛ×i‚óz¹ ·ÏÓþ ªÿ‚w 3øâ0¹w‰­öç¿"ןӭ~Š.Š!‹OçžNõP}Hçôª¤ö’*u$ñÆ[•ô?€<ã3‹÷kË賓²ü•5÷ŸV?ðl¿üµ”=ψþ$1ÇÍ@1×Ö×§ò§¯üAÿáŽFïÄ òøšÜ†ô$‹^ÿ¥~ƒ< Û4ØP ŽG#¶qýi±Xφólü­£j2ãzOÊ´YælÕy}äfàíofÎíþ ˆýˆìµÛ½GSø³ñêÂbßfÓbÔ,£0 Œ~ñm·6=øæ¾°ð7üöømáø|-áŸÙ3áì–ñB‰+j^¶¼–`ˆ©¹äÈ,NIää’O±½µÄy àô0~ ŽjD€\G–— Î~kVg˜bì«Um/2¨`p¸}iÁ+”ô½NÒ4›]A²·±²´…!³³³‰(bPQ ª «©¦ÈϹ®d@8sÀ‡µA(¹‰X¥²²ã$‰;öÉíL·ž[ö@ñxá†3ùÕkNÅNÉÌe¹å_8ü$U¹t©Ü7”ÐŽÊÆ3‘ïÔUy-o~Щ6˜†NY¿-¼~t'ä¸Ít#òÅÊ'Ù&#?Ýp28õç5fÞ«t ‡|ÿ*´{é 3(܄ߴ÷ôÇêM-¶‹$x” ¼ñºçw ÐåhÇÉkbÚjñ1d‚0ì½@ni‡P»#lv  õŒ}*!£I«å«„ÁÎÛ‡''ëSGo¨@Þ\L¥}dùèj}ÔŠJ£ò žëT ÖÀ—ÇÜ(÷#óSN}Jy™u+‹y ·š'òþ¦µÚIâ,òÉ á\àŸÆ‘¥œÆ?ÐNXu8ú÷¡O¥ƒ‘ïrº£¤bHLÛ³ÎÕå±I%¬Ò¹ß.àÁ ‡ öëœU‹yH¡¢fv^YTíÈ–Ž¦;X°s׃ø`sB“æ°ìš¹N[§žA<ò²…!!-€}É?HÖmq¢K„ r~˜ö½´¬vÜŽFÏÜqVíKy…”ŸâŸÎ‰IÜqŒZ±Bæ¥`“Kæ|ÙÆÎ±3øSfÒì¤*QbE»1ŸÂ´ˆ‡aÌ`(ÀNÛŠÍbáAù]T£ò¡M‰Á\ŽÖÑ-SÉ“ËØ§#gõ$Ím,Â/ºr«»${âŸ1(-±Á'æ,:Ô†8¤å°Ãß­Km»•­ˆMº,x•Q±þÏOóšbÃk³݈ÆGîÈÇçV#»€ tÀ¦4“oe0AóŸð¤‡k™i¶‚Rùƒå¾×?JjˆòíµWV*‡q·>ª¬WCe½þž–á±–7dôî„óéš›:t¯,o&Yâ6Þ{ñ]{Hãz“-¶¤]…êÄÇœŸÃ~U:½ìNT\ààŽ¹W¸Ö4ÈJÉÜÈÀ±Â®@ü†ÓøŸëQÚI.·1wO&6åZe Íÿp=zRï»@•ŸºX›ûH²ùvLÌ[׈"š‚³2Ää¨>b“}±KiÂG"Wå'=N}7³æÃ ì–|.8.sǵKhµÌ· ŠdºP²Y²ãpM¹_qœÊ£»Ií$ÂÞ6Œ¯ß2mbÞœãòïíZq@˜- ‘Ôcš{[–q¸·ËïÅf¦“4Q“Z™BÚí“tlb2U€ŸLàãò¥’ÇZeo™F~êùŒqü«N[4”Ê ’r* ô»·!£½d\üÁwÿãÜSö±ºvFoögˆ$Ý"ßË“ò¢.OדVìôi¢ˆÀÒ¨@K*2™'©8ïïSÉ òÆ©mpCŽ»ù©%¼[l$ŠîÇ®Ä-ü¨”ÛZb¯­ÊwZ-Ë2Ë ì±•?2‰Îòç0±Ô–E“û@1!öýJža‘“3™ ‡úŠI-;ÃwÎÛÖ—3ê>UÐ)K™\–ãŒcõ¨®­ïÛi³‘0qFäý3ž)Ïj±üèNvà ˆÏãÉ©­„ÅÚUú)ÏëRÛŽ£ŠRÐ}º:E™$ÉõÅ9FÙ6™8àw¡b'ËPO^3CBU\¨ÿf§SN[ ±GsúÒätôëQMnFéXßqô"žm ‘Ó‚J{Žb¨A'Õ÷ñ@á^eÉ裃R˜ÆîW8èHéMhÀ…Ϲ4ÕºŠ\ÖÐ…n÷ÄçÓnqN)œ1b1ÏÌE$Vòf/‚z…|ãô¤Fe+æƒ÷‰çô¦ìBS¶¢²™cŸ—ž¿­Ú';¦žÄ¯JrDBˆÞBÃ9äS˜Låã¯\~=F£ ÆÓ­¤‹¸ç<9§UÂHÞÛú~f„YY¹*p2p1úæ•æ\eP³c ãM¶Á(Ûb6°¶vWul¨Ç.GLàÑ ­¬H"†5D`ô©!–Yb£1¶2V@2?,Ê¡šðÙýõ'à…æ@âš»’Dæ„|ƒŽ½ê¦§—°µ¨Œ‚9XÇ8©F¤*Á¿Ýç4Ù%y# ae¡eéDZªŽŽýAÙèŽníÁ \½“Î c “ϱ$¨ãÞ¦ÒÒöæ#Æ…v‰3¦XUJãùßÔd>fSÛ#á²…G¯N«ka*K¹‘ÿÒy!%i—`”ƒ×§>¿­O“ly`9a®U Ác. Ý„œå"_ê L°Ìåàr£úRœñ,Œ÷GøÓfò€G ܆ýz”î-‡ºÝ¸Àûÿ:a“SŽ@ÉdçæÉœ`¤•Ü~Ÿâj|ÊÛL-À!z~¦š¿@çK©ÙpqïIåŽzœðMA:ê1Ú´™å ûµ@'ñ4–÷Œqƒ¨E’¹Ädœwë@î–å‰"Cò•íÉ —K„³OÌ·ªªçõ©}ʃ™ÉÀo,ƒŸÄT¡8flçÞëOX°÷dö&È:ùR˜Tóß×ú)d@öèÇ++/®øÓ–Ø*íó úRÑ@¹QµPÛ·“õŠ_³Œ¼ä÷À©( |¨ˆC Ï­8B `~´ú(TˆÅ²ÇŸzoÙ¢É;Ï=ªj(TFÖÈý•8Fzu‘´Œdç­5¬Pý×#ðÏó©è§{ –$ g;™‹f”YàäLß55]‡$Q A o'>´}ŠÜDk‘ÐíéSQKQòǰß/ßô¤ò )Å>ŠdB¶ð®JœgÐPÖÌÀ€ì2zƒSQA<¨-£EÚff÷jl–1Ƀö‰Žá¿¥Y¢ØrĪ4µ ®\‘Ðà…NÄ­#Q€Ä?JµEaÉ»éÑ:•ióÒ£qóV%â(rþZÿt>€w¬©A¨ƒÀÎk^ñ]¢!©îTÖ\°KÄy>ä×ÜÕZÜð)Ë›rŠh§Þ®£'–|Ö®µ©N‹g$Q”É;¤S¸û“Uœ¬¤­YÓ¡–i Ž»VT”ã+EšNJQ»F]ÄG¦Ïfð\\8;¿¥'ØÒÜÜ=Ì€#Ê-“õÅ\ ¼¸]»¹9­*ÙÅæ’" “’í\®’zÛætsÛB–¡cQ™bÇœœÓáFfðoAåPCk5Ä—[3$|ÿtwJ|±8–»Iæ…¢Z®ÝË2¬íÞB®yÍZ–þÙ"Þ,0=GAY«pÄ<’Ûlþ쑵= ìBAûØ==ëXT²ÐÎTÓkR-jòFp­…vù²¼ V{> $~5bXÝŸí YIáç5 I6‚cá‡ÊO|zWG)»³¢6JÈfâã%±IŒz“Òå–PQs‚½ ¿xA«"6«mQÛ­82“€j5 1îiSø\Ò…¨Ú°ãƒ÷[¢ŸoMƒ‘·v“Ó'úQgd÷’ 8ÉÞí„g&´4­9$·2ÊdŽCŠ:œ‚@ÇÔbµ¥MÎH–ÔQ{Ã6 mt-¤EžlÒ0áU}ëÃ>é>-ÔIJ%¹iÉ“·Ý8ëŸn¿že›Bñ®‹yµ%¸¸RΊÓ€#ãМŸL{×I«Þi—vúÄ}›N*óoÁª7Æ1“Ó# w×·†¥MG›ªÑzÿÀGZSr·}ýù…õÐÕ,íü1$¾1Ë|m#Û±Xn“ñ€­œÜÖ–›¨ -FžL, ÎXªñŒœóޏQør·7ÒêúŒúÝÁ’1u;y ª!.IÎ9 œ ÅH5Ÿ*Õ”íŒàëÇò®Ú8”¦ê=­eè¿«œ•hûŠ Õúµ¥Ä:‹Ÿ±YÉq8lãL/?3ØãV5K›-4Eo=Û<÷{^8£Kã {àƒ§nk‰Ó|kªø}þ×áýFkYŒEVhŸkᔃÏПγ¡Ôo$É5ì²ÊÌI’VË1'9'¹®—˜­Z÷9ãƒjí½N½ñWü#—gµµë¾g•p$+N8éŒc>‹ñO¼g›^Ù²FÅ£„3I Ç1ÏNúõåÍ©Þuš]à ’qS-ô‹ƒ ¤ãstÍiÒ§6›Ë/¦Ö»÷=KÅ>(Òí¢´M&ñYîKåIç’zc#sŸÆªi>$„±K›¤Ý,qŸjóëMFŸ|Ó»©c×Þ¬ÝêöjäZ\ïP~ñR¹úÍmý äùݽ þ£Ç•ÀnëÓ¶0ÛF?€ý1W~Ç›‚Œ„dô5v+ÝÂO ÷¯8w'©éJªJæD:jÜÈ$Ͼ+RÖÝmcuŽÒ)F3rÁ1q’9ÀÈï×_Óü{qe>®!ÛÂà3±bÌN8Tã$Ž¿5ÞÁà–âÙYd· Æ<°Qû -“Ü[Ƈ"ÕY™ºª[jd[ÚÜÏwº·”Dù>b®:úç—ã]4óø‹Âþ—’é6¢æ3$r,>]Ç#h côäGk/Hñ:øjÒXá¶îšUWYmðQËd°Ú€ôÎ3Ï1XZõí.§} ŠG—€$·™öã1Yʤ)CÜ»“ü P•I{ÚE}쳤êS[Ï#Í8"u"YeŒ;1=I'¹çæëïNÖ¤÷ˆû…‡Ë´r²Úf3,­k;˜+œÏ\úêÔrDêÒÏ ’S÷jîúXBjQå4”lÓ ºM*7fkIÙÊí=OrN?JÏß§¬2N‘ÊAb£q\¨ÎGÖµWÍŠDž9W'æMÈÿëÔ·zˆõøÔcÈ€~ö`½qÏⱕ)Í7¯¡¬j(¤¥ùœÌ¶³A{¸/Êê7t§Üޱ9¿jÕ½Òg–a5ÌFŸ)ÉÉnjӓJˆ)–áË’ÁT÷˜÷ãõ5̰óM¤¬½´t1¬­¶BgšQÜ!n ûT豸 nãŒV…æmÅn™H%÷çN9ëúT6ÖÂ(þÐ~èÈP ÈÏÇj¥EÃA:ŠZ³6úßíK‚@Ú>P£’sÜÓæÓ¢@nHdžKi’DY¶«1“ëÞƒ@Î’ÂÜ}Ò×Þ³öi¶ì_;²³3¥µ’Þá×qÉù‡jn© €cÆdêïëZŒ$~vÆwvªF6k¯="gÇ˪ýæöö¬'K•Yu5„Üûä´*Ì  8-ƒŒúP€=‘8ùËçf¼Ú¤G§éÇ÷Ww.cGl _¼Øì+u ¹YŠš}Ó2…ÁUýÒ}G×éU$šÚÃNŽ CÊ#Ú&À;$ ô$þ™¤°ŽàÀåÁ7 €¤|Ç?t£Ÿá]0P„”Vÿ×âe&êFÿ×ü1µáë{=)ßÄy73ïd´Y'$ê»qÉ>çŽy¬{ÍOìò4%͹ùîX„CÆ:õ¨uM@\ÝÛ˜®ÀМ8ãF¯\õëY ,×3›‹‰pÎpIëJ®"ÉB=?¦ÿAB‹o™ÿ]އþ“÷v¨iåÆ^1€9èA¨[‰eò’F&F7ñ¬Užh›ì°Ü¹ˆ6x$q×5´×ð°™¿y™¿Î*V)ÍÚCtuF¥ÍÊBê†ä¼¬NâO_ÎÁÞ®’‚wr úúŠ¡oÛÂÝJNå\cÔç­ké¶Šc&X‰ 0®ŠNu%dcS–š`æXÔ=ÖâW;xãêjs*À›žfm‹… ߥ"YM©H6n1ïô)Óç*Ažk®0¼ÎiJ½È!¸[¸÷4pzzy¹Š4%1$¸¨ŸJe9 Š‚]-çñ¨“©ƒ\­îz„÷6—V3Û6ŽŽÌÀÛHãË%½Xç$gJ¤ú~¦†’LŠŸ-@ž½9íÖµ!F!C[€qÊ–É_Óæý:TSAÎ×o9 e¶ ryÅ}Dà·g‡ ÙÙÖ÷¶¶Á}©^•0”Ž+YŠž‡Ž˜ç¡À9®\ͨ¤QÆ‚XcÛ´Än ?Àöýk¬´³]^ÖS¦F“·ßËI€ê8Èãžß_ZŠ _Íxí¼°¬§÷yF sÓ眹>õÃS*­8TëFžŒæ#G7™5“¯OJeä·Wa‘/E¥vz‡… Ó-Ƨ­L°Ût3|d ±Ç’j¤:^Ÿ(-"É1ïHÙInzଞwåæ5X˜Û™-^ÚÆIK4Q…嘎¦µmô«oÓB6m«4Ä"nÿxàS×P…äKM‘Á{Ëû¨HÆ[ýcwÚ8ÈÆO@‰©Í'q&¡=á‹zG5Â.»w8pð¬aìV‘×ϧüËÌÖJ¤µz_qoûÖÚâT¼µ–æUŒ•òþX•€ä³œœÏA‘ŒqÈ·¬´òØ[%ÍÄPÇJZÂÁlŒäöç=°5…ws#êsN'ű’?<ìV=åa“Ôà–ú·5+x—K•Þy¦Œ”!LÒæ8ÇÝ2xãŒZª°Šiéý[™ºné­®ý>DÖúNgký¥w~“ï“®Ñî#’Bõ*;’=ÅW†>ÌÒ-å±+ÃF\dŒg gÛõªçů,ÑGmj–‘# ™ùXÀ%†*i¼K®÷3J'þŽUËuÔ“Ó>jJZ_ˆÜj-ÿ¯À³†¢Î\©M»ÈÀÆsîz{ô¨n¼5<—`µxÑr§(qÔÒYê–W*éy .X"®ìuÂð?/Z¹圩´E0òÕUn·`Žr©ÛÇlÖÊ4jGB9«EêfEḣŒ±RX¹,K}ztüi­áõ–™ÀR§ƒõéøkcí2,F÷þäÄ ‘œýÿë2廉šé&)*ÆÎ-Áó3“€Cpòµ›£JÉX¥Rv½Ì7ðµÔŒÒM+:ÇÓ‚c·J¨ÚsE#ÇmIcpþí]K¼³Z4’épKsæ4sívÆ~îTñÇ?ZÌ»Öí­¾Ób`³!Eg˜ñ€8þ_–Uhá⯱­:•¤ì`5ì%6P&ndCËŒ°ÿk=ÎO ëSè:–ºòê8eh”î72qƒ×§J·i ­ì«ddžxÉžú8þE;¹I¨õÆx®\Ö®5H>Æ.”ÛÇ(ă9÷s“žÇ§Zófá†JmkÑv;cU÷/§VWÖ5sª\ͨ­€ŽyQ+ñÈÇsÏZ$ÆÉ®äñðäÔ;Ø ­d¹ÓÚöVX„d"F#×Þ¨™Ü®<Æäò é^{“ƒæ–­isG–=ç$“’NsM Æ“ŸZEs‚Äp)õÌPÐÈ}*[O›0$AŒƒ ìj6䓯;Õë4KL†`\Žqü>Õ¥5wän14ôÈ!³¶[e“s–#±ô­¥Ì«¹séÅ`ÚÈÃîúWMá-6mFñB/ ÎqÅ{X4åR1Š<ÌKQ‹m›ÖzKL±ªFÎò.UBð=OaZW^ Ô´ôVÔl$‰\†D#$uþjÖÕà@»yMEªëSÎñÇqu,¦ yI AùWÓ*4£{sÄujÊ^îÅ |/k*o’<œu¬Ëß@ xJݲñLHî"“‡íøþG½uø»áޝá÷µÕÂЕýêÑ ú^¾Ã4– U;É'æ)VÄR·ºÚò8¿ëIœévz,$ܱtÀè•SÇû ÷#œVÒu hn¢¹×µ o@QÃcÊ0äF@ã©ùŽïá®JmNÒVgûDgqÈ^1×=†+˜¸ºÔμdЯš|DÞêÇrç äw>˜ïÏ­`Úx—OÿãáUTnbqŸ§zk|@‰¥iö’NÄ /Þ$pöíþÕ[FQ\Ò·¡ÍK R2²Wõ7಼ԮB³êRFJy×G!x+JŒä€äàõA¨x{S ºúáí!Œ6Ëh%É|“ä’[©ã§^Mq·^'×B·šíÍ»«±&ÙÈÈè›Gây÷ëXz¾±ªÏ;Cs©´[¬„ä}{×—[1ÃF?Ìô)àë¹|i|¿#­}kFÝ¡;|¹6¢DTõÚ8ã§¿Z¤úüÑ`F‚ÓpÒJ_jå#½š$dÆ ÇŸþ°©P0Âb…‹‡R¥\þ^ŸZóå˜É­ޏà➮殫âÉ/ H¤8o¾[¹ã¿½TƒT’<¼Rb1¸zVjy¤gÄSø»×#ÄÔœ¯#uJVF’?šá›¨èjþ›.ßÞÜMµy8f<ý+ÎáNC°SV^õvmIÇ'üõükju÷ŒªAÉXÛ·¾22D>U½MoóµµµÊ+1Æàܯ?_ñ®xj— Em&ÐzñRÚ¼VC÷î­#7ÊÞƒÔZê†)Ý[ï0t4»ûëÍtÄä(eMÄ)~¯Žõ :ýåÄÁmò¡rK?ÏzÉ’A4­-ÅÑÚw°ì=*;[̋ȱˆ¬dà–ã>ÞõO%«bŽ-h‹¯J°}E× òçÖ»î-.O")ÕY#É8ϵy•¦¡udwÛÊ@FxÍiÇâ»›åˆy˜ê õ¯_Ž£A_fpâpµ+?#Ðæñ1ï&ói'_Ö³®üAd§æœgýîµÄKâ9¦lº9è*ÔRVË3|×EL×™èsÃ/¶ç]6¯.ã'˜7J‚]V+‡ùGã\Ëj·,™19ì?¥G£('–üÍsKs¡a Å,Ìí.ÅŽ;yý8ª÷¦ÎÑ€™Ì{X-]A>øÏ5Œú½ËëzõÛ­U§¹ˆ•žÔírpSnj'Š…´_ypÃJ÷“5¦×tùĪànÜÛˆPÿçÔ¿²¸YD7PA´ Äy>€…àÖ5Ë,’ù‘!^9àu¦|‘ÜW$±3“7"{ä¸i ÌñpU³“ëþ})ÿØ×s@²ù³ÈSÛòâ«#Idø€Gê*y5  ¡ ØQÑF@štÝÜ‹|öJ$Wïì“þUÉ 8ïVžõžØÚýž 3’Û2ß@ñnÆ+9Zú 7mGÐ XÄ~Z·Íœ‘Íß0ƒEÚq^HƒùÂ1l§åئ†‘²Ìqžp#’@ŒÓ‚c¿jwapM ŒûSâŽRÆf˜ùs’}©ªÒ(°éƒNî’O2ÌHTå£ÎqøP¥Ë Ö¢Ü\\\.FÚ£¥6Þámƒƒt„~í·`'©Çz@±¢ <ãž)‚ÛER渕—@q–ÏZu 94’”wcÐÓëR‘Œ~• ¡T.qÞ–Q@!¸"–Š(¢ŠbÆAÇoZ}PM$À ‚ÞÏQN¦”Ý÷ùô *ßßý)@:Ò**ýÑK@…bqÇåÚ€Ž ½zšSŒÓèÆùc*UÛü ~T´Bô BFXŒ·ò¥Ø?ýt´ŠáóŽÔu±ŽsŒcŒS˜n4ŽY9^ç½$ŽÉÏjoAÙ±ÁI\1ç`z j³ã$géJ›ùÞ>”„)ç8úRÒn²hÜ;úP1|ª>¹¦‡tRªÍƒ÷€<EÉ3× ¢ãØLÉ cd(Âû T@ƒ–ŠÉ Qò¯_j}QEQEQEQEQEQHË»ã´QEÖ1žÓd*@0s€~´ÆníNÖÅ—Œ¶?]ëØþ˜ nó¦™ rñÖ¦è®VNÊ`Ò6Wî®js‘”on*HÕØåŽr ÜZ¹ã<ŠB„öúäÓ ’ß(ã=Í9lüœvÜi…¬ ËàîúSÕƒt¤ /ÝP$ÈÈúPHÒy ƒùSÕBô„¬£ŠkJO @õcÉDêqšo™Œî#=†i|¾1ºíLGP)0VE-2 Ü–iôÄQEQEQERÁ Hö¦•ÀZ*9'ãpëèiàäfìÒŠ( AEdgQI»œsJN1@æ@r¦…‘¾øÐb¥¿ˆö¦•#[šVè;hÒ>y4F¡úâ‚[W'HïJ#l ±Oaw/ð ?Js.yô¥¤,­2¨Uã¯Ö“8`TƒžœR8ëH>U;Oç@Å\¶Fqô¤|Ƹ ÔÒn1uç4Ö Ÿ¹JãH_1Û€ ŸjAŒ6nÇ>ië™ä€=…HNiZûÊÛŠ@äÐTÐ~T´Ut±E!¤|ÛJšu›¾m¸ ÐÐÑH¬‘M%_žx=¨ê覀 n…>ƒñÍ+b‡Ê‚OQÓ «Ó$v÷`½½œ®6–%c'Ôý*Ý’–wÏ‚ qÔúÿZdbØÇJ‰cx¥?'ÄHéR¬ÆPóéXÁ6i>ƒè¨‰à“ïOC—Z´›v!« Ä Î&p >œS¢µ»º ÐA#ˆÔ¼›;Tu'©ÖÖ—7Ó {+g–CÈD8õ§`#$‘€ õâ“·ÊrsÐWÐ?à”¿ðR¯ŠþÓüqð×öø¬èú¤bM?T²ðÃ[ÜFÃ*é&Ý¥H †Îz×Ò?²ÿüÿOý£u•·ñÆÚg’Ï&¯ãö’Ô,[¢¼ìÄž—´…'wLÜ#»AcãOÛ ö~Õ?dÿÚ‡Ç?³–«supþñÎ Ýõ°‚[˜Q³ÍæÙ¾2ŒŸ¼+Î7«¹öÍfŸ´Çü“þ ±ûb|\ƒãßíû)èï‹­‚*ëQ_ÞZ}¨)Ü ÔòÇ ãt¸I2 )ÊŒW–|fÿƒpà‘<4|?uû$ÚxfõT¤zïƒoæÒ®QŽÜÈ?N² œ(íË \-¨Ý’W?‘àêÑ׬Xµý=ÃÿÿÁ+å,³ñgÙ¿á1µ^}qö/_çU´ÿø4þ |‘H'ñÅV‘‘vºx®×r@ûë×<×ëTvæ1™‘xÈü© àÆ¿¦Mþ ïÿ‚~ÛøšÏPñÄ¿Ýi0_ÞIs¦[^G ²Û¸ŒZÄf!€xŠÈd‘T |Á„‹oÍëþ \ÿ‚6[xža>ëriðè¦Ò] øëU1Í>õo¶3ý£ÌàÚ®‘aîÉäCÆQ¹jÇò†®Wå9È©a†[—òmaw|d".Oå_ÕäŸðk§ü¥µ/Vðçìí¬éë¥4{fü'øi­xÄ:«´zf‹£éïqqrÊ…ÈD@I«1=ôýZx«þ §ÿ‚Mø‡ÀçÀ6_/ôXâÔ¾×§êÚW‰/ŸR´Rê͹¹–S,GnÐ%ʬÁIÍ})û3~ÀŸ²¿ì¯á? øWá_Á A7„¬ž‘â9¼=lur‚%‰¤–ð ’I]T“ ¿z™c(¨Ý'q(ÍÊÚXþZ¼/ÿèÿÁe<_áÉüMcûj¶¶°Ä_n­â2ÒV E5ʾ@9û½AF+ã/ø_Ä^ ñ÷„|_¢\麦™u%­þŸ{ E5¼Ñ±WGF«`ŽÕýà6› 2 èÁ¾\žwü y´ß±Oì¯w¬jºî§û=ø6òóY®uIï<9lâúá‰&yFYI<ÊÊ_ß®rŽ7]Pýœáãk?Îi#•\’3ø×÷¨þÄŸ²ö¯£K j?³Ç€å¶žÕ`š)ü#c2“gã |YJ<ÍÆWº~§cÓ/&Ö\8v7rAäìŠåထʙn|dÜÿ‚ÿÁ%/>)~ÚºïÂø(wü×â=¿‡´ýîôy¼E¦_é:}¤©"©[‰G–eb® $r/(Ù ôÍ[‚aLÃî—íô§º€D ôä~µ\©k2U8Û]Yù‡ûhÿÁ±¿ðOßÚŸÁPhÿ´¸>x§KŒC§ëÞѾ×lñcîÜÙK" ’lIæ$™ —`ªäíáÿÁÁJÿdOZ7ÂOÜühðÝû¼pk^Óî-Ø3ìK‹Zh‰EÜY<È”¾a$gú¶·²»YÜŒ€¡1š’ê ¹adŠá¢$pèÊ}²1ù‚=ª&¥÷¿©T×$u?Š Sþ {ÿеWÃÚ¿ìOñ2Þ÷AÑF­­C/ƒîÁ²²;ñ<¿&O–øÏ]¬Gšó8¾k–º¬zO!‹H-§¨õÔVìSyAÃKoVRœ0*sŒþè?³oän5IÉR ô^ýÊœ×ë¿ðN؇Ƶ:þÛ¾+ý|=©üVŽ+$‹ÆwñI4ðµ¦>Ï,q»˜b™ &D•TRä"ºÆrî•‹IIv?'ÿà”ßðl×ìñÓögðíûDÚüMÕuMbcvtMFûû6Æk1·ÈùcŒI,R¦Ù–Hå VPªÍ·{~¬|7ÿ‚bÿÁ=þø>ÏÁ> ý‹¾Aae¬kqà»+‰ Ï,ñ»ÈÜrÌÄ“É$×»ˆ¢a‰p;0Í,ÁBmÎk’ugQÜ|¼»êA¢øwAðî•k¡h­•´vö6vvëVð¢„HãU"ª€€V&XÔ$€ rãŠsÌT`#Ž‚ªÝ\yX?dy¯§ãÚ°Jì·khHmü—Ëcc»hÇâÏzd×–zm£ÞIr‹ F^I$~@Éb}ª·–w7Qè†|‰¹”ô88cǧ|RÊf\$÷QáNíËÁc<ÓQ¸\¹o«i÷P‰mîc(Ü#©Èn3ÇáÍCõ›Hñ#o`~e… c=3ëM3íÔÍsÅ·ƒæsÔóRˆÄÐ\†+µ\Œ0öÈ¢Êâ½Ê·%±Ž9lnæxî#†ÑÉ Ê¸#/ ä"¬µõ£DÍ$<º¢#’:§ƒïU>ÀÖàF=Š…3,y8ï×–ïV-ÖñâÅÌ‘ƒž g9¹Ú:Óq+ãñ Ë5ôO§\e*Ƭ#”• J¤s·ê >Þ(^iášÆb Y}F\:¸`(‡y$cÛ“K˜à7Êq’:Òô¿S—»×|föæßMÐÑÞYR;›™C$a@egÎI,02ÒwB¶¥¶•®›‹k›Ïo1Úížm#šCÞw0é†îsž1¤Ê’­ ÛÔ^3þ4PÞb!ëÓ¥6M»‰o4;ž$8db¬ëßð©c36 Ì7éPCŠÞfæÀ?26úð9©K3Ì  rp3R×aÝ“ˆ÷6õ—Ÿ¥FÖq;&_#€ýª»›Ž` y?/COó.D{žáU1É&Ÿ/˜îº¡Æ0¯ˆá+êsÁ¥hÝdU9Ô`f•„×óöœ}äúƒJ`À䣩ïRЫý¡kçÌ’j0–‰CKð iÏ'?îžxè}*´Þ1Òlæ–Þ{•V…K8”„rØĽOqZ+ab³›Á J…2c’¹$ úr3DÚe¼¬¯1 °åw(8>¿Ëò§§PjH¥g­ØêR˜¢sæ—pG©Ã囕…n$:nXœ‘Ÿ¦G¦zU±eb¦GŽ=…ÇÎq»üzSäŽ2 ‡ÚÊr¥³Ç´ÓièO*{ŒŠÎ8vªÃ<ºœ"Œ8ócf#×£w±m†öÍ]OÞxùÁúTÊ‘9ñ²`åw>ãéííMóåoBD‰–SŸcO#•qM‰ÑrL·\z t€J½Hú‚Ò¸Ö3'.ÜqPÛ´åÙd$ åXwŸÎ¥cƒ°dƒÜñJ±Æ*œžø¦­Ôo ‹á•?øè§´@…Éü@¥PcÎõ¨ÔN¬IÚGlæ‹Ö{ aU9?©¥TD^:`cã§ëHñ–{`зÜ[t‘Û5R}>7”ÊZ@Jàí~¿áS0‘3—=xÝQ†‘òC}ÞFôëUÑ7Or6ÿHÈ&DˉÔ¬2(È‘±Æ.}ÉÆíV¥‡{dr0wÒ•(¾^ÅäpÍ= *[iöÛ¾ÑožWäÜHýimæ[wb,œ<Ÿ4Œyüˆ§éV£³Wˆ±M§¸,O?*!I<¬HÉ“=}¹¢÷`•Š÷ÖñÜ"¼R2’FYA$@8üêxØZ¬Eär‘€L­–or{šrŠÉY»`t•K¸D9#žÙ¤Ý´·+\¼ClŽ,8bØ>ÃÖoq+¢ÛÉNŸ†zÔá#Ýò*ŒŽp)…c”ÚÜ€p*o}³"·n™â)ýàíÏñJ ±Ü®Ã–Ç ý*Vˆw%ˆû¿7ùÍ#DŒÜ°'Ž‚Žf-’™˜<`R#¶}éZq+lŠ}Œ>ð* ÷7ÙÀRÑ€ ±ê.µq’Ø•²[ž¯áM´°Ù¢6ß<Œt Gæ= Û\+ ·L`’}xéUeF«Ûæ~½«̷ñF¿crB/ÝÚY‰ÁëšvlmXµôY@9ê@¼¹m¸ë“M´[™Ó3ñòðÅJœý)Žˆd_4õL6åÒI\["ßš„ž½ñÖ‚ws‘Ç|Õx‚Fˆð°ŽUqÓ×5#ù=‚‚O$qúÒ Ük£©,¨O°4¦Wk.F:‘LDE8¶ž¸QÊXåšITŽHçúÕX›ûCÆ2èN R¬ÑJ2$ÂCJdùC_=£) ,cjU‡aB[ƒë•è)åòs‚qPÅ,j…£$`óÏ?­G0Gd!p ë÷…;\.Ño¯!¾¹Z@»úö¨ë#²>8ÜÿYògûÍJÌ9®MÉ=?*b´Äãӹ⚲ÈçH_ëMÞÁÈ!‡µcm1cy“¹F:ŸÖ‰Á`mB ýâÈy²;„,àÜT&ö&p¤àŽzÓQlWV&fº ‡|ÿ:C çh;O±¤idQæ»”g5 ^ª…’@À‘Œ6GøÑÞľ^¥NJ€1ýÚCg Ÿ1ƒžpqNg>iX ñówÚQxS»œ Jý Iu"fF6È8àE.¨P·ln8ïC]ÈîZ8ÀÎx<úfœNáûØòUašÂm65Y‘·(õ#ŸÀÓ•w¸. ‘Ðõ¤K”9ð9Ê‘ŠGÇ,Î#ŒQf.hôö´»Ì½:(€êŒSs’ßuOÿZ£·iSå02›—štÈä3÷r¼Ê|¡ÏaVI ) þ%è?:UAæ33ÿõÓRG1†ò—Œ†*z~TíýÑ;’´š°Ü“ØW‘X”y‘ÇçB±‘²…A‚9ÍG¼`¦8븟Ɵ¸Á㎠fŽV`ñ¡S½FGŽ3ùT>@ #g8¨ª~Xü¬G’*YL€}¥~èéùÕ%dKÐŒïó:{+c™΄·‘+Uô$ÿëTçj¯îîH#®áœõéÁÖLys+{µ6Ç{‘H²"o¶b>l’¨9þu,*Y7y`8 fš’~ð±^rÀ©”Ê3ŽàÔ°NÑó¨Î9 ~´åí"3^8 \°çéMû]³1ÌÇO- c¿j›•1VX“ǶOøÒ­±BX§4‘Ý™”Œ®zïFÒ’2Ñ—qèij‹qŠ@|Ä-ˆÀÖ–ëa´Ô÷vÒ(ŽÚgSÒ#&{Œ‚ Ô–’K5¾öR7 Õt»3µ“wŒª*óÜ R`²œ¼(–êQu'øÀ~†“ì–œµœlßÄÅFSè»Ü€@Ü@ÿuÑ»û²WÑ8üiÒ$1©Æ07dþu$JHùÆu³JéjW!]ÆÀ½·68¤ž p“M…þèŒsVKÅî Zaû9A”NœqŠ/qr¤D"µ£Kœn'OÖœ¶‘H  øçr9?Lÿ<Ô‚YC†FqéJË”Úè Šy¤äï£)Fë`ÉåìtFŒ3*2 "Žàô¡fe$ªÊHààã4²$‚¿ëF±ÐI4e®ÐHäÿ’)] +•¹1œg9Ö˜…Êa?xŸZmÅÌ0ŽqóÑPœþUVìO3°C0Œ¦MÇ©Zs\¬hJÈIê6ÿ¦FRä€?‡|VÅÉòØýâÇ#׌Pì=F›¦Œ«˜äcŒœßGö»’à[iÌã’Î8üxýjo²Î—ÀQÆçZFÀá@|à’Ý0i+MnÌT–€#È O_¤‹tKæJ¾:ªšíÐGûÂÄ»?1¥»'å…Tg‚I'òþtY±Ý"Öû}ÊÃ9Æq»¥DÉÈ_É “€YºŸ¦i¨²d¼Œàž„àR5³vÏ\µ8Ä—'m‡I, "«ÈU±Ô7ÒefZHºðƒ?ýjh´2.ds· ÔRÝ”ªHî:æw¦ãRvÔyÓ‡ÌMÄ™cœ©"©j/g§DÒÏ©:…w˜ùϧ9'ÐV›¶ã" W´-” ÇvéJ2w¹rж†Fž¶Ú˜ûV˜&fbKÖÜÅ"Žˆ • ßZ¿Í6G@O>„b©JdŽX¯ˆ§&ŠðܥͬÓªF\ŸåškÅ­£yp\D¹È'ËÆ>˜Ö°»‘wÍ/}݇9ϯÊ–yD …¦T,q–³žÀçŠ\òlj ×èdÜÜjðm¶Ià’\}ù#*õÈÐgÖ°tý_Æíxö®»§¹á,lw6Æ1æ’=¸Ï·=„òApD.ÿ89Ç•×óÑ *þñBe² kŒÕ)¥Q..û™I¬]E8 )l@HÓ ÛÒ¬Úë¿È4ëœ`œœcó­ tô•6†g?0ùƒIŒñB#i\Á/¹I?øîà'(1òÍÖ§âHÚía’Â{uû¨ ¼ƒ ìB{úš½¥êÒÅÂÒ–ldIà:¼þ+næ!(•O *?ˆ¬Ëÿµên.Ÿ8`ˆ?h¥ $¶!ÆQwDöºÌ¼½«õX˜gž¼ÕÇpà.â§2¿Ö±ítûût®G_߯åÉÿ8«–6Ò$åà–R¼“6àŸJÊQEE¾¤÷¶—2&Ø%ŒdĨª2Xjâ&û=òo ò,°6Ü~Ö‘*˹®_Ýÿ¯Rª0\ cŠJMl>U&fÙÚk‹óI©Áœò¢ÝºßUimïdÈ’UwÊÉééóg…Oó‚Ý8ÎúÕ ‹™‰ôÇœ›ab£A$˜Žklã"lóéÐl×Mc6¸ÆØ÷QŸ×¬H³’[ŽÃy¦A;8*Ñ:ܰ4®7k„A&"Á‡oèiâÝQŒ‚C´ÿËÿ6AìjŠ.Æâ™E´(Œ†E½Iêñùv éSc ©MŒô(˜?øí^¢Ži=Ã’%htáü¼¹ÿ€¨þ”ö¶º“SQEì±!6P«úS…´J0ARQH|¨ìêzœÔ£Y;‡u$އ'5nŠw°¹bF¨\úR˜TœÿJ}‡dE1¦~r~¢iéÇÒ¥¢€åDÖ"sæ°üiœDήjÅîÅËlc—‡‘þ±N6êyÏ#½IE¸rD«&•¤ž^:ml*XtÈ`R©#óÝœ“úÕš(»Hµ¼lsæ0úP,¢VܼdäñSQJì9bBl¡9%G#ž(6ð²í-Ǧ*j(,Jëiô™ÿHúU›Iç,a_ûê£5fŠwaË»i°°?3‹¿ëL:L'§—#¸|*·Ebä`¢Š)QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?ü­M^ó¬é3×µdëºô÷ÌC…‰P–8óÞ¸Ë_K`IÁ<ûÕÇÖÞXZ9åq†\žköO¯F¤-±ð ìå{þ ¸ÑçÖ¡ƒQœ.=0qê{ õ˜üCáI¦:E¬ÖR“.#åÏ®L{q_=O4q’“ûzö+CeÔ‹6J‰3S‡Í>­^TňË~±.nf{Œ|:5e¾Õ&žÒÆÒÊ·Ù–b€%r6¨‡RIõ¯<ñ.…u¦Êæ&IàŠá {«vß‘s¸+Ž {Xx«T‚ÖKmNâeŒ£ÃÌ”ã9PpsùUyu»Æµ[/¶ÈaB‹yÚéëŽõωÆÒ¯ªV6ÃágEY»¾¸Äf5àúšÉ›æ8öëVd™§êp=ÅW™Ô+Ê­53Ó§VQºR¿7½Sl¿#¿j¹{2ع$žÃ¥E &D Ç8Ö¸$”Ž”ÚŽ¥YcvϽ5,ä^~•uUˆ 9«VZ]ÕñÙmlò0äªu©T9Ý‘R¨âµ3ììü×Ú£ÜäT á­ Ü­ä¶Jò+ú t­ëå”êJ÷0¡™Êœ,Õìxü#š–Ÿlï5·–î¿#2|Øž„‘Œýk*ëMžÚTˆùjIf ¾Õîú焼9w:jðß0$0²Aÿ?S\ü3¥"&¤´pÛ¡ !6úž2IãÚ¸19g³G~2ULó ® YÆ>ROZd­<`“Q€Fî7ð®“XðävMk¢ÌäŽËäàgÛ?Òª¾†¯pÒÞÞÈʨ©È¡€äã¿N9çô¯2xj‘v=(ÖƒW1¢šKŒ’‡ zU•R½[5sTáW•PŠR5 3óuny5O¨ýk7©¤d¤…¢›¼{Q¼w"ަ3©ûËI<» Õ9n¶ g)¤Çt\i¢Aò‘Ï¥"Ê’€qÓÞ³&¹f;TŸ|SYÜOµgí’–…r6®iîÚÀ`OSڟ沨`ÇÛªqܬ¸ÉéVD±ºà¶= ­#+ê‰jÛœêj;ŽGµbBGY3ëYolÑôè(ŠIíäÇw±¯*5d­s½Ó´5^á×ï·_SL[—~ƒ¥gÉ!mĞ•.Á8ÝÇ4ý½Ä©¾ÆŠ].>c“íNkˆöîVÍfIuŽV¡û\ǦGãIÕWIoqƒ÷ªÝÊç8ªñÌØ%º}jxäóHL䓊J|èW+e›9Å5˜¡~ÖŸzÍm;D«’§ =ê­ÅÁîíí\íò¶l“v&óH7|ó]GîÞÇ*¶1ƒ…lAàq\u¤«=ÆÙd؋˹ì+R^¨l¤1lP¨ñü¤`õ㿽tak*rSfuèÊP²=bm+IÔ³‰VÒàF A³o?)Î;ðüjÆ›¢&Ÿ0Þ3Ï¥y-‰.m¤I!‹k« œsëÆ9÷ëÍz0øjxm-/¬ IŒH×6ä®r݉ç±ãNIú\7 ‰“ç´YàâðØŒ<}ÝWâoiz¡·O-H‚º Wi¦H™c!Ü*–|Ç §ü+‘×~!xNæîc¤épÑ…TKycXúã'§^ùéÎj #W¼šò+™¥*ñe”FHU$Œ‘’rxŸNÙ¯jž&šQw<š˜iT…ä¬Ïmøqà믈Þ?Ѽ¦ÝÅoq«êPÙÇ<Èì±™Wq 3œO\ßÄ-dü+ø¥¯ü%øŸ j^Õô·ŽãMñ kÂ&r¡” ï*C€y?( ƒþ%Üxg^³ñSÚGu§OÕ¤·Vqܧ›]ÐÊŽ’Œ€v2²¶0Tçßç§åVíµDVå³ëšÊ¶<¤€FAÛ·õ©ôë­2ÒV}RÅæ|Š’íÇèk¢^Y+;Κhé4$&]åEuo¬­PîÈw 9ýkËžú. Y@b@8_0š½is'ä}kÐÃfU)»Eœu°4êjÏJ—â““å U#  ÿ:ÝðßÄÍà\êM%åÌØÇ”¹=x¯*·‘ˆŽM\µ£`HêzôèæuÔ®·8*`(J¶‡»xÅ’x[X‹LF—çΦäv_»ÇçúWA]¼açÏlb¼‹À:¹y"[]¢ò_rä`ýQ^‘câ;[kQþ‘5̌ļ®å>€ô+éðxŸkNògÎbðÞÊv‚6ŒOýÊ©ªiVZ” g¨†xѲèïpG?¤ñŒü) Í­·€—TœÏaÞ¦¯Q<'"TS°x†2¬DlwÊ1“KûRg€´’œ‘“ò÷ï] µ:±Øæö5iÊìáüSðºóG[ZßRŽXL [Á°ù¸€Ç§úW)â=ã@¿þÏ»#y…d9oÃô¯Z¾Õ‘¡-*nÚ@ÆFsõ¬{X¸½‰n"Ñ,çh£Ë •Ènz`t=kÈÅ`¨Ý¸»~'±†ÅÖÓ\ò‰nb°V=ϱù8ÕèU³šë¦¼ð%ÅËG­iŠ×;•aŸlh}¶¡ÁöÇÏ5‘«øgš™™ômÑß o# N~CŽ£ý£§¯…V„¬ÜdŸÌö)Ö‹v’hçd•‘¶œž3I$ñ“Š·ªh¾žÊÏ› ‹y*êÏÀçü?Çqo:ïŽFýÉ85æÔç¦ìÖ¾glf®×‘a'Gèß,S–€ÑÔæ¨Í&Ô(§=*8µ,ÖÑÈW$ƒ¨þUµIêZ¤Í‚èIlãÖ–0%l;ŽÝ«,ÝJ nrxõ©moP±>=q¬›#‘Øžêýy Àý*»jŸg‰Š8 ž¶+%†5³Ì>f8>¦¹%ŒmèuG–ŒÔ·ñž»ar.-õ 8|²N»3ãG†.`žÿýqW­ ƒØ5ìò–q“å®0G¹ëT¯/ÃÆ °û«é]2§N1ævwØÊ3œ»*ÿ|J@<€¤`dQƒéš«ím£IèXVeç5Œd¤\“è*BÙÁp? ¹§hQß.é¤<œSP.F×Kà]8O'qÀÝò–è+« EWª Îjõ8s1ø#[/˜¬d+ŒîÛÚ’-&êÙ±*ƒÍ{Žˆ×ÐyV«» †`?Z¡qðWSÔÙ¦KÅŒ1,w ÷e’´“¤›<Èæ±nÓv<æå® «Z|sÎ^X i(d”…$*ŒrOa]&«ðSÅv’Ÿ±…–09`k:o…þ/‡!4ÙcÖ+Фõƒ-bpÓZMèž#m-6Û$`·ß,¹-ÿÖöýk£ÒüCwª\‰%œìQÂDÛGAמO_ΰt¿†(»™R{g‰OVe VôþƒEŒ /\¿€øãð¯O Zå’8«Ë ådÓgGeªéö1³ÊÊ¿‹#'üO½[ƒ\³ž2â`ª;–ÂÜÄRËm‰5%´W£lÖèzðvð=ëÐŽ*IÙ#ŠXXK[ž¡/¶8†{’ bܤóf²¹ù mwVè¥C Χäšå•ˆçš– ›«|‰þ\ôcÔŠ©MÔdFš§»9/é2Ù,·vçÌIù§+ïþzb¹‹›¨ìFö$÷qÖ»ícBÕ~Í a½[‚íïí\‹lš '#–>™íŠù씩.do8ÎÑlUñG‰ÜéÖÑÈþbæ=Èw ô*G5ωÅÉi‹ï»9§¼S¤ÖVÊŽlQ̲Ï!’I›±ä׃V¥J–rmµÜõ©Âºˆédf;ƒ`w§D aäÓ?}HÀ§E*Ž1ŠË]ú–ÚèLY˜åF=sN,IÈLãÞ™,9Í[´±I[÷­ß¼–Æ3j& Q^aØ„ü¹Å-u¤Œ“KEŒ»»ÒÑ@I¦H ºÈB““Éüj0pÄu4pÀ~4Ûop½‰­ãG!¤|c½Oº0NÓÅTØc9ú –òñŠÚÈ–›-G'Æ}«ÚëYFf¼R4P3\ÜN mR8÷«+á²Y`tÇzë¡^tåxœõiÆK•äM…²&Ÿæ.Ñ“·Ÿ|ÕM_ã,ÌbÚL%xüÞ^…¸À>¸®:[Y¢±/ݶ«•àŸAUá´Ø ÏSë]u3\{Is[ð9á€Á§~[®“ñçÅñÌcÖgóžFÜüµÒZüjd²[ˆ-n'VlÀÂûu¯.µ²ó¤ØeTÇRëZ1Cmù°I#Ls¹ºžùÒ¶Ãf8øGYß×s*øŸÃcÐgøæäŸ*ÅÇ¢0\3Y³øñµ‰LòÜ23»ý3ý+𿿬i°Mqq½ºÎÀ;WOö†2¬”[¹‚Áai«ÅXê´¹¯5¶…dLD|òê3]Vk6¡p©h2¤ —Â>Óll5I¤™‹s’q×Ô×Seiin¾]¬£Â9¯¡Ááj('7¯SÇÄâ#Íh#ãKû+’,œd2*{;Gh1£¦ÕÀ­ãœ‘l–<ç×µW–haCokmÔäx^Ïø×w°Œ]Îk)hÑ—=žåﱋ­xHÖ‰¬Ô>1½Wšèî¯íå ÇÝÎM2Þæ9n6(ÏÔVS¥J¦’W4§R¥?yUâ†YI$Ú{ŸÃëù×#¨è×úlÆ;«'ŒŒÃƒ^ÿ¨hñ_pGÌ;×5âCwhñyE¤ÆUŠôëþs^&3'§$åMXõ°¹¤“Qž§2ìÎsÍ7Ɉ`z}åê};ÖÆ±¥­›Éi25¨éŠÉ;‘ˆo^+åêSt¥cèiTSBF ò¯R-Ôê0ךm&ìž+%)-‹q‹ÜÌ¢“zúѽ}k†èÚÌZ(¢€ (¢€ (¢€$Œ@È )®pñš}ì$hÆvøÓþÑ'uZŒœ~TÙ:sÓš®f‚×,[Þy“hŒÝ‹± ~£R” ÔãÖ«¡s÷©ÔÕI¥k‰Æ=‰äÔn¥#Ìl…û ž "® @ÿÀª )ûY÷Xö-&«*t€ßýjžK7Y£cý¿þµgQT±bïq:p{£FoO+nʽÿÖ«ºWŽŸI™.#ÒQÙ ´œ*Á¤##qÅâ`ȇB‹Vhô?h-VÝIáär:‘rFñÚ·í- ŒxXç<æûÿµ×˜!lö¥q‚sŠêŽs™­ª?¹‘ƒË°zkñÿ3Ôö ½ÆÑáö?nÿì*Ïí«Ý1/áþ@/8ÿÐ+Ï<¤ÃACü,~”<ç4{Ôüù e™zÚšüÌô;·qgÍðÂ7ý½ãÿd«–Ÿ´„ÖªÁ| „‘÷¾ÛÏþ^^A` =¿É§)$MRγ(­'ø/òË0/x~/üÏR‡öš(ïî'©†?ö:_Ún&‹Ë> `Häÿi èºò‰ ŒS6’x#>Ô<û5Jʧà¿È#•eÿÉø¿ó;/|UѼM8½{y—…u½>¹ùk]b F‘OSægúVJ+ä –%`¹n§µqTÆbkMÊo_DuÇB”T`¶óeÅÔ" ƒuéºý©1¶}ªÖcä‡`¤gÚ@ÇZMç8~´˜/÷‡"²z–‡o_ZZ‹vÓ†ž”¬ÎœåOAX:š)…·ÐScÝ '=ûRòZÑQ™Jas“Úæ|»ˆýhêhuŠÛ©<ÅÛº”½h1©;_­*°a‘A`:šv…¢Š@sØÐ!h¤Þ;ñõ¥#"€ (¢€ (¢€zZ) ÀÍ)£9¢Šl‹»Ó鈮Wål~5-!Âô¢ÃNÃZ<œ¹…1Þ6!ÍH·\:Ðv©hçÚ€NÄh¯»*?J•wÿ…à­ÇSÇã@7ppJàD$.Y³N¦ù€¶ÕçÞY¸þª–ÒÒêñÌ6¶ï#Žv ÉÅ~Ý|ÿƒ2¾7hÿ´]Sã¿í;à[ÁñjÿÂC§xuï­¯§´Ü<å‚I (’ãpRÀŒàž¸¯¨?hßø4sþ ýâYþÎ2x«Â>)“LŠÊËQÔ<_%Å”s`ƒ}<o+Îìqº’ÎNÓ|&’ÛR¬º³ùÅŸàÅÁà[ŸŠoðÛZÿ„rÅ”]ëÙ²}–Ï òcjüòƼÿ¨êÃ>…û~Åž9ýº¾:èßþx§Ãöš¾°ÖmoYŽÊ#Lwy9$dˆ®ìHÚ§’?¥Ÿø$ü®Óþ ¿k>¡ñ7Æ^ ñž¡ÿÚtGáí—Ú¬&Wm·k¨Í^ot û•eŽ#¿i±júƒÆŸðM_ØkÇþ0O‰ZÏì»á+_%ëÝÅâ¯XÿcêÐÎî]æŽúÃɸYKL‚Mä’s’j%ŒŒ&ùuóŒ§t?~Á—ÿµqÆïÛºF’°ø_IºÔ®|ÝËòç[dUÚ[ç Ä>V5ôž‘ÿjÿÁ=tëèn5oÚâ­ôQ‘çÚ­öÊqÈȵ%ry¯×ÍI±Ð¬"Òm~ÔðÛD±Æ×w<˜4’3;ŸVbIîjÝÁ¶XÉ`æã¥r¼]f÷"¶¬ü Õ?àÑŸø%d©åCâO‰ÖÎ@Û+ø²Ñ°\ƒgƒ_?þÔÿðfǃ¯¬mõ¿Ø¿öޏ‚bÌn4ˆ Î’.Æ*ÑÜZŸ€»Z"âwŒ?¹/g¤Î¯qs' z<¦=:b®éöúu´m‹.Ñd£ÓåÇåNXš°JÌQ¦›ÿ‚¿·gü+ö¥ý€µ©4_Œ× f¶Ž&»'¬/.m¼È¼ÑçY[¸—fÓæ<"3¸aŽk嫘Z ºJ’í8 ‡ žÿ…q¾/ý’eÿˆÞ*—âĿٷá׈u©‘­k ²¸»*h 4‘»>n¤ :×”xçþÉÿ¯ø—ªO­øŸöøj÷1H—M§øn Q0p'ÉTÚÇ\2ã‚0:GÒ¼×ÜZŠKsøÈØÑ’„àƒƒõ§d1Æ>•ýLx›þ 4ÿ‚NkJÚ~ãý.%‘¤[};ÅQ(Wm ¶émÞFû£ ÌQyÚªY‰óOˆðgìy©iw°üý§¼wáÛˈçŠ×´û-fÞ$}ÛO–ÉoC·#£aN'pÝbéÚW?›9bš?õ‘0ã<Ž£±¦ gÓŽõûýcÿdhÔQx»ößÕu=8_¤·WÚWR)åƒoÍj°5Ì‹õÿI2È2BýŸø©Ÿ?àЀºÎŸ5§ÂÏÚãÅþÔmd bñƒ¡Ô ºM¤%¶–,T—Š.CGžBúÌÓR’Ý€¤†à®iªÒ ~Å]Áž?µúëOiíQð¬ÚïÛo-Âê¼ØEc…?C¸c9ù î3OSÿƒøsãÏÆ¿øKW·×uøô›› Ks+i³4͉d–ŒÝ2‚åˆÆrq¢©M­uRè|¼gŠifìk_Y·²óÝ„MÉTuàçYNL£¢®;*ҌܞÅBJq¸Á¤‚iñ:FH’ áºö?]MVÀAä}‚0FHcCÛëMÊËTUìö($ãoZUŠy´p± ÷ˆ^•h½‹•gEߌät#Ó®ÙÛëºÝü:n•ÅÜ÷°C³;3¨$’®iB´ØŽmJV:£z …йi°?Zë¾ h¿OÅ=_·ÚËø-VñCx[gö‡ØDª'0 T§™³vqœgÒ½óÁðDø+_Ä»«  ~Ä?„êªdú¦Šú|8È-=×—@Žò:ÜŠú{önÿƒL?à¥Þ6ñ¾‡?í¢ø_Á~“U|H.ß|<Ñôëeµ´º½ñ}Æ«&æÈdY¶‡žh°wÅ3 dd-ôWÃoø3öÕ|DÖŸÿmèº`€´w^ðåæ«;IžÃ3Z*®;·žß/\E)§Ü®x-ÙIà•þ˜ª×z<ï6è„Ižwª€Aõéýi¼L¤í¢"Í-Ãÿ‹ðeïÂ>$_ÿlÿÁâè`Ü_Å>‚}>ú@Ÿt$)-T¶~mó;1¯ÆÚ—ö%ý ¿cÿÚ*çömø»ðoÄ^$7G¤ZKc!mf14¥Í UÍÄ2˜éÚ“’KQÙ­„Fw<è]O-³îþ¼Ôí¿ß)8Æà=ª”VwJX˜”°+(# ëÐÔ­Üq~õXc*Ùßüš›+Ú⽺~çªJà†:}i'´WŒ ùà’FqíU YÕüövräFûÕz'l DCö²)5a-J¦Çb2‘ÝY†OéU§‹Tb… ¢Bwù§†\ûо÷mVˆÇ8ÿëÕIæ¶7¥ ¼¯¹W ¼àò1ú÷âš“ê6–ì‚âá.®ž­Äh¬ÞR£2d¬W9ÆTóíí\ŸŒþø7ã?ƒüAàߊ~³Ö<9«Çö[U³‚æÚ僉6†‘H%T‚ÊY7 éYto˜¤ŸMyf·d¸Ž7;^91Žý8äp:ŠƒÅžÔu]:X4_ßé8”Üéi H@\m"xåB8…9å©j1µì~nøËþ Uÿ‚XøæþMzmÆzEÅÆ¥5Ü×G‰‘UÖWÞ!X¤…âŽ(É*Šˆ¤.wà‘l¿ø3ÃW¼œxƒöý¥¾Öâ73x{â’±r¾]íŒ[I-±6<–2_½ }š ÆZGwÙ-ê9íŸåVí–d‡ÌŒl;GÍ"¤sÇá[ýbqÖäAt?ŠÚ—þ åû_þÇ ý™þ9|Õ,ü[¨Ý,>±ÓâûZëjÎ9lŒ;¾ÐŽÄÚ7Ê2««"ý-á?ø6‹þ ¡®|¸øõâ„x~!fÓéþ¹ºíá* H,졘ÂÒŒLP§YkóWõS}ð7áˆþ!ÁñOÅ_ ü-©ø‚Ò¢²×î¼?ßÀ‘¹xÕnLU‰eà6Hä×f¡L@ªXÙ¤•‘j ^Gòmû1Á®ÿðUoÚ-î&ñ7ÃM?áµ´ ÛŸܽ¹™_’ÉI$Ÿ(ê ‚¿oÿàŽ¿ðC¿‡°'ÀM?Cý >øÄ¿4ïÉ«AãmÚIÞ!²5‰c’xct)µþP †bÀó…ý hc<ìÒ¢àr V15*éßrªi¶êÅž5%‡§zs[ÆFÒ1ÏTIJpGnÂ‘Š·Ê¤Œ÷‡3,VÄkŒÏãC1äÜxíJÑœ äûÔJ²¦©îÇšjÌ–Ú.6¶ D(æþ˜¦„ î¡4‘ý¡~RŠ=ºSáLdÏ?­=+·¨±Eµ~`2=BÄgÌ#òjMʃ!ñžœÒ3$ŠNÇ¡©»(Ìx>Ìå¡kÓŽ±‚ûë5m%23BˆB‚ /­I“®þ”²(+@å@«rd$šÐtSI·æç¯×Wu;1=9äTfYHŒK¬œsý+?PÓ¯¥•.¬-¢Þ.£ï{œäDTdÆî–¦ŒQyjdx ƒ‚)ÃzÇ—‹¸¨­?´v»ÚÂ6I¸©ÛBÅKF¯Ô½ª[i•„UM›c@ݘ@…•÷FG°Õ€ÊÜíãÔƒJv‘‚xïJìµÔ«5Œ·šðFX÷† üiw±]†Ì(|ÎMZdqòþ4Ö‹!È=¶Ò»°ùlD¦@¸tàv·zId>Ó8©7˜ŽÀø¦¬òÂ'uÈÆh&×ÑH±²“m!²»W¿¸ïU’êÛ†‚)‡˜¼²– pÏçV®n-¡*òHqÇCó{VQ¸H/BÉ(Y&s{Š®z“þ Ò*膗r[˜m„É5Íß„C§cÏLþÔ:¶…§jv†ÆHÁ%·ÆùÆÙW\•`s;U˹'Xâå±Ã:€ÄË­An-ìçšx‡(ƒs·¹Ç<ý}èÜ4Döv“Áj‘ËxS,ÑóÉ=2ù8ç*‚à^¸Ž++€JÈ Ž>bS¸ Œ>žõ kðA7Ùnäg‰D"@2ž£v9ñÇ¿"®Úê67³+éÒDß6ÒU¹Ïüj’w!µk\-¬®'“ϸƒhœdvâ®AlñåŽÖP~Pÿëÿ…N»T )<ã æ–0‡§^:VnMšÆ qŒ6} 52£åo¯4âŽÌWúT/#†ŽzéR ‘¤qŽx>¢¹±†Ò«™×²IéNó²3¹@#å$õü)µbT˜¯"#ŹÏ8à}j9.#‹¬˜Ï÷‡=‹c÷\çð¥ÇˈØêF)®[»èEöËæ,™… ssK—înzäùT3X§ÚH.åFÈfP¹Þ=2E\†G.¹zdPùF¹†–B6ÁìzÓö°?êÁÜ8íJÉ’¥O§4éÎ`^jJ²d.“19#üj?±¿šn20“ú’HäS¾4VlwãúÕk›éìÔ¬ºtïÓ&.@ªM½eÉå–+uÝ!‘†?†2ßÈUhõ­6åÄI~#sÔH “ôÎ*ÓJ~Vcž¬zT"ÚÆìíº²ŠG<h?­=:“®È¶J•Ü1œ†ëM!<ß80\¨C¤i°±kxŠÜ„•—Ÿ 8©¾Ë7²|–NÍ8Jµl¼jzv½Ü…ÃJ¬TaH,VR?@*+Ëk‹øÞÚUf‰Æ–bO|`Uæ•ÀÄjsŽâ˜ò«¨ ˜Çv¥¨4»•-4¨ì ­»¶ãÉwÜrzžõUôÛÙ •.b yÛ东zóùâµ£ÏÔlÓ„HÀ)AÁÈãŠ9ÚJÆd63À‚G`r¸!Ÿ,G^¤`Ôkm¨ÜÜ0¸€¥º¨òа_Ÿ9ÎAîLv­w‚7Éqž1“MŽÐdùÍæÏÌãå2'Ðmu'†üÀ¦âdŠC $+c# {~•q4±ÊÜH‰I~IõéÏj¸-À'äw$çéMH@^çb(çl\©;’oaŒEÇáý *¹?|cŽâ¡"V2ý×Î:É"‚nÇÓÿ­Ph„‘Y?yEÈýhr|ÆLpšŠ®ÈY1·fÎ}zñôýi·J„®ÐÊWœŸÃýjijGA%–VÌR@Y ‡Ži?Ò¾G@@9Á<þt«å™÷2ŒŒú•*B…  cŽ{U] –ìŠo2HLA™ï•¶ð?Îimä2(O9KIQƒ¥<‰ ™Lw Ñvä}zÔiq|ˆm6fõX×ô¥ß ÄpQ‘²[•eü0 ýjÒ²'fN׊‡Ë’|8\°$Æžò;C½7ŒqÇãTÂA<ä¸ã±ƒË?:)­íp|òTà¦ÕlÈTÙ I“\¼jÂ#4€’ ø'ó  !bËs+dýÙôÉ£Ëhæó<¢Y†Ö~]3OpA%â8íóqKaê29­§Q"eõŽLƒRd'+; t;GøT¾\`s Q!q³<ý(æer¥¹Š ‘»g§J®—rÉ(E·•}r †÷êqSyS"ïgöà©cØv¨f·”>èð8ÈT$ÄŽß…8ÙîKò]¨“˜üÂW•I€æªË¨+–GÒ¤eS€@S“üªä_í&TþÆUi.¬£S#[ÄÛ>m¥@ úò)Åj;Ý6«1u€XKÜn`Tà~üúÓÃ\¬fSŸ7{ÈSYê°LÞT6åÆ6ŸqR¹ðd(ûçv1ôÇZnVèM“êFþUãPFHhÈ?©5>ùJ…’?Þ 3ŠˆB—oBFåeÏO¥LÀ+Ê îÿb“vamŠâs¡×aâœ÷[y•€‹.*(Q[î¼GV-Óó4ýþSà·wCŸð¨ºì]ŸpƒR°•n" OÝÞ3S}¢ ²‰—pûÃ=*96\ʤýåÀ¦O2Ãû×f8è Ønb,È=9§­Œ€jŒw"p¬°c•Áçä†5ä+›…É?4ùZ9lª÷4‚Ê«}ž¤NŠx…9d·UÞ³õ'üéYX9ÛèXò²1¼ôãšf×ÎrxÀÉ#NUz“‘Š_6=™iF9ÝÛÖ‹XLFˆ( ÆG;•!ŒUdÜOáÍ wãqêNsR w®Ò¤v¤23 ¡5fUþƒõ¨äÓ•ßsÜÜñÐ,ì¹üˆ©‘Ì`†¶qïÁÏåJI)—úÓò§{ FµC$_1aÆ>nµ––Ò©Fv`ÜœJAý 8: ä?Ú9þtˆ‘¤Ÿ @ì¼Ð›–b²´cJËÑ¥fý §!ó×!•Õº0ãÒ˜Ùp 玔‘²ç`‰Ô‚ÄqC€OÜfÚàäqùÐ<„_Ý*àŒñ¥G=º08SžåF)É‹uP˜ÆÝ1ÅÁ!K¡Èû¤RI,‰2Nx‘а+ǯLÒOo#(*I|ÛHÎ…°]°V‘n›'€§‰Ÿa=qœTæi$·Ù!$àý*ÑËÿãÕsNI&wCÀS,¯©*­ É+ãÀdŽâ‘•‘HסlsM\ž@Üü3BÔWcž€”€îõcš…¡vlùî'—)V"w. ¨õ949FÌhÊ@êšJNãm5r°±µYâH÷3«œ~•0 ‚¸ :r1R)?Ä t¥7 $£éCm’’"Š%#ÌØÛ³Œýh•$/‚ã“üª@I;–p@êS„‘’cÝÏR7fY¦…u´‚21Cƒ–Áþ•6ȘŸ$ ßó ‰7QÛ¨¢H”|¾c!<}MîJ}†É²wzdâ›5ºí) ì%FJ¨Ïê ,¶ÑÄ̤ ü¬@Í)‘ùA•ˆ‚3в‘Ù·¾eºl†Ü#cJÐÅÀ‰”î1©þS˜r@ãŽJcÈ6|›žÏÆ:­IÐr¸u1¡'§ÌP®ø%ˆçŒÒ¥¢Þùöà>y¦5£«˰-÷xÀ5:˜òÉp›×@åJç?Zìî$Þí9<?,É+!Œ‚$äÒ’ ;˜ G¹ ‡¬ ÌœÓÙ\7åOñÂñµOG‘Žn_É ÙôÍLÆî݇÷¶“×ñ§\äÈÙû§§éG0Y‘ IÿxФgŽE#C¸€°Ï ¹ëøš+/ÊmF:þ4v@¦2F:df•ÊHO'–>H鼟ʚTÆ£Ã#‚äÇÒ¦æ)E>õ¿h˜}Ý£úóÍwµ„@YAÝÐn\SŠÈØÜûyÈØGåÝÊ K2¬Ùþþ´°YÚÛåÛËÜÛ˜*îæì-‰b¶ØK ÉÏ'?΃~uÙÓ®Þô$(Î$2>GLŽ•.G$¶E+GB80ì¬ëŸElÓÚPæF˜4»S'9?Ò™åm9‰ò;åŠJ”áW°¨æÞ1œŒt£qÊé\.>U ù§oŒ’¦3ŸqLFb¿(,1ØR¬ŒãäúmvnÃ¥HÏ%þœâ«µ,†/)Y1ÁV”•ìË1´vìE=0zS ” 9ÈÈç4‰?˜ÛágÆìbœQft‰B0ZI[qކh1µfÝìzŠ­¤ËFãž*š›(ŒH„Ž€çÍX†+x@#häey¥;-Â2oB^Y úi¥&%b_Áy¥Ž8"̬qß%²)d½³Œ%ÔjO@X ÔìÍ¿Q<ÝÜ<'Ø…äR+ÇÜCdõ\楆xg¡•X¥[4ç(Ÿ 4äa•Œ«b£iJÓB¾ç=?JxÞA /°É§G8üiÍõ"ó™À*R *ºD§,>ÿýjl–Ë7ÌÒr”’[’Ž|SÒä5"eÎï˜ä{šFŒ9À$qÚ£ˆº(«àw+švå|.`õ¥Ôi¡ZÝWœöëŽE+¡EÀÏSMrÀü±qêZ K¨Œ‚5}ÇÒ3»\)êÅt‰S*Ç}…*\¡Â‰0}£˜‡˜–®ØWÿëÓ㘠]Ì3†ë@&Hêdû®Ü{ð¤ ÉË8ÇjkF] F@M'“#ãDŽ;ð¤;vC±Èúõâ—`FÞNKz C ;s1ÇáÏéHÖàŒÇÓŠ©(]Ü’lŠ~ð^C|¬Da'‚ÔIq ºk•úçŠvßa­áÈÚMçU¼ï•ó?•Oi¦Eo»ý!ßw÷€ãò­ÑG4­b½œ/{Μ¬0÷2ãÐ>?—4ÕÓÈÆë‰[·øu«TQv>TB}¡ŽR)2uw'ìÔôQv¨…죓†cŽàóŸÎ›ý›mÐ ”UŠ(æaÉ’èV Ûö±>íRG¥Yž\QíäVh¡ÊO¨¹#Ø¢‚d y¯ÏSššŠCåD?b‡°=1ŒÒˆuŸÂ¥¢€åDbÙ‰‰ç½ÝOÞ­IEdDÖ±·$ŸÀÒ¬+³`$T”S½ÂÈ(¢ŠC (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€?ÿÙÿØÿÛC     ÿÛC  ÿÀ"ÿÚ ?üfŠy˜œþu$×10I)ö#•5Z9!µŽxü äŸÖ¿TR|¶GƸ&Y‚rOz|×2±ÃËéÐzÕXß Z»hW• sÐÖ°m«ÉYÜžk9f‰f¾ù€Œ(ã°Ï©¨%µÚ£Œt¥X2e<·äÀÍ+ùD` sŸZÝÅ2îP6Œœ°8úSÖIX¶Âª@À"®Ïp¶ñy·§¹ô©7²¢ÊCM´o(0|{šËÙEè>iXÌ{i ž:i¤0s!È8#½i4Q1ÝW=Y =MW{H"Ý:¢€W·ý}óüþ”2ÕB‹©“ Œ`t¨…ˆ|ä~unu)#ùcpSó0è¥@ÎÞW˜œ¶9<{×<¢“ÔÕKMEŒ*ÙÛÓÔSM¼Y €ëWáµ7|¯µq‘…É?•UšÓç;ˆã¦OåSìì¶š¹Bâ)É^™èj.©sÁú ¥=¬™%§ZÂt–èÖÒÅW@sžÕ[¨8až;š²¶Ó¹Üžâ‰­äˆ‚vGnÕƒ§+\Óž%t…ò3øS÷$8€Ü@\÷5"ÄÒ£2ždçëÒšaU˜ç¡À8éÅ!Ý\EDÎÒ:ö" {&\8 ‘µdà1Ò¡½ÊB¥§TË€ŒÝÏQü¿Z–“Z7} —¶A2Í.2¥‚ÇúäÖ 6ð­²™p_J¹ušA,§!ÝbP§§FlT¦(d@0í’¤ö=‡øV<‰½ 9šJå(¬ã R’ǘÌ ;þ5C컦2ª•Mà¡^¸çóé[ÆhšFñ½AP ìÉãôéÇ5 F›RæIÉ€Æà¹'èx=k9ÓnÆ‘®Š‘ÙÈm^Y@20ÃsœœqéÀ¡¡H£òÎ8ÀP9«Y=Å©¸sÏÊÛ7g©ôP*ìö‘KÇ–£‚œh¶´A*žõŒxm¾b@8íš’8Ÿ”\“šÒ[1ÂãèmUíƒ>µQ¡b]K³9mšA¤cÔSâ´Éà“ë¶´¾Î„’GçK²œâ:Ò4›d:Œ±ö¹r 9ÅhAuF0y#¥d#nÕ½8¡Ð|ÄüÛ†@Õ×Jrr³9ªAt4†ß' ¿6ìž>½ý:qëKÃÆAoçPý§ øÎ?J쌬÷0jèÑ‚ý‡Î·ý¡Ö ÇkÈ™‰É'qÎsUÊŸºà}M9gGéš§Y´G"ObO=؃8iÊJqÔ% €ÈfïL¦ßu<¢ŽvŠå‰ØÆ>´Äež-«yr@x€ÁÇ®OáÖ¥Æòå+›Ý¸Ãì!W¥T¼µ2FØTDM½‹£+‡vïÍE¼©ûK>Iû¨¸ãÚ‘KãÌ“¸OjÙµfjÕµ:[¦·»PäŽy?ãW!¿ó sϵc[]DÑ žüÔ‚ú-þ šôáZÈâ;³q¤Eã$} H—D&á&ÇKÆ Ç¨©mîˆùX¨¦8Ï¿ZèU“ØÆTÝeºWa`)<³1ÍM¤S´fef$…aü\àqÔtÎ+0ÝZÛ¨!†Xtš“ΨœzÖª¬ŒÜC&”œO|æ$ç˜qŠÔH ˆ`c‘éK$qJ1Ç•ã{-.ÏIÔfb´±c޽j{[ãæ„”`v§­«FY‡ÌLŽ•Z`Raþ•ÍL~ì\åA“D›‚’*½¬ÎÑßËTÛŽJ·$ýÜ è1q³/M Iå˦^ù‹²É)$åXáH9ã¯Lg‚3ß ’{yãŸkùš§,¬²*Jp µy8Ï=ÿ¥KsÚH!óâ—(0¶UsÛ=3ô­=¦–'V eîÃó¡†á€j<‹iXÉÎKc“íì*'¼rp€ñY¹ + „! É= T.H" Yb'q<Ô¬áƒc=y¡6;"d–Txþ4énåºPŠLÊ¢mÑýå<€y=©·Ѳˆ‰PTu´SvÕ™ò¦ôCÚæSò´8é­&~vpqúVaÔ'w%‚€;(¦Ë{#®Ä`¹ëÏZÆU“ÔÕRlµy~PíRMT’æâWýã”_U<ÓÕŽwgñ¦´ÌNUxžk MÉš¨(¡ñÏ$A˜±Ryc×5b µµµTe`Í–!'Þ¨Œ­Çû\Ò9'¾1J2”V…r©h[·¹E“Η-µNÜžþµ»)#Lòqž•uÆ¿\S)?{#z‡6­f5Ôšižç‚2séMl2…3Œ*…1È L™•G5.er« ‘å*w¹ÇlwÿëRy±7 þ¾”ÖRÄ1=:qJX9^ ¬¹q%E%|Ì~4°ßJ‡`ÉÁïëUŠÇËê8¤Y·ÊqéZ*;™¸.¦¥½ëãæ8úU”¸îWJÈŽà0ÉüÀÅM çu#ÿJèU³f2¦ÞƲ¸Œñè=jX¯XFÑH8=þµ›o©@®ƒÎFsßnÞaœÊIR3qÇ­tS¨ïtÌ¥æt“FFþ~µ~-BÚUd\“»¹¬…\ýóÇ ¡¡#î±Èô˳KSiB/cbI¡†‘E4­³.ñŒù¬½®Çç§4äR )gÀ=*Ý[ô'Ùš‹tq޵BêI–rÑ\sŒéOKÉ#]«0ô×§åQ;£ÌF{‘Òœäœl˜EY‹²ÂXu>µ,„•˜Fc– j·™µ¾YWΫVÐF#2H[8â”ls°ç¸f}£’i0CŽôÉ[cîúqUÙ¤’ÀóíD¦ín¢ŒzìHe‘ØâJ^Jª” 1c’OøUnF\{õ§Éß?QÒ³Rk©§*±,—“Ád$ç©öâ¢ýá“qœõ&•f¶ÄŸ^*Z9¤Ä’D2F‘ƒ´vÍ3ËÚÙÏÒ¦hË[?…7ï‘ÒÈ J ã©Mäf)%òWÚÎQw €ÏqM$žwzÓ¨aŽ3ÔSwӰГÐÜS©#òõ£dç>Ʋ³ìjš+5ÈùÞGN•'˜º?:N;Ö?R:*f‰ûµˆv‹\«‰E0ê§´PL™NA§, Œr3LÞ¾´´®OäËÓß­X‚mÒI,~ó}9?/ƨc»¤ê¤þqœ¢K‚cÓZµ#aÇ\uö© Ô-']æážŽpk&‚5„q[êhéÅ›°¼NždD=Áȧ`?cXÖÚí¬>D2€¹ÈA­}ioìÚK†ùƒã…öÑF¤kIEncR‚r{#`Iõ÷¦ÁzqZÈu¯Ûíû£§­u{6ŒyÑZ$j–Žù©¼ÕQÁÀíŠI#EãqÍFŠ;O~jâ†Òž¢¸2ôZ`´!ZG {ž)Q8~3L2,Žv´tÍ•«°NW± Fο2wèM<¢ž‹ŸÆœÛ õö¡X cô¤¢ØÛHl;bË®~R üh ˜ÎâiÂ'9Ú£ž¹*Û•8Q×Ö­%mDäˆü†Çñ¦ù÷ ô«‰lä~ðŸÊ£hŒgæïÒ©Á29äVòÁê*7ˆŒ‚»½8«REžÀTF"O GçPáØ®x•ü–$ô”ï'³ÅNbuoÒœ°FÿÄÔ¹$ñ 'm¿¥!¶P3»õ«""ßwñ¤ì4Õ çES †=}©$ô?•]h?º:kBdïIÓaΊfþ)â)¾Kî$F9«o /%F}ê6Ê ÍD©ÅŸb¶ºðiG®\1ïûÄ~µ–À äþ5›ƒè_2Dn3”šcaÛ?J˜/8š }ç?%W2"·Òž‰袤T,yS’ÔžÆ=i(I±9#"ŠBp:P‰,Î"‹pG5Åftjåâ+£øq¾½¸±|cr{ç×ô®}íåQ–Œ»ÇJßøៈ:çŠl4O‡šUÍÞ¯¨Ü%¶ŸeeŸ5̲«D‰(’Eo†š¥^3{-ý êÇž“Švlîl|  K5â¿Þ~„þu5ﻯ³‡´½ŠR>ð'‘ôã“^¹®Á½¿Z¯{á»(#i`›ÈU=N6Ž8Ï~µìG%ÂÆ>ôO-ç5å$¢ìx޹ðgRÒ,î ’²ÌbbHOaŽOãXxjÚؘ3(ù•['éõ¯mÔ|d÷ dÕL‹æ>mÙ‹<ŒO`qòŽÜvùÔñ·ìñ­xÁÄ__è/w§Ã¨X›ûFµim¥'˹PÁwÆø%\eâ¸*åyýË/&Îêy¤Ô/+¿D|ñý’ÜFõ«žžäŸ-õâ½(|.ÓËwfñÉmmY¢`TsÕˆÏ<Ž1ž¦ŸsàÍF(…­¦:Ã$`Æê›™²$Ô÷íî+eRNí<ÆÖg7‡ª†™†i³é‘ Ê|Äõ®î_‡¾"’V ¤LS¢–^MQºð.±kµît›„fåT¡‡·¯QùÑ,¾iiÇ }£ŒKP*tzK8,#é"âî_t{Õ›?†ZÔÈÍ>‹>Þ#8 =:æìÚ­Ù XÚI]³Ï^ذ۳ö¨Íœƒ•Ÿjõ o„×âG{6\#ÆFN{ñÒ¯Ø|KÀ¬Ö3œ`Å÷³Þ®9.&§B?´èCvyÓ&' ˜úŠVÓ&N¨FÙÅ{s|!ÓÏîçµuÇÖ@vtäúU»_„sÌñ_Énª€~ñyõ ŸÒ´YVÈþÙ x<6•cƒº|žjÎ[æ^GÌxϯÏ>µ'Øúg»ŸÉçÁßø#wííƧ$_ðN?Š¥ôëVºš]sà ò—ò¼÷_:CÆ#…ZFÉàâ¾Õÿ‚ZÁ¿lßüqð¿í3ñáD~±øyãm/P‡CñþŸ=Þ© 3,äGä»!UoïYpH9¾"ƒØŒã€çŸ¯¥In$D;÷rI$±ãñÍzˆ±‘ºŒjÚGSÎyVUÕY96»²»ysçC·Hƒ÷¹¯—ÿj¯ø#§ì5û_ÝÛëÞ6øTžÖc¿’éõÿ²i·—fGg•n !Žä;1bÒ#¸9*ÊI'ê[Èlä·u’áÕ$᱌Ö:,Ö¦£Ê›¸ŒK¸ô>ÃùzWF­ZRç§'.Úó:‘åœSLø[Âðm¯üÿÃ^![Õ®¼u­YG3K.…ªø¦5´”3´½½´3ãЬ S^ÿà/ø&oì-ðkÃ:o€üû"x&÷K²º–X_ÄVT¹…¤bìÍq}çM'83 0ïÐgƒþ&q«¸àª·ÊžÔ¸dà F¡@ûÀæ¶«˜cë«T«&¼Û±œ0˜ZošIú#äoÁ à—?ü}'uÿÙVÚÚå¢l´-zÿJ²Þ(‚ÎxÓqÆ[$²’kܼû)üð?„tÏGðâÃQ±ðõü·šku½ËéÓ»gt$Ä<²€V\0UQ“^ž'XÆd|Ÿ˜7^[¶7Vé ‘÷O>Ƴž'Y%97m®Û.4hÓ~ìRù#ã?Û×þµû*~׿ ŸNøqà]À^3Ò-¦>×4 >+ w•À>]äpÆDÑnTbv™i˜7æ§Åø6Ïþ à« »ÿÍàŸ-­º¼6ZGˆÍ½ÍÓ¢ ¸âˆ9ùäP@8çþóÜ4qHTË&àOÊ­ùtÍêÖiÄ.ƒ'\Hqúðö0ök—Sä¥;dzÖßäyø¬«‹Ÿ<ãgÝh2ž<ÿ‚XÿÁHþx‚O ëÿ±G%¸†Ø\<ú.’º¨B ÏŸdò¡<¨%‡§#>#à…þ.xé>ü=ð¿¬x‹í2[7‡ô­:fdWòä£ •qµƒô'gŠþ¸b¹„€¦ÖL©-½O úÿœ×>Ÿ>Zxêçâž“ðËÃÖ¾&»]ø‰txEüàEå¨{,HØ@¯Ýà`W­3Æê«S‹íº×ñ8%ødÓ„Úû™üûþÅðBÛ+ö‡ø“„>3øVøaáûH™ïuønU‘¢-†Ž`äù—™F|Ħ膋ÿÒ~Àz (¿ñÅ+¹c¶ 5ÄÞ&¶Û¦ý«jgÓ‘úWèö•séä˳̌€ê‚µ.©°¶b°'¦çŽsœ W‘Šâ,ÓWI8¥²ŽŸð~ó¾ŽS§xó7ÜüÜ×àÛ¿ø'Åþ…6‰gâ‰:}ÿ˜fWÿ„¾d%pkBc!HÝ·h$œW¾&øñÿèþÞ¿ ¾!ÛøGàÕ­§ÄÏÜÆ²Ãâȯìô¯(“ƒÖ·eÕ—“˜üÅeÚAÜJ/š“#O¨XÅpåNÀ`ØØô ðúõ Z´ŽÊ-d@diþLg;Bg¸Þžˆ³L$îªsyKUþˆb2Œ" 8ÛÍhÏç{ãŸükþ ðÂïã'ð&‘â¡•[«ßK{t‘c‡òš$2.X.ÔÜã9Û´3ntûýR¸Ðµ)-®ì§xn­&B²C*±VFSÈ!â¿®™l-¡e¸k(÷qß\úc·¦k…ñ_ìÅû8|DñÇ‹|iû=xWÔ® SSðµ”÷/»ºY#.Øô'Šöp|kˆ§¥zj^š™æ×áÊ3w¥6½u?“÷—E´W—ÏͤŸ¡æ£¸¶ðóå¼6B¨d?»8Ü»¸Ï\g¸ÅY¶¿³§ìõÿ||4±*iÃ@µ00c¹‡—åíÁbIÈÁ=k§Ò<#¢xzÒ #ÃZ=´iVÃÉŠ×î…p¸†¼øÚ2M}__ñÀ"<7fšªþïø'áö«ÿ‚ø;ÿð^ñcö øãO„…—‡a·Å=¬ôŸ*‡T»´–?ý!Š‚ûBÄË"²€A'æÁm½kãÊüøðÂëÁív×0Ûx›YðåüÚl­„n-a”ml²œ&YA °ý1ÞiÚƒ³£j, l±Æaú‚ þ˜ªª5Hî [jR7îöó•²;7Ì2ù9¯ĸêÜœz_V¾v׿F¶OB¬ÔÞ­¶.Ÿ#ñk^ÿƒYþ9&ƒ¦]xWö’ðuÅÛÛDú¬W:Íœ¾ÄS£M$ª ?3$y@ÎN±ÿÆ~×¶Ö–>ÝÊ!,-庽O7o6üzdŒWíŦ™s±€\Ü•2´›e%ÆâÄžNOSÀè*Ο¤Aiø­"öU€(î¯Z˜qNuOþ^'ÿn¡K"Ëå´_ÞÏå“öŽý…kÙE/o¾4|ñ…ak¨Gcý»&šÍ¦ÜJç¬Wj R†íµŽxkÇî4McWÜ Ém‚§úµ]ªÝ»†ëï_×Þ»¢è^-Ñ.<;ã Úßé×ð47º~¡h“Áq¤‘¸*ëìAÃÜ~È_²Ä`Ü~Ë? ˜‘ÆÿiäãÔf+Ö£ÆÒt¹qnÿºì¿_Àá©Ã‘R½Ùy«ŸŽ?°¿üÃöyÿ‚~ÍgâïÃOxßá–¹a¨.™¨.º,õÍ:æå" $M´ÅHt8r› M¥«£ñ×üÛñóMÔR‡µ?ƒõ«7·í:î‹w¥Éçdåq¡·Û²r~QŒŸÙOü9øsðËD}á§´_XMpn$²ÐôÈm#’fURå#URåU·\"ú Úx$–ܤ7/‘ÁÚ_¯5äÏŠ3eUºUôM'eêÕÎøäx§ ¾­]~LüWð¯üÇñ]58-ü]û]xkN‚K&’îãKðÌ÷’Cp_ˆQe’$er|ÒèAÀòñÍ}-ÿ»ÿ‚"|Yÿ‚zþÓz·Æ]GöŠÒ|C¢êÞ:eÕµŽŠÖ³K;ÜÃ)Y"ÊžR¬G²$€Ïè]¥•Õ¸Á˜íçhV$··=+CJ¨È2b9Å‹ÏólUJ­KÅÈß•àhMT„,×›$H˜ Œ…ãŠz—ÈYR *Ʀ>;{úÓ%K`ü¼‘ÄraVL8ãµ>i-„à™It;äRÝWÌ$Φ[`€*×A^Õ0‰‚}ÿÀ-V|ØëùR¼»•ʈæŽ9ªÆy\’lþ&”\L£=žùȢݙÆe‡Œg!3GAk}Gî݇”&ìpCMp&Wòßn3¸8ýMJc&Ó"íÇJŽ+4RT'Ëœå8ò¥t•ÆÓl|It‹¹ˆÏ>´ö>bí'§ËÅ6Þö)m„긩 ñ|ômê+´õx¬ö4K°Ç$¨>aÔc¥Fa'ÍÃ’9çn˜§4–’WråI^qQ0a:–½›hL…`þ™üªÕì&¬,qŽ@P$1!äúãŠ"’çÌoô{€Ù{zUƒ2Åò òI¨ü—S´À\’­úR¸[]¨™ø1¢ã§'8¦I ÀÈÿdœæ£{B‘“o'–ì¹Ã ÿ^)-Á\<ñä 6p=Fê¤í¨´,9,$L¹Ôyµˆ˜¥€ÇþZÉž}¥d–%ÂåýXÍ5ôã2–k™Ç8Àþ”€‚çNŽY P@o¼¬qõÀÿõê-:ÞfI"Ø+òçš²Ö‘¤~K¯“ÿ-üßʧXw¯Ê›8ÆÑÀüÅ6ݬaeÒ4XÉà–N)ednÏ’Ümbãè*ÊG"žc·¸?ÌÕ[Ô?6õ ¢÷-À¸ïÒ…vÃK’éJ‘s±À ˜³Ÿñ¥C#†)†u8üÇò¦®¡¡’üÀK0*PÌIħiàm `zSww¹ÄöïæI' gð¢a<â6 €H2¤ =»×֜ӑáv‘ ŒŒeZ¡ŽF€(WS2áŽ3íúŒÒóßCÉm%«_¨44Öâß`K‡xÁ‘“w÷r1úÓeÔÁ`¾X9l®Çò¨¤·˜óotë"lð>œãéQ߆ Úk:;aÌ ÷}úr=¿Â’I±Ý¢ãÜÄͺ;…cŽ‚L~w¤–â6s:–ÇÊ[±ªßÙÁ”î.2¯æ”}Wýj{%s9Ý€K–ÎG©À§e¸]‰Ô·€)ã¿ÿª”ZA!3Gpß0åwä~D*$)† †VÀ? ©$¾cFr1ÉáSk ;Imy°Ó$øàJÄ`ç=FMjÍŸfŸK¹c·&hâgN½3Œþ•t y`ã Þ˜ÑÆ>Ñ廌/¯Ò¥»èÊå[‰$²¡‘XŽG#éëQ²þ÷iPF3“SÂÐõC äç?Ö”ªJ~{tb;²ŠjI"R¿R“BÊV'€ˆó÷UB=½©ÐGbïDA+úu«2-ÐlÆ€¨^0ã­..nò×9鼜 i…™–³íÜ“±'PøÓž{Áµ óUÿ„DAüNp?rEx²dO#Ÿè1O‘&Xœu>`ö4®Ç±B[K­Ùë)åGÊ®=²OôúTFÖ {›YX°,Z ôÇ>Ø­&(TJò?¼\`F2Cu1?.ß—ðïŸÒ­6•‰i2¬vBGÉv]²‚åRÃs&ïõ‘’ ò¿_J°cº*ª¹Tôÿ!K€¢)HÈp=±þ4¯}ÁBÄr^ÜÂÁ"ŠnÚ·)ÏåÍ6kC!NÄSÕ·ÍqV%|AqÀÈ‚Aüúô™’$L €õÀþ•7]‡gÜ€›—ušI¨8%ê*“ rà3±\x`ýjCmÇ,î6øÁÜ)g"„žÖ >LÆ0)ó!òݶÅ1IbêŒ0q 9˜?•1ã˜FÚ#QË; ~uvkX„`¬Gƒ÷cgó¨å‘ˆ,ëòÿ`:~š“ ä˜2‹¢b|Œzõ&¥†,Ãî°äîÎãõ>ÞÔñ$hÞX·.ÃhΠžÇV…H³¼‰Iû…ÓXôà|ß§~hº‰`’ܹ†5A´‘Ù$úê;Ý.+«…"VW©G?˜æ€níãf¼²I¸È0¦O·ryàU†Pí‘¡`HêPŒRNÏ@²hƒdvcjNN‘ïÇ4ç‚9á ,Q¿`A§}²ÒF1Çw²õRÄCs#°·ÁfdËqÇ¿ó¢ìZ\¬Öî`k2ÐËýí»üêÆ›¦¥¢ñÚñƒïÐsRÇ™,Û¤ø%Úqô"¤†(a;c<°äqG6ƒKR¡·[9Ä‘A9ä3îMM,3)ó­ŽãÝw}ãùõ¢æËO¸ùdvë…O?1í¼¨6-ãí€Ë’¦ØZÂÉÅÄ<·ÇD8çК!µfPns#’Húc¥EK&ä{¤†Pqüé’]_X)ÿMŠEéÊŸçNÍ­uԺѕ‹.åvžO¶MÏæÉ± ]½C©G ÍÄ‘í¸Nê9¤Œ¿Ì>ÆYAãä+“øõ¤¢>k¢Q>éHT`qÃàãõ§Æ\F÷¨ Ñ©H\g¶9uož ÊÞƒÔ«m» Û• +.zÒ !rˆpyÚ8þU FØ›ŒŸþºU…rÀ7¸ Ò½…b¹½¶L‡e®H#´ç’2¾`ˆ;ç¥>êÖ7Oœ 㪶 5tØLa[o\Ÿ×Ö®ñ°ìÀÝ1,y#-‘õ§¤,ÿx•'œ(5²bÆHU×o‰ÍHÒÏcÎŽJ°¥kõ«r_¹„,­“Œ±Å5ÌJ¤Èî îTÈq“éN7óÁ´‹Üq‘'µS‹$OBß"È›}Aïì1HL6ïó1 öXÿÀQÓÍóÃÓÇ_Ç¡¤I' ÐIê;¡%KfR»&@냲6apA±Äñ¦È Gh>ü y%Oâ„dÃ3ÜÉãÛš.'r´‡SeCÀ„gä–>§ðo_ÒÖr€¸ŸáqƒU綆RU$÷Œüª´ ¸Ë#/ dæ£h‰S’AÇU8þ|Scµ òå@;N)ío!i¸ìvÒ°õä¤{aPǾç<þ@Ð ~çcqœÙ¨¤µ»u$]¡„©ÓñȨ嶙eŽ@Xå~bŽ~…;+nBS%Ìoç=£•ç#pãðÍÝ»d‰”zŽCU‹k±°Âž£|€ÿZ•nµ2†(KÃg<NœÓQB»$vòA!²àJ#‚Üþõ-!±•FyŽfòЯ“}FjHË  ¹fÇvP2P×·¹’Q0Xò0éŸð#ó©eÚj)=H—r 1<þ?¨¨ïD„IÙœ†nxüÍ%¨Û¹1W@ =òÍ?Ì‹`Yˆç¨ÅEö¥ÜS 8b¤åR‰ ÌFsÛÖ¥«÷bªÂÊ aXºqH´Gt“³€?Jdƒ~â÷v`½>¸ªÆâþÎÜË=¾æ'"p?,DSÛKrÔËç’°ÜÛåç­Búuÿ›ö™±r1ø*Œ~7Òã%u-pÁ~á_ƒ[Ò&aœÏ*‚Q“øU¸N=¥ uâx©zs×üþÇŽ!^î1Ó#yþ@Õ§(£$¼&rj31;ZAƒNM.gÔ,†›I<«sŒ04ô asÏpÄÿœÓRÚXågšL‚?‡púI0bÂn d¥^âŸ%2ŠJúàÓQ` æflcq'úR3Fª@—hïqÅH‚5\cèI¤;61Þ4œ`2øÒÂcU%wLž´“ Ý\ìç¦G4Š×'î2?¶ü~¸§¸¬ÓÔ“ÍDœU¦]ßuTÐdŽ$ˆPz)¦Ðù#c2÷ÃzÖ ô”òúåòÅ%ži YGqä³4ŸÌIüèkNܱºŽ)csÊÈl~µ1µ¸º†AŽA çúÿ*©¨¶ªFDZá,]¿ ÎhV¸×Bá1•Ú²:±ä’ÊMÐÆpÓ78ÜÄšŽÎI&·-LXþƒù~µ3Ã0$ðä ౯Úý!m2*L¯lƒR"EvmRz£š¬Ðȇy›'œÀþ´·0¼q~è63Ÿ“¯è(V½®5~Åwé $÷Å80‰rçò©=µÁÂíÔÛœŸsÛô¤1^«%Vªå›õíBŠ}GvºþÅ;‰$úÓN™rû›'ýª±E+³NXö+:,cÍ“ðr?•5tèÿ®sõ5jŠ.Õ >Ü?U“û:Œ1èqV(¢ì9Q³B1½ÿ¡mUOúÆ?ï6jZ)^áʈþ̽ÜþtÃi ÿ–ô=* ‘ßæ¶ïïS¾Ê¸ÃHÇø©h ,ˆMžFî=Á¢;BŸòó#¼GøTÔPC HÐ)mÙ?IE±Û"‚}M8Æzu¬FmÐŒ:_!qæ3O¢Y­º ÀP>”†Ø “ÇlÔ´PDbÝF>cÇ©¥XQ8Q¥>ŠÈŒÚÂÇ,€Ÿ\R eSò±ÐŠ–Šȉ­#¼[êåH¶Q®y'#1ÍME…‘Sû"ÜH$‘@þréÍNmc#o ã<⤢›m‰E"c\úgœS’Q…U©²›íé4ífÚù°S+=æ½cF½·×¥n2‰´ãG>˜Ïzò:ÊYŸ{ªÓç®ÛÀZªÝ§ÙF‘˵Á9 ;c?ç5ëe3ösp{3ƒ0§Ïeº:­WÁRjjÿc&FÉÀ=«‘ñÃíWF•o°p®VBÊO¡õ¯Qðþ© &euÈïš¹¨O¤j¶/ñ¡CH5ô•°|L.ôgƒK^„ìÖ‡ÎÚ¶ŸuitÆâ%aÊAFUõö•ÌÁE]¸ºŠlF ‚O~õY i¥Î Î#“YÔŠû#‹mj%»³0UBKt¯GgòâL+ªÇ‘Píòåò´épàs)>úÕÈ£u-¹˜qüëj1{7Ø’ÖÂ6S‡UÞ°ñÁs,qJ ýþñW<…ÀãýãùW#vòYÙ™¦“ tŒpOøW£|=“ľðÝ¥½£N£\<ÆÞc8ùBž0T.xÏZõrúpž)Fq÷V¯ô_3ÏÅÊkÜ_¼ôG³øOLð÷†5;TÐ …­,¤ ö_4™ÔòÄ…8'Ž{b»Üé¶ÖÒË3*M2âT’m¼n$áÈSÈn¬N@èO5Áü?Ñ®¬4È®u3½Ù<ÄĹÉáŸ=Ï'½j[iPi—2j3êS;2ï+AûªÀäúW«›pv 6j­œe'«OD­Ùï­´>jŽwˆÂþí4ÒòÕüθøÆïN‚MgD»‰â„ w*¾â%ðØlchÎ0FNG p^.ñ4ž&½ßHQæ$ÈŠ#B1ÂŒ²óž{ÖŸ­jwníåÈ‘‚US Î7{úñ¬gWeÜH%‡5y' eùÝH¾zŸÌÕ¬¼±Y¦'¥¢ìUt*€Â¡Ho”{zTj÷q’zp»{úsVš)ÛŸ §¤{[sd~<×ѨÜäçHÌžþñ³å¯Lçw±õ[ë¿:X䈼‚ÁÛ%·vÈ®²[X„d<ÀÊ‚:ÓcÑôLƒw ‘˜sŒ…Aþ~•œèÎnÜÆ­ z´yäÓ¼€ˆ"lõÍAquªÆp°>pǽz‡…|;,ø6*;g=¥hÝx ³D¢-<;³×ôéXÿgUšº•cF/Xž¶|çò©ß/…^@ç"´ÒÞ “G4ÖŽÚ  ª~ÿË5â*(õÝB€²’FIÃ0$ø9þuÏøƒI–ÛUgÝ÷ä`ʧî¯õÏó®ám[ý¢YBGèW;Ó¥sÞ*…žûÌŽ6=HÀ9>õž.‚ö&˜zÏÚ¿g\”ݵ@ì9>Ôø­!]»g ©íÕ ‡ÏRÁA$þsô©ÞK}ѼA#f üçþ}ë‚4ÓWg_´––3â0$ÞR¸Ü{nçò¨ôMN÷KÖ‘Õ¤ŽT•šEÈÚW^ýzÕæ…â”ΙcF õÎO5“«%Õµ÷Úåc¾F,ƒÉëß5KÂÓꙤ-+Ǻ:i> jp^Ìm$…ã óÔU7âFµ<¨Q›÷€.8Ïjæ]šH„À›Ú›`PK¶YX ñ…Ïõ­áŒÄª‹Þ0xz6hö­/SÓuëfµßу*ƒ’Goóšó/ˆZÐÔ.%HU!óÎÒÈàïQéö^#º³{›K¹ lìXìéY÷÷7w+æÞ\K)S”2H[ñü+¯‹Xš 3…™Ï†Ã:›Œ´1„¢BÍ’ù˜§\ÚÁ ü·"FèBúÔ³\I*ËÅ÷ºJ¯"Ë+(g8QŽ˜ãÒ¼ F)Y#×3Õ•n!@•/·­,vñ$LmsƒÖ¬ycaD\óëÒžŒ2|½Ôw’¦¯rý£µŒÏ´ .•ã,QX0Sžµj D'Í”œçžÕ,z`E܈Xv³q‘éõâ¬[[‰äX•°Iää? !F\Þò*UMˆžÕ€ŠDfEŒðqšÐŒ¿–º–A1\ýãŒNqÏçV`L-mÛ"fuÇQŽzTžðžµ­²ƒòGþ¯í,>UÎ2þ,Lús]°¢ÔÒŠ½ÎgRñnNÖ*[è¾2ñZ%²1·„™¯'â”üÌǰßÉ{£Ýk––6"D´¶D·ŒHn>óáGsŽNf“XðîŸðïÃ7VÓ+ݘÒóPÞ@”pÂG®ç#>™¨þ[Iuâ{ma,íp€&: ò=«ÖÂ᥇­É/ŠM_ô_-ý};]U¥Ì¾¿V{~•ª7ö-±–ÞPD 2؃ߊŽêyn[Ì›A;QOëêÄÕûk«+¸ öÒÄñä¡hö•Êð@#‚N8ª³*,ì#+îRN+[Ÿyéb ˜ ÐÄRA¤DåP('Þ¦f ÔÔˆY àúRPî>i¾ ޽AiêFUNAÏ^M[–I ¾1è*µÝÓB ¨<ÔIF("æôdEg#8ÍgD¯)ÚGÍž”j̱')Ç'vJåeø—¥X]ÈÒÌ2­µI=O×·ò®:¸Š4šsv;(Ñ«5h«ÕŒf<“Žœšn¡®ZÚ O¶€矙‚}?­y¿ûF^Åy:E´Ç/æyŒäv8ÀQÿ}W9}ñk^ÔIÜ2É#3o ´©céÓW—W?ÀÓºNç¡ “&œì»rÅKyí’9úSžHÑ‹© Ò;½„¤\É…Çôï]IµDM°Æ»±ò’¹Á¡ôse%º²©• RT¹õì=óJ¶ž›‰Q¯É.c…ašÖ48PAcß ÈÓeEVýÚò:SŒV6¨ÞClC—ã´ëi|ø<ݪ¥yk¤^çmÓM­‚kÙ|”…§b£;W¨×¥í™JUUÜÎr¦Ž«î( yÿ»Œª•µ½Ä•Š’ÛN‹çŽÎíŽA,rð‘ÇŸÃ5¤âG_(ÈÛÈ\ð F±*0;:ÎTã&h¤ÑB8&`]ã ócžæ¤‚ÕÜfÚ­H`qµG#½U$iÁÈê9bŸqóJZ!êñÂß4|§9#îÿ…hivvš„«pkÊv– >­Ð~>•˜>Ѩb¶VrÜmJÛÓµ;_IýŸ6ΤjÃ!8d$çzs¸.FN3ÓJRŒgÍ/‡õì)ÆMY=KNš…#kýQ‹Ëp ZX £OœáØœ$ žœuíuÝZHŸXb[™NÔò×jÃP"®ééž9ä’[ý—s¬kRßkZ£\Üͨ’✎˜;²vcÅTÔõh¼-TÅ•òÔr½°*ÕÔœ}öùWD¿7çù¨ÇáJï«ý Cĺ¬:¤¥õ×ÛÞ@è/¤y}>ð8ã 5ÞüšòÿV½ñÍ¢Hò3Ȳ»¡Ëe°ª?{¾:÷Æ+Ê!{ÍRíllàß$ƒåµ{ÇÃÝøkIK5´0•·E Ì’F]Ž=Xþ‚½ –3­ŠRè¿3‡5’§†åêÎÆ ˆÖÝ-ʪ,cäE\(à«6À\K¶5$÷¬«s¹¶°Å^³º{S¹XdŽõö°qв>Jqo^¦ˆ³9;v¨Ú=§ëK6½†(g°†=±©bÇõbj$Ô-§’=3V¥¦¦IIn9›°¬ýGQµ¶RÒŽËÐU‹ÝsHÓÆû›´\¶,¯øW™üJø­áKËôí3P¹V ÐϱÁÉ-ÜörsÒ¹1xÊjnR’¿k˜\%lDÒŠeo‰ô½3ÎÑ´Vu·.FÈN}þó¸éë^-©jw±šæIA$åÛ9'¿ò¥Ô5/¶Ü4Òºòs•éUd–1·šüß0Ì*ãª9Iè¶>„‚Š^¬ ̃¿éIö¦fcùSzÒ`g8¯)M¶GktÒ¨ €@žÜóóÞüQÛÅqö…f-ÉvP7sŒòzð+ÓRf¸hãÎâ£'×Ûô«òjN±*!RÌ@û§=ÿÏ­tBpq»0œ&™‰ªi+L"ùDŒê«!Ë0}ùÍÚØ g1䌷BzW ³E«[Cm+l|Ò±^×ô®WYÓ9þÕl–ØÁ=9¯;†WS‰Ù‡¬Ýâ÷(EË–Q\ÔÍ¥¸E`ß6~`lUˆl¼¦A+àÇJ±+÷#·JÂ4¢–¨ÙÔ} -ÕÈhÙGbGQM`Xð;sšÒù’wÀ[œÔ7Zyu%ꨨÔLÍhÕßåzqNûR¹çŒš°læQÂ}6ý Òì^÷Q%B•TŒšÅÓåMËD®íÍ_Á£iºÃëšä‰–š‚{–)¹›0¨¹cÏqГÀÈâ®5‹ÿø†÷ÄÒDb7WvTÁ 9;r~µÑi ÿ ?‚nоTÆiÝc,̇äH‹ m$œç<:5(ô¸c…¡µÌ{°IïôúVT«ÆºGVúü¶7¦ãEÊÿÓäŒï=Ã3BÍÔ2gÇ,· mkºVÚªR}«Etrî^FQÇË´Mg݇´¸H3Œ)Æ3\󌢮Í!$Ý¢o|9ºÒ´|kzÖ«­¨Ê37?tÔ~k×|=ãí3[ )Ù[‘&Í þô¯›7’ìÅâºí'â}ï‡ôÁ§i2J”,³¼¤øcÜþB½¯7Ž.2Ò?‹gc–ýfÒZËò>ŠŠêÞÞ3#¸ZŽã^°µŒ½ÍÌh]Î+ç‹ÿŒ^5º‘d]eþQò€¸Ç9íÖ²/쀴ê(EtyToqIÇçDWŒÇ“ÓÚ¨ï)*p{Æ)ÁŸq‘œ“Ü“^š¨ï¡É*hÚ´œ³Æà;nÅ$Ó,7Q]íee•AñƒÏäk6ÚìÂFðÛsÏjÒÅœð©‚"(zç×5ÙóÆÉœò,‹6Ú“;Á»9•Tð9â´ »I0AçÐÖ WÜc 'áV’uS”qŸc[Ò¯$¬Ì§It6RWŠA$XÚ§ß öÇáWínш Üç;I?ÓšÁµ¼VÄS©Ã£¨«Oì$‡ä8Ãp#]”꣚t›F®›¨¤7M rüàÈô«¦›õ›º€ŸpŽÄV8óÝÚHѲ£¹ëü«FÃQuS(m„¾§N3þz×M9óÅÂF2,”¢Q²´y ü”P­õ©…ŠÈÛ%Œž ÷n I×v ]]$“ 6ž8ùx±òñR$R /§4Fžš s»0ã ²Ùº0xø}ÉÈ}²?Hñ’Ûe;Š»â?˹]Z8hÂÌð1Ñòüª%gˆK·Û¯éXºrŒ¹Y§4]¤ˆD!†ôâ¹OˆmsöukyE†[?¥v–°>6ç<Óu}ÓX‰ ¸A±—Î?Ybp“¯‡q‹³4ÃÖ*ÊL«àxm.ü A ã.p®p$w<~•BçNžÒôGpavœ3󰧦qœgè2j…­¶·à¹Ž›­ZÈ- f9Ó%= ô=ðjÅÄ*Ò}¥J·š7nG Á'äzW4k'J1q´££:%MƤ¤âõ$›fœ W6Îxç Á¾–ÖþãÎxåUNŒ 3ÔV´“ÈUÚã3±ˆ¤O,­û¾8ã=¥g5šä´<®ysëÞ¹±¢¨¥vs÷0IÁ…ºusM1`1»8>µ±ql‘JlpN3ƒéUg´72>Ôáyb9À¯*t\v;£U;·(¥§ÜÛ˜(3Æ*0à•s´âìËÒ×CdË 'ãO€ÉëKHǿÂER¡¢0Ìp[9éLl;céNÎ×¢2Ȱ«rÇŽ)¬[pêjkhŠH%QŒŽ)Å] ½‘x=W‘ïN°èYXÁ9çZU·/Ôgë^Œiêq¹&E䀜UË9œ2ÆÆNj! º„T–ö®_ŽÕ´"Ó"N6#ºYn®p< §8ǵ>Ú ØUÀ~£ñ#ËÖžÆXÿw¸ôè ZJ÷ds;Xž61º±#¹§£~ü˸gÉnqQG¹ñ¼Ôµªv!«š·Ï,n‚å—w*¶7äOÖ§·œaÒ#½Tã%Hàsϡⲭeò$ß“‚0Fzжu–Ø<$¶HIÉ_O ®ºut½Ì'–4¬ï¤iü«„-æ°ßAí×5½cåOl^ŠpvkŽ´¾7¹ŽXñÕ["¶4«émdij¤`î>õÛ‡®¯®Ç%zNÞfÝżWVÆä# »šÆòO•£”“HDgÐvϽi›ïôBñ09©Î3Ç®*•È*Vgûºjò»5¹•>etöŠª>Pyïšx…¤]ÃÒ„„‡—(|.HSœU»H7D‡>†¦0a)ö$°ŽÈÚÊž Ód¸¶ŸäO/¹ç=«—¹ðî§j‚MÖEYI(ðÌO¸Wggé÷˜·±P76IE8€äþgëUî<5mqz/æY‹DTãÍ]\7µIÛTE*ü’zîr2xfáÁy@¤’ÜzcŸQTÃå – ÉÆC+´íë]ø¶‰ciD$Òìø'ävä’?úÕ^KIcŠH¾Ê‡¬¡@RsÓ¡ý+šx=N˜bÜt8hô„[ÃöæE`§½øâ¨Þøjüß‹ãfíCûù$*ƒ÷ ÁŸÒ½hÂfÍÈTŠ5-4‘&‰=yù@ü*¤úeõ“-îcxÝäw*錂@ n}§5\¹rSÆZ_™æ×vÖ›ÏÙ¤ =j¹±AÜ3éÅwڧó{iÿéJä»À #'Q„àîCëÅaj5K%o±Ú\Ÿ,fap„mäž0Ö¼ªØ DùnwÒÅÒ’ÜåfÓÊI¶&È<ÔWÉüÃñ®†;4ûû¨ÎòáTõ+8$Pm¤Ìd`qï\0¶Î¨WMØÉ#4, 1Ä`džµz"ØîLØØpËÆÓïíSCáÝBÖežÞáAQ•oéŠÊ8jísGR ©F=6ê']ëò“Ëg#×­K=›…" 'ŠÕ¹ÓKD³3¾òrêÏO·ãT¤‚îG"Þ"Xqí[º<ŠÖ3Uy¤T‘¢UÅs…zŸoZµžbWuÁ#5nÞÑ™–;ÛÌG\co¾i%Ò.­Ü´wœ$}N*£FI^Äʤ^›X¶GîÉϵY·°ù°Ñ=kÒÇÁ½RÑ O¦9Ú2¼®Iî?ýjɾðmüvÍ7ØØ$k¼”ŒýÎ@$‘КúG•U¤•Ñâ,ÆŒô‹9_ì»bŸ>zzÔo¥A‚c”¯væº_øE¦l#H¾fsäƒó(÷Áák™UvFû¨÷ô¥õIÿ(Ö"?Ìr·1 ób€Kw4ÓlIÈÍtÏá{ K˜NÀq¹—ƒô¨åðãC•uÁŠÅà§}"ÎtC³øçÚœ"“û¹ü+r] ãQ¹0ON*#¤È%ò¡/ (ô-W‹23’¿‘«~øËÅIܧ•¢úC§Þô¤]6áyòðsU<“½„ëEõ)ÚA¬¥”dcÀ«Š¸\°.7(=Hõ§9É.yíRý„ðÍ’qÞõk Rµ’2”Ô„´Ôs+ïQ’3ÉßJ²gŽh˜"-ÜØÚÇ¡¨$Óp?sדH¶Ó¢íÝqZ§R:2ƒÕnZ‚W³U û¹ñÜÖͶ£eslËj™páIç¦G¶qšÃ…%q†^}Í>8äV/Ì„®S€EtS©Êa:jGJu… 6öÈ® rG ûþyüª g’wýû“€: Èwˆ4™9#qÇÿZž÷Ó°Ø»@Ú,9Ïé[:ÊZ6d¨ÛbýÅã1TXðGÜãÓêO¶9¨nu —€Å Á‰Ž7•À½ÔŒþ•TOsÔv©•Fh ‹Ë¨Û±ÚZ…<2ž§Ü“Àâ©´–òÌoYâ‘×/ÞF›O§lÎsšJGPÀc€á° ã×k7QÏt\`¢hÿjÛ‹ËT–ï&æ’Hòlä0py­ ^“4k$&<͇ ztà’=yöÍs›–DË }hŒ‹v[ˆß  0<®*Õy%b¶™¤Öf§¾ÜÜ@äøÂüƒ¨BWŽ=³Ö¡Ö>h7Ö!o#Še¼ËHJç9?x<œÕ7O+ÍÑWqó¸cÏ×U±¬ßÁ³7dG&ŒÛŽç·-P©N^Ú2N21Sá4ñ]gO¹ŠêØ‘‚ÿ».§+‘ßö¬è<5%½ãYLÞBFìJ\8Vd_½µ¹rrp:W[g«Ã£YìŠþ'$²¤pʬ¥±ßnqõÁJuïˆlµ}0G.“›?)”gËRrH#ßLzæ¹gƒÂ¸§OGÛs¢œC•¦®»œaÑu8Ýbî¬H@Œ8$qÇ\ ¯A ) }㎦ºf’h—eœÑºg+ üž„c~z ÷ð2MU°}"ÂÿÈž6p +–8Gr7ž™8®Ya¡t¯c¡V•»˜¥Xm95˜˜n"¸ƒ1þêD•B–éÀ#ÜÌUoø@¼ ¤‡ŸR¸d@T+Ír½y9%»œÖ¿­-oö>ý–íè¾èßð%ä8ˆ-k_ÑjÿùVoøSSMž›xñÎÓ(\÷ÀÆGãëVgø{á;Vn Éó$(%g'Ž>µú}ûJÿÁ¿à¬?´çíG®xÛâ.‹ðáäÕ7I‰ô™íôí2ë“&Ï*Þ?™—re¸Œ³ã +¢¾zý¸¿à’?µìðÿKø©ñ¸ø^âÇW×K¶“BÕ¥¹xæ0É0Ü ¥"~AÎ{w¯¥ÂfYf'–ðö’èþKEøêxøŒ.aE95.EÕþ{³äÔðGƒbR×’¸ Ý%T;¶§îž‡Ÿq‘‘œŠøCEûE¼€ó/hÚùÅmÞé÷bäf"ËŽ1Ï>”6Ÿ{ ö¬7@Ç­zÎŒ/¬NZª·¼q“|:3ÜHÐÍ÷œ“œ2z¥A7ÃQ7,%u÷I(Þ3þÏ\{×t4û†|¼g¥Ke¦Ïe0¹–7Dld@lÿ?þµeõ*2èmõê±[£Ìµk6H{ Ç1Cγ~ÄÄíò˜ÔÕí‹3ŸºG_JÅñƒ4­t›”Ä…ä_•ùî?µ•\¹%îÒÌ]í4ybYl9 zö$z~z€>µ³©i Ä[ Häû}{TÆl}ÚàtZ–§r«utQšÒIÐZÍ<†0W…‘€éÅv¿ txNñG„¼m§_ëzòé2x28¦þÔGxËÃ:&Í“Bì­cfd}”yˆO2Ð2±v¡#–9±ÈQ”åJö52ƒ[™qšê&µá›ýS¸Ðµ}2m>þÊåíïm. )%¼ÈJ¼r#a‘*@ ðFj„úmÜQÐ7ɽZ2#ú~=+^×Y¾ìúÖ¬ü—W&âöKõižáóÔüËÏ¿Së[ŸüWðçÄþ'“PøYð÷RðÖ‘ýoöf§­¦£,×C"â_5a‡dm‘¶=¬T. 6r3ÒéI;¾Û]†œµ³Óñ8im%Œì(•#Y0‹•;3ÎùÍtº{øbá[¸$!XY",¾^@÷¨n£ÓS[-äa™™£ùLk»`œ Ø­}‚H•YßcØ©_ʨßÏ#Iä:Ÿ”üÃ;bµõkhl8¢Ô ¸iG&Ý‰ÙÆyãþ¸ª÷WÝB‹¨Æ]Ô“æ…ýãþÐûßç\•i«êtBWiØÍ†6™ÂƧØZ’[QI`ØÇz`‰¶be(ÝÆ×…$²Þ鎟k…‚Hr7¼;àô?ZÅY+³gy;&4)VÙÈ?Z$•æO-Üœ‚4åŒßÊþZmÊéM–ßìÌ¡Ü9l–aõïSiZëb®¯a‘ÛÄ…š& ²à•8¥†KË& is&âIÛ#ÜdñÿÖ¡“ +·êj摤½ýô0I·M¬ŒØÏ·ãJ0”¢¬)4£voK M@Xc¨ó9_Æ”ZIfŽæ_»÷XäSþÎ#y2;vÅUxîÖäá”/©8¯Ì§Ôz“çËùY÷`dÅ7í çî:Ÿö²*;xîY™¸@˜Çñ§™ ¹\F6ޤf›ˆõ·¨ÛåÛLGñf3ýµ­ÖGÝÊœçëR0rŠUÔ¼.AýE1Õ†" 3Ç ©º 6eëz Î¥l ·¼xÎ씎sž>µƒ®­åigº,ÁJ„6sêÿ[üzé,âŸà^9ÆóÅV–*ÕIJ¬J­ò’x$ýI­©×”U‘”©¦îswQßivfkxe “˜ÌXa×îÎ~•Çøá7Šº’j_>øcÄ—VÉ‹kwÃv÷NªNphÉ dÆ;öô«>Êþ"ÖÓ»ª…‰gúÕ“‡¯”!6ª©»–#æõæ_sù{×E:‘ôfRŒ•=ƒövýš5¶Xýš<{•°µ°k¿ YJ-#î"@Èv&çc…É<y—ÄŸ²Ÿì¡ãˆ?²£µGyˆoŒ­kë‰3ÛŒ÷ÀÈÿëóНk%5ÊÚk³böiÇU‘æº/ìûé« ²×ÕXá ²bU|Г÷@{{š­ñ‡öýŒ¾;ø^OüJý›|-y§Ï`-â×JŽÒæÞ5Mˆ ¸RXJ)ÂleÚ:b½SûkK¯yuºDŒåq•o¡¦Ç«éío¬ÏšøP%ûÇ®8柶¬åÍÌïÞìŸg­eécóâ‡ü ðÅ&]Cà—íC¬ø_Gò#Ž/^Ð#Õ¤2>aYÖx>R¸J±S’Iàÿþ mñž¥­ý—ö¥ÒµK¡LÞ”iZK.§Ý%Ì{¦U€s–Gg8áW<~»Ci¨M/—ð„o˜7Uaõ*Í¥®±åŠH¹É@ÀõÎâO½zqâ<ê”mÿzOñµÎ)dùtÝÝ-|®çÃãçüKÿðQ¶_†Ö¾ø… ò,^ñ 63Ù¶æ›ûE­ÑãáGÈŲÃä -~Ò?ðNßÚÏöT†êÿãÀïizu¦¨lfÖ¥Ò&ûÿ8Ä’ Âùf7` 6ï˜:ñ“Šþ®nnn!A+,¨*¹'aŠËñ xÇI“Ã>(ðž­¦j#ìz•Ž¡¦ùÖóBÙÜ®…e8Á òóÏ{hqf:“½hFkî×ÈÆ¦K‡Ÿ»M¸¿½ÇÍe¿wŸí‰i#FV^@äP{V]Þskrñ\ÛÉåB‚CÇÝÏ'5ýüxÿƒo?cÿŒßo¾&/įxy¯Û}ÆŸ¢A¥[Z#d‘åE¢$`.{d’ÌÆ¾{ø¹ÿÊMk¯uðGö··¸»#mAñO†J›§ ™æ^Á;lÜ|Ö@¶í´lV9ëé(ñ.I^1擃ëtí÷£Ç©•æ”›´T—MRüÏÅFÓ9#¹šaÒ˜dŸAšý>ðOü¥û~øÓKÕ5é¾ ðä–7ÓÚÁ³¯yx”$ÈÖñÊ«€ä*Ãi ŠqUüWÿãÿÁEü-á{SFð¿õ¹QUaÓ´¯¢ÜO¹¶üu1ŒOÍ"ð2pö–KÍo¬Gï0T3$µ£#ó{  9‘qžÕVîÚ+…1̃â¾åøÏÿAÿ‚‚|.[+][ö{ÖõëýBãð»êkf£nò@†$³ª¢ÈX˜ÜãnÖo’üKðÞ}#ÄWþ’gŽ÷IÔ$°Õ­Êeìîb%%†U«#«1Á«„ð¸•û™Æ^¥V—ñ"ãê™ÃKmd–²ÇidRf@±È\œG8·ëQ>âà%º,J£3Œ1=ù=«sYðÕæ‘Úy’.7:º ôME¦Äæe—È£»ŒŠN•åË#EWݼLK Hörj g¥dê6J‹4ò:FÙw´ãW Ks¼Þ\dE&0˜”gðݺ±ïôDHÈ~¬Çk(Æ**á"Ö†”±-=N5|Øç$Ú£õãô"¦ŒÊò‘’‡OzÜ›BÌk ÚJôïý*«xjà—2‰ƒAyg` ýk‹êõ ìµ:½¼$Œ¹Ô¤® î9åz…n¤ƒ{Á…‘Õ@98w×­Oi39Xи I8î ~£Ò§‡ÂzíèÿGÓer –P‡*=O±õ¬}IKÝLÓž¼Ïíí.ã¡vÚYÕÈ0Ã?^´+I+3,R®GF^1þ5zuømòê’²ÿ²©ô¨Í£ÅrÒ­Ì‘ƒÐc ?Ò¿/VèÏ«ùÎæ(Ähç'£cüâ›lÓ,‚iö2ù_nâsN·`•§fħǎô mŒC+°Ý‘¸n­Ö°-5KœÅ1Áä‘r}¹§yÑ¢•Ž?1€É^þTõ ™UL0…Bßfg,Á–Oº[ç"–ŒIÙ„7ðÜÎУÂYórTŸÈÔn‘@LÂ(ÈVÆí€ìúf£ºÓlPŠøjÈ ••ا×Óùuè*E¿_5ÖtRÃæF\6Iã·JÑ£4ÒÜWtB8$†Te'Ë(u8ÙÔ{J.,"1ì·H6ça€õ 05dÙiò\ îÞà ®x$däg½!Ò`÷‘ÎûVBÛr[óƒÔ}*9‘|·)Í­¼y‡Q¤#— ïÂã]Òٟ̇X‚8ã£Æ€ÝÛû¼ñÚ´î!µiÎ ì8U#×Ö«$^h[ÆY8*ÌAÏû¤U©+ÕŠ¯¸´F&ÍœcƒÇ ®[â¯Å5øSg©q,òÂdòžÖ' ;@|ylN:cpž§ج æ¾´C‚9 c*sõãëíQêšE¾»k$:¦›mqH îHÈ`Ø#8ÝMTeeήˆ³qºvg àÚ¯á÷a[M?N¿·‘Ы›Ø6B¯œÞ õ'®1ʺ¹`_K§¦]Å9·uŽhâÔ•´ HÝÔá°q‘‘œÕïøAŒ1€Ïj– )­~k‰c‘Øyp3B Ûr9#¦yÉÚ=*]VãP‡76”™ÓvH'ý¡´{óTµkíMÒd×o5;x–2I’fTD빸?(ûÙ#±¡-.6õ±š~$ma.™ov^ybžs¸á—K(bHÚ0kÄþ:þÅ¿±_ÄŸ ¯ƒüiû øfþØÂšt6úG†¬­î,#"¬.¾[ @äåFHè_Û7 â }M7P„êDDºî“m±À6eA%H ûûBŒÃ’D·^ñ"êpZËá >ïG´™Ùîµ}I¤’*Ax¢È$82¸Äv¹\ã´J3S‹i÷NÆ2P«“]™ù§ûDÁ¾ß°ç4`ÿ¾+x‡áÝÿ”.–+ûfÕ#µŒdù$twXÁ-¸K´„r†+ùïÿý‹¿eÙ¦ÓÃÚ·ìÑûQxCℚm­ŸŠt}/[Š}N×TòÜËwqŸøôpª±B~lä‘úãûzÁE¿dߨ“¾'ðæ¸÷þ?ñ5èšÞ/†¤ISÆÊéºæiálZe¤]ÃÍF'Ë '—òþk$Õ|Yã]oÆwšiÖõ‹›ôÒ,`)kb%•¤DÚ‘ }Š£ ; û®y¦.º«V¤¹VͤïÝ>§ÌæñÁa©rÂ*ý¯·c×4 NK.ÎV¦DpÉŠÀŽ™Ï^I<~(]i÷¯lfû² Cª’ \îÔŒ޼Wq%§›‰n¹QØS§´Ž[4‚ícp£0ÈQèjû©a—sæÖ)¤®?þÂŒhöì_õdŒ þ•\].Úê4´¹º·‚8\21ŒÍœ3’ÇÿZºãh`¸mF+a,æ$@X€ãŽ3À>Ã\}GÃs‹" ò¾O–í>Óƒ#vUç ª;c“YKÉesXb¹ä®ìqñhz †æ¶Ï%Ï*÷«…p{*œü tô©4]A­ŠI<î®ß*[´ØÉÎ3Œ÷•¡§ø=âÈp÷íÆsíëÅa ,ÓVV7ž*š“¹ý“ˆÝOß?‰¥+9äÍÇû"˜ —Ã’iëPB9Zü,ý!%‰Á\÷)™8\Ž*£=ä24±AŒ8ˆcô«6¥¤‹‚1ò¸þ¼ÓjÚ…ï ×Šb@ŽdPz/¿çP¬3!A{ÇwÉVÜ)òó‘Ô¨"„·ûª@n¡PŸåO™­‡ËÜ¡6—tü5ÜA3ÀxóOJd–z©xâY-¸é‰8õ­O©ÙZJ|õ ”ïŽ@íƒÍ5um1¡.—£8䎿…UçmHåØjÑÈÒJ` · _ø}NTþCó«Im>ðâulŒ09<{b…“ÍŒM]¤Ÿ3 Oòiëu(.½{ªŸåÍ+·ÐjÈiV@co”àícÐþ4È4ÀT³´}!€{RÍulÀmŒ:ƒ‚w—Ö¡ia¶›w”€3å¨8‘=èW¶€ìX†ØFþZHÌÝw3‚3ôÍ4Êê¦â$ d‚1º™ö|D#Û v\ƒäã#ò8…W[¢‚ã8RÖádö*NÒùÁ¨f'‚‡Ó°'½ÝY´Œ^6ŒÆ0ï,{Aüp9«R¹òØÁp:zþxª«o%˱D<4°ò?ÏÖ©4÷'Þ¾ƒ ÍÀµÌ,26àà±>ƒúT3j:Fº;²"b"GäûásÆ;ã½0ë æÚÙâ‹ K䀲q÷rIÈÎFÞ¢ª<–þ|vZž—4rHÄyà×99 {c®)î· _NÓ¢k¤¹˜¢‚ÌR\*ã¾N=º{W'/޼y-Ä©§höiè&•5 ìÚÀ«‘†‘$“`eˉ xP:9l/Oo¯¶›¨Éeq¤^Ån!FQs ·”ÿ"írÀ€ ’À/θ9 ·Àÿà£ËñÃÇ?±Wüû4höº‡‰õ_ÙÁim+É,ðœ8ˆÅ(œ¡R‘¾Õf!K¨ù«JpUj(­/Õ‘6éØö¨ÿ‚†þÆÿ³v™ioûQüSÑtÂö0]ÛØÀ¯ªÏ;’¬6Ë#ºné)‹gvdÈÏÀ?àä/„K¬M↳Á¦Ïìrxš]"îþÄ©1J;H\™b6–c’EV¯Ì¿|^ý¦l"Ô| ñ;㎞hKYëšF»âkÇù—ä’âi6± ÊÙîu®;R×ïïî¿´u{¶¸˜F«L(Ú¨€1Óó¯Ñ0!B•ys/'§åúŸ#Šâ ’MSV~k_òü·üSÿþÜZÌÞ$²ø]¢h~ÒuI$Oö”rjº†š¬ 6ÙîHŽCœ Xë°±fo Ó¿à£ÿðPK?]øé?kŸjÝÅ$RK'ˆ¦ò–7(䢎ªC‚¡p1æÚŸÁÿŒš_€âø©¯ü-ñ%—†§Th5ëÍâ)UÈ VvAdœ 1ÏjåÛRS§[[Xį2²]X„\îPl¯'¦8êkèèeù5(¸Ó§ÑìþóÆž+1©+ÊmuêM¿ý©~-øƒFñµŸÄ§Ñüi«x÷NKMcÅ>.ÑâÔ5ktW. ­Ü£}¹ÉÚqÀã®|ÂÆÆÚÂ×ìþsœÁrHà ûqúÓ•®¦›de“O–;˜\G-´ªXã>þ+У‡Âáÿ…ö9ªUÄUøäß©$RÇ¿”=:°Í f•Ëy`È-š|¶wPìMŒwqz}ižtFãìÂþ"àãb·=¸?˜üë~eÕœíŠÑÊÜKp?ÃLha. ]:3;gØf¦VÓ#d眞ÔÀ¶’Ǽ/ ÿúªÃR²^ØÂ$tÙ€ùƒ’ßà)ÑßêYÈ£;‡ÌŠHÇ|f§ˆÚ¬e„„ ð6àšîíÒq”Äöl`¦k%§RÕ»Ø<‹+ác» 1QyüÏ¥Š’¢2¹'pÏãUà†(£òᙉ’ëÈý8y†çs".Ñ€L‡ŸnE=Zû®óã=M1äÞbF>_E gò¡$„ÝĶÓm¾n¹#2ò·éŠ’Y-aMó£ñÿתÓOqur·Ñj—x…‰h<ÒÏ¡·µ_šmDCµ#E%~Så–ëÒ†­³QßÚKä}¢ ÇþYîäþi²Mc嬬¥yèN*®¯m€ó …à¢Ïì$ÿ?¥E{u1·.beHËlP >Ã8Å5…˱ÆÅq2 ÆTÈÒ4¡¢`îF΄!Žkê·+5ŵòF©¹Ló¢ÎFë“ÓžÜâªM¬¿ˆ-#³³ñmÍ…å»±qfÖóÊ¿)P[*Ã;€Û“MA±9G©Ð,q(hãµi#lʪpyãÔÔ:•ݼvÕÒÔ`GæN ž pNq\|ú·‰ã–ãLÒu}_P¸²–&’]ZÖH— …U£Š$rH,~ö Ð(¼+ªêZ„RǦÜÛ˜™¡ûýåóáP’­sQœnÔö¼åiêB’{ˆÿf_†é©I­ø†öîkÙ/5“];‘ùm¦:yh®@ûÄZ’ø;ÆÖè6Ÿ ô©4[}7P’v†óS‘Ræ&E³aŒgvA+•*û¤7£hw>†w´ÐôÛA+Hè[FŠÊBØûØ9úf®ÝÞ}… ¾#Uù¾L¨öáM¶Õšb“ºgË¿?àœ_ ÿkO_ÜþÐ<ö“\F‹|Éq>­,@¨b—qÍÙ†åP Äÿ󧈿àÚØîÏW¶¸ð-Ïl¡ŽC%ËÝxšÒGSŸ”­RAù¿xzqƒšý*ŒÞóu¨@e y`qŽr?ýi×Z…‚FÆââ†ÀÞ ©×é]t3à ZU]“ÐÆ¦ QÞpMú#ç߀Ÿ±G‚þ øk>+ñ½¥UµKÖ’Èà ¨ãå¶·RÛŽY·ä}æ-ÔÁûþÇ×væßÙ—À.ÀŸ3o…ìÉÏ?3€±ïž¦½J+É®ßí6q¬‘Ša(xîH?þª›n•z0·Ü!²bGrF e*õÜ®äî\iRJÉ#øsû8|ø_¬ü8ø=à¿ß°hÒÿGðµ­¤Å7&øÕX‚Fqœ{q]W‰|á¿iwñU…†§c{Ås¦ßÚ¤M 24oÊGA4zL“EæùÈ}7JÜß_Ê™˜ö²n¹`|¬’=½«7)Ê\ÜÚþ â£rèy¥Ïìyû(G)·oÙ;À[|²Xzq˜xª×±ì{¨Ú½¦§û/ü>‘dŒ Ãx.ÉCqÏ+â½^>T]Ò:È –iø÷5 ´E»óÚä’§;£>ƒ8½khbk¯¶þöféRjü«î>|ðK/ø'ÿ6ð~Ç_ÑW!¾Ïḑ±Œuÿ‘é^wâ_ø Oü+ÅQêÒÛü ¹Ó/õ+ ôïj)öWpFè"{†‚=§žYAŒmÇödVí Ü7/;¸`1O{¥B»×$œe#'÷ÏJéŽi˜Á{•¤¾oüÌ/Šš$~güRÿƒcÿeýÃbÛá7ÅøoWB ßjñAª@FFåhU`n™ÁYç¯-Ö¿àÖEfÏ¢þØöW7^K›hï¾´¼£”Fq|åT÷`¬Gen•û .cîF$žG øk;Çž2> ð>­ã¯ì[ÝV=Mžõ´í.2êäF…ü¨“øäm¸UîHÛO‰óÊK•U4ŸæŽYä¹]I_“îm~GC0h†G 0èiÏŒºn8àS°*r:výiŽŠæí虯šIw=äÚèGåÛÄØÙ,C9ûc?Ò§NÙ#‘°;3ZŠ!j8•NOBp1ŸÂ–uº,jÛy8 Ïõ¦À™$Gcˆc¡ÛÖ›, $xf(O€žjbyw¸'ëNÛ"·œ!b3Œíä{òhåî+ZI Ì—{‰DR[ùS#µu6YÎá’§aÀö§­Ýɺ ËŽüFŽÞBÎûqŠh^ïAÊe†2±R3ùõ¨ÚÂÐÎ&w•ðF¹¦Th@hä8þ%Ø)Ò^•”lÛqà?JwÐhlr‘¹ÄµHãèiÑ]#¡ d$óÌL?¥E-ÊÌB†R¸ù”ÿ>*¼–RÃpÖúæ%Ü ¦C)ÿ¾ù†(²ê} ÒJQsœ`m5Fiïgµ½œ­´`þëi>Ùb?0jXf½ž&âȬd|³Å(#ñ˜©üùbvË,v‘ŸÇ4•ÓkjQ3^J6.—4drXëíÏõ®{[ð׈ej1jw(À¹ŽÉçP®HÇ$7LàwÔƒÔÇ©³1Škf‹ Ò²€Äö'5JãKÓ§¹7·W;FÓÎGb23Ï5¤fâg(©-+IÖ`ë’2U|Rì/†Üêí´­ÂÖ;.JZ0öêHþô†)&¾°ÒÕ×O¸²I†+tFT?O—¨$/þéü9¸¼gá½+ÃwZ¥Î§¦\ªìš%ÐX‘ÌR2KaY™ÈÇ-Œä‚lxzãÃRi¶º•œúÞ˜d ÓX\@Ù² £3¬œðßêß – ¶sOmدy{»´·Ñ¬¬¶àc ‚L"rÿ™9çaÞÔ‰¤Ål†ÞvÚ#iNÐIè2GRŸ¥2;Mµ|ÛÙ%‰×+,—8'#“ÏC×óÉæ²%øðÖ-F}ïÅztsÃoæO§É¨ rƒ©*q¸`NOCž†’Rjñ[vÔ]¤÷îhi—V§P6ÖºŒjUYf†VËœ’ê=ÿ\Ô¬&(Q$‘²býÑÁ>ç#‰ZÉM@Õeƒh,.™/FÛl†2ñèrjÝŒmÌ’[é—é›xÆØUíãå-Æ¥=7a«VAwÊDrZÜ>yJªÍíÆ:÷ÏãP_YÞYÅ‹ku)Énwô*@9þœ÷«3j:œ¯˜ÀѯÎòA»#Ô ØMÄõ«v÷5™^Û†,ÞVƒÜ®r(Rq³è+)hcXǪ[]ô÷W$mʼnô9ééÎ)5msWÒ'tù¯ÕÓ*ñ¨![ЀƒZ½MFg{»+h¤ Õ"+¿óÜAúp}ê{ ”Îb: -¾ÜgéÆyö­£ñZä87¥È¬µÍBêÛÏ›L¸µ;~X¤~qëíSÙëkyÄ–ò–ý×NqõªºÜ ]iË›¿vw vâ›o¨:.k‹y%à©–r¹ã àCŠ’Øl÷$¾7æè=„Œ¹àùˆÿ7¶?­Hƒ]ˆ€TÇÏ,ëúU‹ ‘ý£t¬3'”Üû÷æ‰îmÎÞÀ“;‡R}°j\¯¥Šöi;›;üÎF~€ÐÒ*©_n ŽÕÂî•r ⢻ŠK˜¾lÇ5Ëe{.RJå‘íýØ Žx¦µ¼Lq’s×­C¼2,kr¼ÝE6(ç-Ê{0e ~œ¦šZ“£{˳ nÄ“›{Ô~]Æà$À•u\<Ó ¬!÷6Œ–-€?Z¨.åyvZ£‘œ³e˜~lSŠÓB[.µ»WylŽ7!ýp*®ý@gìÑFÄŽŒãú:d²ÜH\;0þàeÏ·úÕ¨¬¦V ù#Ô¤g¯$ŒþµW¶âK™è6ÚiKM ~ð‡>ÚµÞ`%ÎÂ<ˆV#p.Y¤‘ Êí—'?ˆ« !,V"C»‡øTI\¸ÜD´±I>Ð`P\a±_­>XìÝ O  íÅ.ñ·s°QžIjCyÆò€G«R»cH[h„K¶7fñ–¤v Ö3ÏLsQ`-±I=·R "^cŸJZÜ.Ðë»x.ád‘HãøG?…f_øGNÕŒO:E'™rE„“’oSµ9`äVª%²{Qö„܈ýÜúЯÐ|©îgZiOc ¬÷Ff8+çE÷o‘W’y4—š2Þƒ5Å•»nl˜c†‘Ÿ—8òÓ1cÁL"®Cn;¹_Ä?þéZ§‡µoÚÅu¨Ü{g—„^6’px$t¬¡Ièk)Å+þg@5«k¸Åš™•7s2ãpÆ[éøU}BãÅ*­ ÃlrÐ\Åæmnßq†ï¦GÖ¼÷Ä>$øáýv-KSð|Þ˜—!-ä±ÓH¿´89l–òÊŒŸ™I<ã5«âø_ÁÚ¾)Ö϶4B0ËÆß×­O§è:,S]LÈ­• 0$~8« km*Æmü?¼· ºl,|Îyô óW-lÌÆkXTämŸ~N+k¦‡G²—sI¡F?­>ŠÀê"6·ÞP~¢¢]:?$î9ÈáV¨§v„â™XÙFWkNç× súSþÇC0°â¦¢‹±r¢c}âM5´»RAPËöÉþubŠ.ÇÊŠ“i1L2·2§¦Ö¤G‚0BÌüõÉÏó«”QÍ.âå‰XépÙ¸è¨ÎdSb’¿í(ÿ*»E5). ¡¢èñ!nfë’ g?èÖSYH#¦ «tQÍ ä‰V=>(—j\ËŽÙlÒµ…» _éš³E+°å‰Y´›7]¯#Ò¡ŸÃºtø%YHèÊØ5~Š|Ò[0åb”^Òã5ªÉ“’eæiòèö‚ÝyÆ8üªÕ›“w¸ùcØÊ¶ð†§úU¤Vò‚mm£MÊ¿Â~\ãú`c|Û¥VáÇ¸ÇøTÔR»nâå­bˆÑ¡i7Ë4Îû²>GåRÅc@À°Uš)¹6O³‚wHɸðÜ—·±Ý^ê÷,È^£c‚¤6Ò7ŒÃ3ƒÔY—¼« [Ä ®¢ò1"[Û(]‘{/Ü€rqÔšêh¦§8»ÅØ%Jœ•¤®qšWÀ¿…úDSÛÅà­â¸]²Åý‡\ä†ÚƒpÎ=Åkêð¾©x/u}2+¹Sý[\D¬`p23ÏzÜÀôQUíjós_Q*”ym¡ÌÛ|$ðŸo=¾™¢‹/=BÉ%„Ò[¾3œ•”g'íZÏáË6ØRyФMâf ƒŽH$†<NHç“ *orÔcdfGáM*=/û8Ý Îv¬­ž¹ÆI$ÞÃÐUTðE”RÓYÔbËÿÆp1ŽÃÓ°îkvŒABm Â-ꂊ(¤XQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÙ^² N² V² (BCD ä² E d² Sd³ [>š³ j³ ƒ ص ‚„ ðµ ¯‡ ¶ °‡ `¶ ±‡p¶ HHµRŽz{[Wg´oŠr_5&LW cbY””çƒiƒ§D2v)k@bE6W3j‡1ê.­P™8ƒ4¶4Å5ºJºoUýÔO~ªÕ‰ô¢S×y#Ñ04’&" ¦v)n! —É'5+uJ×hžsÑÝX B> ïŽ ˆÇ ü Á0 †f ÿ€ÿ€ÿÿØÿÛC     ÿÛC  ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÙ€Æ?€Æ?€fÀ€V@汇Ž# °‡ °‡ˆmt–¤r@@¦TXAWGS 84|mapcache-rel-1-6-1/tests/expected/000077500000000000000000000000001316353564100170105ustar00rootroot00000000000000mapcache-rel-1-6-1/tests/expected/wms_capabilities.xml000066400000000000000000000056371316353564100230640ustar00rootroot00000000000000 ]> OGC:WMS no title set, add some in metadata application/vnd.ogc.wms_xml image/png image/jpeg text/plain application/vnd.ogc.gml text/plain EPSG:3857 156543.03392804099712520838 78271.51696402048401068896 39135.75848201022745342925 19567.87924100512100267224 9783.93962050256050133612 4891.96981025128025066806 2445.98490512564012533403 1222.99245256282006266702 611.49622628141003133351 305.74811314070478829308 152.87405657035250783338 76.43702828517623970583 38.21851414258812695834 19.10925707129405992646 9.55462853564703173959 4.77731426782351586979 2.38865713391175793490 1.19432856695587897633 256 256 image/jpeg global no title set, add some in metadata EPSG:3857 EPSG:4326 EPSG:900913 global global EPSG:3857 EPSG:900913 mapcache-rel-1-6-1/tests/expected/wmts_capabilities.xml000066400000000000000000000240571316353564100232450ustar00rootroot00000000000000 OGC WMTS 1.0.0 KVP KVP KVP global global image/jpeg GoogleMapsCompatible GoogleMapsCompatible -20037508.342789 -20037508.342789 20037508.342789 20037508.342789 urn:ogc:def:crs:EPSG:6.3:3857 urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible 0 559082264.02871787548065185547 -20037508.342789 20037508.342789 256 256 1 1 1 279541132.01435887813568115234 -20037508.342789 20037508.342789 256 256 2 2 2 139770566.00717940926551818848 -20037508.342789 20037508.342789 256 256 4 4 3 69885283.00358971953392028809 -20037508.342789 20037508.342789 256 256 8 8 4 34942641.50179485976696014404 -20037508.342789 20037508.342789 256 256 16 16 5 17471320.75089742988348007202 -20037508.342789 20037508.342789 256 256 32 32 6 8735660.37544871494174003601 -20037508.342789 20037508.342789 256 256 64 64 7 4367830.18772435747087001801 -20037508.342789 20037508.342789 256 256 128 128 8 2183915.09386217873543500900 -20037508.342789 20037508.342789 256 256 256 256 9 1091957.54693108866922557354 -20037508.342789 20037508.342789 256 256 512 512 10 545978.77346554468385875225 -20037508.342789 20037508.342789 256 256 1024 1024 11 272989.38673277228372171521 -20037508.342789 20037508.342789 256 256 2048 2048 12 136494.69336638617096468806 -20037508.342789 20037508.342789 256 256 4096 4096 13 68247.34668319307093042880 -20037508.342789 20037508.342789 256 256 8192 8192 14 34123.67334159654274117202 -20037508.342789 20037508.342789 256 256 16384 16384 15 17061.83667079827137058601 -20037508.342789 20037508.342789 256 256 32768 32768 16 8530.91833539913568529300 -20037508.342789 20037508.342789 256 256 65536 65536 17 4265.45916769956784264650 -20037508.342789 20037508.342789 256 256 131072 131072 18 2132.72958384978392132325 -20037508.342789 20037508.342789 256 256 262144 262144 mapcache-rel-1-6-1/tests/run_tests.sh000077500000000000000000000047461316353564100176070ustar00rootroot00000000000000#!/bin/sh # Project: MapCache # Purpose: MapCache tests # Author: Even Rouault # #***************************************************************************** # Copyright (c) 2017 Regents of the University of Minnesota. # # 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. #****************************************************************************/ set -e MAPCACHE_CONF=/tmp/mc/mapcache.xml sudo rm -rf /tmp/mc/global mapcache_seed -c /tmp/mc/mapcache.xml -t global --force -z 0,1 gdalinfo -checksum /tmp/mc/global/GoogleMapsCompatible/00/000/000/000/000/000/000.jpg | grep Checksum=20574 >/dev/null || (echo "Did not get expected checksum"; gdalinfo -checksum /tmp/mc/global/GoogleMapsCompatible/00/000/000/000/000/000/000.jpg; /bin/false) sudo rm -rf /tmp/mc/global curl -s "http://localhost/mapcache/?SERVICE=WMS&REQUEST=GetCapabilities" | xmllint --format - > /tmp/wms_capabilities.xml diff -u /tmp/wms_capabilities.xml expected curl -s "http://localhost/mapcache/wmts?SERVICE=WMTS&REQUEST=GetCapabilities" | xmllint --format - > /tmp/wmts_capabilities.xml diff -u /tmp/wmts_capabilities.xml expected curl -s "http://localhost/mapcache/wmts/1.0.0/global/default/GoogleMapsCompatible/0/0/0.jpg" > /tmp/0.jpg gdalinfo -checksum /tmp/0.jpg | grep Checksum=20574 >/dev/null || (echo "Did not get expected checksum"; gdalinfo -checksum /tmp/0.jpg; /bin/false) curl -s "http://localhost/mapcache/wmts/1.0.0/global/default/GoogleMapsCompatible/0/0/0.jpg" > /tmp/0_bis.jpg diff /tmp/0.jpg /tmp/0_bis.jpg mapcache-rel-1-6-1/tests/travis_setup.sh000077500000000000000000000061021316353564100202750ustar00rootroot00000000000000#!/bin/sh # Project: MapCache # Purpose: MapCache tests # Author: Even Rouault # #***************************************************************************** # Copyright (c) 2017 Regents of the University of Minnesota. # # 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. #****************************************************************************/ set -e mkdir /tmp/mc sudo chmod -R a+rw /tmp/mc MAPCACHE_CONF=/tmp/mc/mapcache.xml echo '' >> $MAPCACHE_CONF echo '' >> $MAPCACHE_CONF echo ' ' >> $MAPCACHE_CONF echo ' /tmp/mc/world.tif' >> $MAPCACHE_CONF echo ' ' >> $MAPCACHE_CONF echo ' ' >> $MAPCACHE_CONF echo ' /tmp/mc' >> $MAPCACHE_CONF echo ' ' >> $MAPCACHE_CONF echo ' ' >> $MAPCACHE_CONF echo ' disk' >> $MAPCACHE_CONF echo ' global-tif' >> $MAPCACHE_CONF echo ' GoogleMapsCompatible' >> $MAPCACHE_CONF echo ' JPEG' >> $MAPCACHE_CONF echo ' 1 1' >> $MAPCACHE_CONF echo ' ' >> $MAPCACHE_CONF echo ' ' >> $MAPCACHE_CONF echo ' ' >> $MAPCACHE_CONF echo ' debug' >> $MAPCACHE_CONF echo '' >> $MAPCACHE_CONF cp data/world.tif /tmp/mc sudo su -c "echo 'LoadModule mapcache_module /usr/lib/apache2/modules/mod_mapcache.so' >> /etc/apache2/apache2.conf" sudo su -c "echo '' >> /etc/apache2/apache2.conf" sudo su -c "echo ' ' >> /etc/apache2/apache2.conf" sudo su -c "echo ' Require all granted' >> /etc/apache2/apache2.conf" sudo su -c "echo ' ' >> /etc/apache2/apache2.conf" sudo su -c "echo ' MapCacheAlias /mapcache \"/tmp/mc/mapcache.xml\"' >> /etc/apache2/apache2.conf" sudo su -c "echo '' >> /etc/apache2/apache2.conf" sudo service apache2 restart mapcache-rel-1-6-1/util/000077500000000000000000000000001316353564100150225ustar00rootroot00000000000000mapcache-rel-1-6-1/util/CMakeLists.txt000066400000000000000000000025101316353564100175600ustar00rootroot00000000000000option(WITH_GEOS "Choose if GEOS geometry operations support should be built in" ON) option(WITH_OGR "Choose if OGR/GDAL input vector support should be built in" ON) add_executable(mapcache_seed mapcache_seed.c) target_link_libraries(mapcache_seed mapcache) if(WITH_OGR) find_package(GDAL) if(GDAL_FOUND) include_directories(${GDAL_INCLUDE_DIR}) target_link_libraries(mapcache_seed ${GDAL_LIBRARY}) set (USE_OGR 1) else(GDAL_FOUND) #TODO:message here could be more precise: we need the GDAL library but we don't need to force gdal support report_dependency_error(GDAL OGR) endif(GDAL_FOUND) endif(WITH_OGR) if(WITH_GEOS) find_package(GEOS) if(GEOS_FOUND) include_directories(${GEOS_INCLUDE_DIR}) target_link_libraries(mapcache_seed ${GEOS_LIBRARY}) set (USE_GEOS 1) else(GEOS_FOUND) report_optional_not_found(GEOS) endif(GEOS_FOUND) endif (WITH_GEOS) configure_file ( "${PROJECT_SOURCE_DIR}/util/mapcache-util-config.h.in" "${PROJECT_BINARY_DIR}/util/mapcache-util-config.h" ) include_directories("${PROJECT_BINARY_DIR}/util/") message(STATUS "* Seeder Configuration Options:") status_optional_component("GEOS" "${USE_GEOS}" "${GEOS_LIBRARY}") status_optional_component("OGR" "${USE_OGR}" "${GDAL_LIBRARY}") INSTALL(TARGETS mapcache_seed RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) mapcache-rel-1-6-1/util/mapcache-util-config.h.in000066400000000000000000000001701316353564100215550ustar00rootroot00000000000000#ifndef _MAPCACHE_UTIL_CONFIG_H #define _MAPCACHE_UTIL_CONFIG_H #cmakedefine USE_OGR 1 #cmakedefine USE_GEOS 1 #endif mapcache-rel-1-6-1/util/mapcache_seed.c000066400000000000000000001442431316353564100177370ustar00rootroot00000000000000/****************************************************************************** * $Id: mapcache_seed.c 13201 2012-03-05 13:50:45Z tbonfort $ * * Project: MapServer * Purpose: MapCache utility program for seeding and pruning caches * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * 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 of this Software or works derived from this 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapcache-util-config.h" #include "mapcache.h" #include #include #include #include #include #ifndef _WIN32 #include #include #define USE_FORK #include #endif #include #include #ifdef USE_FORK int msqid; #include #include #include #endif #include apr_queue_t *work_queue; apr_queue_t *log_queue; #if defined(USE_OGR) && defined(USE_GEOS) #define USE_CLIPPERS #endif #ifdef USE_CLIPPERS #include "ogr_api.h" #include "geos_c.h" int nClippers = 0; const GEOSPreparedGeometry **clippers=NULL; #endif mapcache_tileset *tileset; mapcache_tileset *tileset_transfer; mapcache_cfg *cfg; mapcache_context ctx; apr_array_header_t *dimensions=NULL; int minzoom=-1; int maxzoom=-1; mapcache_grid_link *grid_link; int nthreads=0; int nprocesses=0; int quiet = 0; int verbose = 0; int force = 0; int sig_int_received = 0; int error_detected = 0; double percent_failed_allowed = 1.0; int n_metatiles_tot = 0; int n_nodata_tot = 0; int rate_limit = 0; FILE *failed_log = NULL, *retry_log = NULL; #define FAIL_BACKLOG_COUNT 1000 apr_time_t age_limit = 0; struct mctimeval starttime; typedef enum { MAPCACHE_CMD_SEED, MAPCACHE_CMD_STOP, MAPCACHE_CMD_DELETE, MAPCACHE_CMD_SKIP, MAPCACHE_CMD_TRANSFER, MAPCACHE_CMD_STOP_RECURSION } cmd; typedef enum { MAPCACHE_ITERATION_UNSET, MAPCACHE_ITERATION_DEPTH_FIRST, MAPCACHE_ITERATION_LEVEL_FIRST, MAPCACHE_ITERATION_LOG } mapcache_iteration_mode; mapcache_iteration_mode iteration_mode = MAPCACHE_ITERATION_UNSET; struct seed_cmd { cmd command; int x; int y; int z; }; typedef enum { MAPCACHE_STATUS_OK, MAPCACHE_STATUS_FAIL, MAPCACHE_STATUS_FINISHED } s_status; struct seed_status { s_status status; int x,y,z; int nodata; char *msg; }; #ifdef USE_FORK struct msg_cmd { long mtype; struct seed_cmd cmd; }; #endif cmd mode = MAPCACHE_CMD_SEED; /* the mode the utility will be running in: either seed or delete */ int push_queue(struct seed_cmd cmd) { struct seed_cmd *pcmd; int retries=0; int ret; #ifdef USE_FORK if(nprocesses > 1) { struct msg_cmd mcmd; mcmd.mtype = 1; mcmd.cmd = cmd; if (msgsnd(msqid, &mcmd, sizeof(struct seed_cmd), 0) == -1) { printf("failed to push tile %d %d %d\n",cmd.z,cmd.y,cmd.x); return APR_EGENERAL; } return APR_SUCCESS; } #endif pcmd = calloc(1,sizeof(struct seed_cmd)); *pcmd = cmd; ret = apr_queue_push(work_queue,pcmd); while (ret == APR_EINTR && retries < 10) { retries++; ret = apr_queue_push(work_queue,pcmd); } if(ret == APR_EINTR) { printf("failed to push tile %d %d %d after 10 retries\n",cmd.z,cmd.y,cmd.x); return APR_EGENERAL; } return ret; } int pop_queue(struct seed_cmd *cmd) { int ret,retries=0; struct seed_cmd *pcmd; #ifdef USE_FORK if(nprocesses > 1) { struct msg_cmd mcmd; if (msgrcv(msqid, &mcmd, sizeof(struct seed_cmd), 1, 0) == -1) { printf("failed to pop tile\n"); return APR_EGENERAL; } *cmd = mcmd.cmd; return APR_SUCCESS; } #endif ret = apr_queue_pop(work_queue, (void**)&pcmd); while(ret == APR_EINTR && retries<10) { retries++; ret = apr_queue_pop(work_queue, (void**)&pcmd); } if(ret == APR_SUCCESS) { *cmd = *pcmd; free(pcmd); } return ret; } int trypop_queue(struct seed_cmd *cmd) { int ret,retries=0; struct seed_cmd *pcmd; #ifdef USE_FORK if(nprocesses>1) { struct msg_cmd mcmd; ret = msgrcv(msqid, &mcmd, sizeof(struct seed_cmd), 1, IPC_NOWAIT); if(errno == ENOMSG) return APR_EAGAIN; if(ret>0) { *cmd = mcmd.cmd; return APR_SUCCESS; } else { printf("failed to trypop tile\n"); return APR_EGENERAL; } } #endif ret = apr_queue_trypop(work_queue,(void**)&pcmd); while(ret == APR_EINTR && retries<10) { retries++; ret = apr_queue_trypop(work_queue,(void**)&pcmd); } if(ret == APR_SUCCESS) { *cmd = *pcmd; free(pcmd); } return ret; } #define SEEDER_OPT_THREAD_DELAY 256 #define SEEDER_OPT_RATE_LIMIT 257 static const apr_getopt_option_t seed_options[] = { /* long-option, short-option, has-arg flag, description */ { "config", 'c', TRUE, "configuration file (/path/to/mapcache.xml)"}, { "cache", 'C', TRUE, "override cache used by selected tileset (useful for selectively seeding fallback/multitier caches)"}, #ifdef USE_CLIPPERS { "ogr-datasource", 'd', TRUE, "ogr datasource to get features from"}, #endif { "dimension", 'D', TRUE, "set the value of a dimension (format DIMENSIONNAME=VALUE). Can be used multiple times for multiple dimensions" }, { "extent", 'e', TRUE, "extent to seed, format: minx,miny,maxx,maxy" }, { "force", 'f', FALSE, "force tile recreation even if it already exists" }, { "grid", 'g', TRUE, "grid to seed" }, { "help", 'h', FALSE, "show help" }, { "iteration-mode", 'i', TRUE, "either \"drill-down\" or \"scanline\". Default is to use drill-down for g, WGS84 and GoogleMapsCompatible grids, and scanline for others. Use this flag to override." }, #ifdef USE_CLIPPERS { "ogr-layer", 'l', TRUE, "layer inside datasource"}, #endif { "log-failed", 'L', TRUE, "log failed tiles to [file]"}, { "mode", 'm', TRUE, "mode: seed (default), delete or transfer" }, { "metasize", 'M', TRUE, "override metatile size while seeding, eg 8,8" }, { "nthreads", 'n', TRUE, "number of parallel threads to use (incompatible with -p/--nprocesses)" }, { "older", 'o', TRUE, "reseed tiles older than supplied date (format: year/month/day hour:minute, eg: 2011/01/31 20:45" }, { "nprocesses", 'p', TRUE, "number of parallel processes to use (incompatible with -n/--nthreads)" }, { "percent", 'P', TRUE, "percent of failed requests allowed from the last 1000 before we abort (default: 1(%), set to 0 to abort on first error)" }, { "quiet", 'q', FALSE, "don't show progress info" }, { "retry-failed", 'R', TRUE, "retry failed requests logged to [file] by --log-failed" }, #ifdef USE_CLIPPERS { "ogr-sql", 's', TRUE, "sql to filter inside layer"}, #endif { "tileset", 't', TRUE, "tileset to seed" }, { "verbose", 'v', FALSE, "show debug log messages" }, #ifdef USE_CLIPPERS { "ogr-where", 'w', TRUE, "filter to apply on layer features"}, #endif { "transfer", 'x', TRUE, "tileset to transfer" }, { "zoom", 'z', TRUE, "min and max zoomlevels to seed, separated by a comma. eg 0,6" }, { "rate-limit", SEEDER_OPT_RATE_LIMIT, TRUE, "maximum number of tiles/second to seed"}, { "thread-delay", SEEDER_OPT_THREAD_DELAY, TRUE, "delay in seconds between rendering thread creation (ramp up)"}, { NULL, 0, 0, NULL } }; void handle_sig_int(int signal) { #define signal_msg "SIGINT received, waiting for threads to finish\npress ctrl-C again to force terminate\n" if(!sig_int_received) { int err = write(2,signal_msg,strlen(signal_msg)); if(err) { //nothing we can really do here } sig_int_received = 1; } else { exit(signal); } } void seed_log(mapcache_context *ctx, mapcache_log_level level, char *msg, ...) { if(level >= MAPCACHE_WARN || verbose) { va_list args; va_start(args,msg); vfprintf(stderr,msg,args); va_end(args); fprintf(stderr,"\n"); } } void mapcache_context_seeding_log(mapcache_context *ctx, mapcache_log_level level, char *msg, ...) { va_list args; va_start(args,msg); vfprintf(stderr,msg,args); va_end(args); fprintf(stderr,"\n"); } #ifdef USE_CLIPPERS int ogr_features_intersect_tile(mapcache_context *ctx, mapcache_tile *tile) { mapcache_metatile *mt = mapcache_tileset_metatile_get(ctx,tile); GEOSCoordSequence *mtbboxls = GEOSCoordSeq_create(5,2); GEOSGeometry *mtbbox = GEOSGeom_createLinearRing(mtbboxls); GEOSGeometry *mtbboxg = GEOSGeom_createPolygon(mtbbox,NULL,0); int i; int intersects = 0; GEOSCoordSeq_setX(mtbboxls,0,mt->map.extent.minx); GEOSCoordSeq_setY(mtbboxls,0,mt->map.extent.miny); GEOSCoordSeq_setX(mtbboxls,1,mt->map.extent.maxx); GEOSCoordSeq_setY(mtbboxls,1,mt->map.extent.miny); GEOSCoordSeq_setX(mtbboxls,2,mt->map.extent.maxx); GEOSCoordSeq_setY(mtbboxls,2,mt->map.extent.maxy); GEOSCoordSeq_setX(mtbboxls,3,mt->map.extent.minx); GEOSCoordSeq_setY(mtbboxls,3,mt->map.extent.maxy); GEOSCoordSeq_setX(mtbboxls,4,mt->map.extent.minx); GEOSCoordSeq_setY(mtbboxls,4,mt->map.extent.miny); for(i=0; i 0 && ogr_features_intersect_tile(ctx,tile) == 0) return MAPCACHE_CMD_STOP_RECURSION; #endif if(mode != MAPCACHE_CMD_TRANSFER && force) { if(mode == MAPCACHE_CMD_DELETE) { tile_exists = 1; } else { tile_exists = 0; } } else { int i; if(tile->tileset->dimension_assembly_type != MAPCACHE_DIMENSION_ASSEMBLY_NONE) { for(i=0; idimensions->nelts; i++) { mapcache_requested_dimension *rdim = APR_ARRAY_IDX(tile->dimensions,i,mapcache_requested_dimension*); rdim->cached_value = rdim->requested_value; } } else { if(tile->dimensions) { mapcache_extent extent; mapcache_grid_get_tile_extent(ctx,tile->grid_link->grid,tile->x,tile->y,tile->z,&extent); for(i=0; idimensions->nelts; i++) { apr_array_header_t *rdim_vals; mapcache_requested_dimension *rdim = APR_ARRAY_IDX(tile->dimensions,i,mapcache_requested_dimension*); rdim_vals = rdim->dimension->get_entries_for_value(ctx,rdim->dimension,rdim->requested_value, tile->tileset, NULL, tile->grid_link->grid); if(GC_HAS_ERROR(ctx)) { return MAPCACHE_CMD_SKIP; } if(rdim_vals->nelts > 1) { ctx->set_error(ctx,500,"dimension (%s) for tileset (%s) returned invalid number of subdimensions (1 expected)",rdim->dimension->name, tile->tileset->name); return MAPCACHE_CMD_SKIP; } if(rdim_vals->nelts == 0) { ctx->set_error(ctx,404,"dimension (%s) for tileset (%s) returned no subdimensions (1 expected)",rdim->dimension->name, tile->tileset->name); return MAPCACHE_CMD_SKIP; } rdim->cached_value = APR_ARRAY_IDX(rdim_vals,0,char*); } } } tile_exists = mapcache_cache_tile_exists(ctx,tileset->_cache,tile); } /* if the tile exists and a time limit was specified, check the tile modification date */ if(tile_exists) { if(age_limit) { if(mapcache_cache_tile_get(ctx,tileset->_cache, tile) == MAPCACHE_SUCCESS) { if(tile->mtime && tile->mtimetileset = tileset_transfer; if (mapcache_cache_tile_exists(ctx,tile->tileset->_cache, tile)) { mapcache_tileset_tile_delete(ctx,tile,MAPCACHE_TRUE); } tile->tileset = tileset; } action = mode; } else { //if(action == MAPCACHE_CMD_DELETE) action = MAPCACHE_CMD_DELETE; } } } else { //BUG: tile_exists returned true, but tile_get returned a failure. not sure what to do. action = MAPCACHE_CMD_SKIP; } } else { if(mode == MAPCACHE_CMD_DELETE) { //the tile exists and we are in delete mode: delete it action = MAPCACHE_CMD_DELETE; } else if (mode == MAPCACHE_CMD_TRANSFER) { /* the tile exists in the source tileset, check if the tile exists in the destination cache */ tile->tileset = tileset_transfer; if (!force && mapcache_cache_tile_exists(ctx,tile->tileset->_cache, tile)) { action = MAPCACHE_CMD_SKIP; } else { action = MAPCACHE_CMD_TRANSFER; } tile->tileset = tileset; } else { // the tile exists and we are in seed mode, skip to next one action = MAPCACHE_CMD_SKIP; } } } else { // the tile does not exist if (mode == MAPCACHE_CMD_SEED) { action = mode; } else { action = MAPCACHE_CMD_SKIP; } } return action; } double rate_limit_last_time = 0; double rate_limit_delay = 0.0; void rate_limit_sleep() { if(rate_limit > 0) { struct mctimeval now; double now_time; mapcache_gettimeofday(&now,NULL); now_time = now.tv_sec + now.tv_usec / 1000000.0; if((now_time - rate_limit_last_time) < rate_limit_delay) { apr_sleep((int)((rate_limit_delay - (now_time - rate_limit_last_time)) * 1000000)); /*last_time = now_time + delay - (now_time - last_time); //now plus the time we slept */ rate_limit_last_time = rate_limit_delay + rate_limit_last_time; } else { rate_limit_last_time = now_time; } } } void cmd_recurse(mapcache_context *cmd_ctx, mapcache_tile *tile) { cmd action; int curx, cury, curz; int blchildx,trchildx,blchildy,trchildy; int minchildx,maxchildx,minchildy,maxchildy; mapcache_extent bboxbl,bboxtr; double epsilon; apr_pool_clear(cmd_ctx->pool); if(sig_int_received || error_detected) { //stop if we were asked to stop by hitting ctrl-c //remove all items from the queue struct seed_cmd entry; while (trypop_queue(&entry)!=APR_EAGAIN) /*do nothing*/; return; } action = examine_tile(cmd_ctx, tile); if(action == MAPCACHE_CMD_SEED || action == MAPCACHE_CMD_DELETE || action == MAPCACHE_CMD_TRANSFER) { //current x,y,z needs seeding, add it to the queue struct seed_cmd cmd; cmd.x = tile->x; cmd.y = tile->y; cmd.z = tile->z; cmd.command = action; if(rate_limit > 0) rate_limit_sleep(); push_queue(cmd); } if(action == MAPCACHE_CMD_STOP_RECURSION) return; //recurse into our 4 child metatiles curx = tile->x; cury = tile->y; curz = tile->z; tile->z += 1; if(tile->z > maxzoom) { tile->z -= 1; return; } /* * compute the x,y limits of the next zoom level that intersect the * current metatile */ mapcache_grid_get_tile_extent(cmd_ctx, grid_link->grid, curx, cury, curz, &bboxbl); mapcache_grid_get_tile_extent(cmd_ctx, grid_link->grid, curx+tileset->metasize_x-1, cury+tileset->metasize_y-1, curz, &bboxtr); epsilon = (bboxbl.maxx-bboxbl.minx)*0.01; mapcache_grid_get_xy(cmd_ctx,grid_link->grid, bboxbl.minx + epsilon, bboxbl.miny + epsilon, tile->z,&blchildx,&blchildy); mapcache_grid_get_xy(cmd_ctx,grid_link->grid, bboxtr.maxx - epsilon, bboxtr.maxy - epsilon, tile->z,&trchildx,&trchildy); minchildx = (MAPCACHE_MIN(blchildx,trchildx) / tileset->metasize_x)*tileset->metasize_x; minchildy = (MAPCACHE_MIN(blchildy,trchildy) / tileset->metasize_y)*tileset->metasize_y; maxchildx = (MAPCACHE_MAX(blchildx,trchildx) / tileset->metasize_x + 1)*tileset->metasize_x; maxchildy = (MAPCACHE_MAX(blchildy,trchildy) / tileset->metasize_y + 1)*tileset->metasize_y; for(tile->x = minchildx; tile->x < maxchildx; tile->x += tileset->metasize_x) { if(tile->x >= grid_link->grid_limits[tile->z].minx && tile->x < grid_link->grid_limits[tile->z].maxx) { for(tile->y = minchildy; tile->y < maxchildy; tile->y += tileset->metasize_y) { if(tile->y >= grid_link->grid_limits[tile->z].miny && tile->y < grid_link->grid_limits[tile->z].maxy) { cmd_recurse(cmd_ctx,tile); } } } } tile->x = curx; tile->y = cury; tile->z = curz; } void feed_worker() { int n; mapcache_tile *tile; int z = minzoom; int x = grid_link->grid_limits[z].minx; int y = grid_link->grid_limits[z].miny; mapcache_context cmd_ctx = ctx; int nworkers = nthreads; if(nprocesses >= 1) nworkers = nprocesses; apr_pool_create(&cmd_ctx.pool,ctx.pool); tile = mapcache_tileset_tile_create(ctx.pool, tileset, grid_link); tile->dimensions = mapcache_requested_dimensions_clone(ctx.pool,dimensions); if(rate_limit > 0) { /* compute time between seed commands accounting for max rate-limit and current metasize */ rate_limit_delay = (tileset->metasize_x * tileset->metasize_y) / (double)rate_limit; } if(iteration_mode == MAPCACHE_ITERATION_DEPTH_FIRST) { do { tile->x = x; tile->y = y; tile->z = z; cmd_recurse(&cmd_ctx,tile); x += tileset->metasize_x; if( x >= grid_link->grid_limits[z].maxx ) { y += tileset->metasize_y; if( y < grid_link->grid_limits[z].maxy) { x = grid_link->grid_limits[z].minx; } } } while ( x < grid_link->grid_limits[z].maxx && y < grid_link->grid_limits[z].maxy ); } else { while(1) { int action; apr_pool_clear(cmd_ctx.pool); if(sig_int_received || error_detected) { //stop if we were asked to stop by hitting ctrl-c //remove all items from the queue struct seed_cmd entry; while (trypop_queue(&entry)!=APR_EAGAIN) /* do nothing */; break; } if(iteration_mode == MAPCACHE_ITERATION_LOG) { if(3 != fscanf(retry_log,"%d,%d,%d\n",&x,&y,&z)) { break; } else { printf("from log: %d %d %d\n",x,y,z); } } tile->x = x; tile->y = y; tile->z = z; action = examine_tile(&cmd_ctx, tile); if(action == MAPCACHE_CMD_SEED || action == MAPCACHE_CMD_DELETE || action == MAPCACHE_CMD_TRANSFER) { //current x,y,z needs seeding, add it to the queue struct seed_cmd cmd; cmd.x = x; cmd.y = y; cmd.z = z; cmd.command = action; if(rate_limit > 0) rate_limit_sleep(); push_queue(cmd); } //compute next x,y,z x += tileset->metasize_x; if(x >= grid_link->grid_limits[z].maxx) { //x is too big, increment y y += tileset->metasize_y; if(y >= grid_link->grid_limits[z].maxy) { //y is too big, increment z z += 1; if(z > maxzoom) break; //we've finished seeding y = grid_link->grid_limits[z].miny; //set y to the smallest value for current z } x = grid_link->grid_limits[z].minx; //set x to smallest value for current z } } } //instruct rendering threads to stop working for(n=0; ndimensions = mapcache_requested_dimensions_clone(tpool,dimensions); } while(1) { struct seed_cmd cmd; apr_status_t ret; apr_pool_clear(seed_ctx.pool); ret = pop_queue(&cmd); if(ret != APR_SUCCESS || cmd.command == MAPCACHE_CMD_STOP) break; tile->x = cmd.x; tile->y = cmd.y; tile->z = cmd.z; tile->nodata = 0; tile->encoded_data = NULL; tile->raw_image = NULL; if(tile->dimensions) { int i; if(tileset->dimension_assembly_type == MAPCACHE_DIMENSION_ASSEMBLY_NONE) { mapcache_extent extent; mapcache_grid_get_tile_extent(&seed_ctx,tile->grid_link->grid,tile->x,tile->y,tile->z,&extent); for(i=0; idimensions->nelts; i++) { apr_array_header_t *rdim_vals; mapcache_requested_dimension *rdim = APR_ARRAY_IDX(tile->dimensions,i,mapcache_requested_dimension*); rdim_vals = rdim->dimension->get_entries_for_value(&seed_ctx,rdim->dimension,rdim->requested_value, tile->tileset, NULL, tile->grid_link->grid); GC_CHECK_ERROR(&seed_ctx); if(rdim_vals->nelts > 1) { seed_ctx.set_error(&seed_ctx,500,"dimension (%s) for tileset (%s) returned invalid number of subdimensions (1 expected)",rdim->dimension->name, tile->tileset->name); return; } if(rdim_vals->nelts == 0) { seed_ctx.set_error(&seed_ctx,404,"dimension (%s) for tileset (%s) returned no subdimensions (1 expected)",rdim->dimension->name, tile->tileset->name); return; } rdim->cached_value = APR_ARRAY_IDX(rdim_vals,0,char*); } } else { for(i=0; idimensions->nelts; i++) { mapcache_requested_dimension *rdim = APR_ARRAY_IDX(tile->dimensions,i,mapcache_requested_dimension*); rdim->cached_value = NULL; } } } if(cmd.command == MAPCACHE_CMD_SEED) { if(!tile->dimensions || tileset->dimension_assembly_type == MAPCACHE_DIMENSION_ASSEMBLY_NONE) { mapcache_metatile *mt = mapcache_tileset_metatile_get(&seed_ctx, tile); /* this will query the source to create the tiles, and save them to the cache */ mapcache_tileset_render_metatile(&seed_ctx, mt); } else { mapcache_tileset_tile_set_get_with_subdimensions(&seed_ctx,tile); } } else if (cmd.command == MAPCACHE_CMD_TRANSFER) { mapcache_tileset_tile_get(&seed_ctx, tile); if(!tile->nodata && !GC_HAS_ERROR(&seed_ctx)) { mapcache_tileset *tmp_tileset = tile->tileset; tile->tileset = tileset_transfer; mapcache_cache_tile_set(&seed_ctx, tile->tileset->_cache, tile); tile->tileset = tmp_tileset; } } else { //CMD_DELETE mapcache_tileset_tile_delete(&seed_ctx,tile,MAPCACHE_TRUE); } { struct seed_status *st = calloc(1,sizeof(struct seed_status)); int retries=0; st->x=tile->x; st->y=tile->y; st->z=tile->z; st->nodata = tile->nodata; if(seed_ctx.get_error(&seed_ctx)) { st->status = MAPCACHE_STATUS_FAIL; st->msg = strdup(seed_ctx.get_error_message(&seed_ctx)); seed_ctx.clear_errors(&seed_ctx); } else { st->status = MAPCACHE_STATUS_OK; } ret = apr_queue_push(log_queue,(void*)st); while( ret == APR_EINTR && retries < 10) { retries++; ret = apr_queue_push(log_queue,(void*)st); } if( ret == APR_EINTR) { printf("FATAL ERROR: unable to log progress after 10 retries, aborting\n"); break; } if(ret != APR_SUCCESS) { printf("FATAL ERROR: unable to log progress\n"); break; } } } } #ifdef USE_FORK int seed_process() { seed_worker(); return 0; } #endif static void* APR_THREAD_FUNC seed_thread(apr_thread_t *thread, void *data) { seed_worker(); return NULL; } static void* APR_THREAD_FUNC feed_thread_fn(apr_thread_t *thread, void *data) { //start the thread that will populate the queue. feed_worker(); return NULL; } static void* APR_THREAD_FUNC log_thread_fn(apr_thread_t *thread, void *data) { size_t cur; double last_time; double now_time; int i; int nfailed; int ntotal; double pct; char failed[FAIL_BACKLOG_COUNT]; memset(failed,-1,FAIL_BACKLOG_COUNT); cur=0; last_time=0; while(1) { int retries = 0; struct seed_status *st; apr_status_t ret = apr_queue_pop(log_queue, (void**)&st); while(ret == APR_EINTR && retries<10) { retries++; ret = apr_queue_pop(log_queue, (void**)&st); } if(ret != APR_SUCCESS || !st) break; if(st->status == MAPCACHE_STATUS_FINISHED) return NULL; if(st->status == MAPCACHE_STATUS_OK) { failed[cur]=0; n_metatiles_tot++; if(st->nodata) { n_nodata_tot++; } if(!quiet) { struct mctimeval now; mapcache_gettimeofday(&now,NULL); now_time = now.tv_sec + now.tv_usec / 1000000.0; if((now_time - last_time) > 1.0) { printf(" \r"); printf("seeded %d tiles, now at z%d x%d y%d\r",n_metatiles_tot*tileset->metasize_x*tileset->metasize_y, st->z,st->x,st->y); fflush(stdout); last_time = now_time; } } } else { /* count how many errors and successes we have */ failed[cur]=1; nfailed=0; ntotal=0; if(failed_log) { fprintf(failed_log,"%d,%d,%d\n",st->x,st->y,st->z); } for(i=0; i=0) ntotal++; if(failed[i]==1) nfailed++; } ctx.log(&ctx, MAPCACHE_WARN, "failed to seed tile z%d,x%d,y%d:\n%s\n", st->z,st->x,st->y,st->msg); pct = ((double)nfailed / (double)ntotal) * 100; if(pct > percent_failed_allowed) { ctx.log(&ctx, MAPCACHE_ERROR, "aborting seed as %.1f%% of the last %d requests failed\n", pct, FAIL_BACKLOG_COUNT); error_detected = 1; } } if(st->msg) free(st->msg); free(st); cur++; cur %= FAIL_BACKLOG_COUNT; } return NULL; } void notice(const char *fmt, ...) { va_list ap; fprintf( stdout, "NOTICE: "); va_start (ap, fmt); vfprintf( stdout, fmt, ap); va_end(ap); fprintf( stdout, "\n" ); } void log_and_exit(const char *fmt, ...) { va_list ap; fprintf( stdout, "ERROR: "); va_start (ap, fmt); vfprintf( stdout, fmt, ap); va_end(ap); fprintf( stdout, "\n" ); exit(1); } int usage(const char *progname, char *msg, ...) { int i=0; if(msg) { va_list args; va_start(args,msg); printf("%s\n",progname); vprintf(msg,args); printf("\noptions:\n"); va_end(args); } else printf("usage: %s options\n",progname); while(seed_options[i].name) { if(seed_options[i].optch<256) { if(seed_options[i].has_arg==TRUE) { printf("-%c|--%s [value]: %s\n",seed_options[i].optch,seed_options[i].name, seed_options[i].description); } else { printf("-%c|--%s: %s\n",seed_options[i].optch,seed_options[i].name, seed_options[i].description); } } else { if(seed_options[i].has_arg==TRUE) { printf(" --%s [value]: %s\n",seed_options[i].name, seed_options[i].description); } else { printf(" --%s: %s\n",seed_options[i].name, seed_options[i].description); } } i++; } apr_terminate(); return 1; } static int isPowerOfTwo(int x) { return (x & (x - 1)) == 0; } int main(int argc, const char **argv) { /* initialize apr_getopt_t */ apr_getopt_t *opt; const char *configfile=NULL; apr_thread_t **seed_threads; apr_thread_t *log_thread,*feed_thread; const char *tileset_name=NULL; const char *tileset_transfer_name=NULL; const char *grid_name = NULL; const char *cache_override = NULL; int *zooms = NULL;//[2]; mapcache_extent *extent = NULL;//[4]; int optch; int rv,n; const char *old = NULL; const char *optarg; apr_table_t *argdimensions; char *dimkey=NULL, *dimvalue=NULL,*key, *last, *optargcpy=NULL; int keyidx; int *metasizes = NULL;//[2]; int metax=-1,metay=-1; double *extent_array = NULL; double thread_delay = 0.0; #ifdef USE_CLIPPERS OGRFeatureH hFeature; GEOSWKTReader *geoswktreader; const char *ogr_where = NULL; const char *ogr_layer = NULL; const char *ogr_sql = NULL; const char *ogr_datasource = NULL; #endif apr_initialize(); (void) signal(SIGINT,handle_sig_int); apr_pool_create(&ctx.pool,NULL); mapcache_context_init(&ctx); cfg = mapcache_configuration_create(ctx.pool); ctx.config = cfg; ctx.log= mapcache_context_seeding_log; apr_getopt_init(&opt, ctx.pool, argc, argv); mapcache_gettimeofday(&starttime,NULL); argdimensions = apr_table_make(ctx.pool,3); /* parse the all options based on opt_option[] */ while ((rv = apr_getopt_long(opt, seed_options, &optch, &optarg)) == APR_SUCCESS) { switch (optch) { case 'h': return usage(argv[0],NULL); break; case 'f': force = 1; break; case 'q': quiet = 1; break; case 'v': verbose = 1; break; case 'c': configfile = optarg; break; case 'C': cache_override = optarg; break; case 'g': grid_name = optarg; break; case 't': tileset_name = optarg; break; case 'x': tileset_transfer_name = optarg; break; case 'i': if(!strcmp(optarg,"drill-down")) { iteration_mode = MAPCACHE_ITERATION_DEPTH_FIRST; } else if(!strcmp(optarg,"level-by-level") || !strcmp(optarg, "scanline")) { iteration_mode = MAPCACHE_ITERATION_LEVEL_FIRST; } else { return usage(argv[0],"invalid iteration mode, expecting \"drill-down\" or \"scanline\""); } break; case 'L': failed_log = fopen(optarg,"w"); if(!failed_log) { return usage(argv[0],"failed to open -L|--log-failed file for writing"); } break; case 'R': retry_log = fopen(optarg,"r"); if(!retry_log) { return usage(argv[0],"failed to open -R|--retry_failed file for writing"); } break; case 'm': if(!strcmp(optarg,"delete")) { mode = MAPCACHE_CMD_DELETE; } else if(!strcmp(optarg,"transfer")) { mode = MAPCACHE_CMD_TRANSFER; } else if(strcmp(optarg,"seed")) { return usage(argv[0],"invalid mode, expecting \"seed\", \"delete\" or \"transfer\""); } else { mode = MAPCACHE_CMD_SEED; } break; case 'n': nthreads = (int)strtol(optarg, NULL, 10); if(nthreads <=0 ) return usage(argv[0], "failed to parse nthreads, expecting positive integer"); break; case 'p': #ifdef USE_FORK nprocesses = (int)strtol(optarg, NULL, 10); if(nprocesses <=0 ) return usage(argv[0], "failed to parse nprocesses, expecting positive integer"); break; #else return usage(argv[0], "multi process seeding not available on this platform"); #endif case 'P': percent_failed_allowed = (double)strtol(optarg, NULL, 10); if(percent_failed_allowed<0 || percent_failed_allowed>100 ) return usage(argv[0], "failed to parse percent, expecting number between 0 and 100"); break; case 'e': if ( MAPCACHE_SUCCESS != mapcache_util_extract_double_list(&ctx, (char*)optarg, ",", &extent_array, &n) || n != 4 || extent_array[0] >= extent_array[2] || extent_array[1] >= extent_array[3] ) { return usage(argv[0], "failed to parse extent, expecting comma separated 4 doubles"); } extent = apr_palloc(ctx.pool,sizeof(mapcache_extent)); extent->minx = extent_array[0]; extent->miny = extent_array[1]; extent->maxx = extent_array[2]; extent->maxy = extent_array[3]; break; case 'z': if ( MAPCACHE_SUCCESS != mapcache_util_extract_int_list(&ctx, (char*)optarg, ",", &zooms, &n) || n != 2 || zooms[0] > zooms[1]) { return usage(argv[0], "failed to parse zooms, expecting comma separated 2 ints"); } else { minzoom = zooms[0]; maxzoom = zooms[1]; } break; case 'M': if ( MAPCACHE_SUCCESS != mapcache_util_extract_int_list(&ctx, (char*)optarg, ",", &metasizes, &n) || n != 2 || metasizes[0] <= 0 || metasizes[1] <=0) { return usage(argv[0], "failed to parse metasize, expecting comma separated 2 positive ints (e.g. -M 8,8"); } else { metax = metasizes[0]; metay = metasizes[1]; } break; case 'o': old = optarg; break; case 'D': optargcpy = apr_pstrdup(ctx.pool,optarg); keyidx = 0; for (key = apr_strtok(optargcpy, "=", &last); key != NULL; key = apr_strtok(NULL, "=", &last)) { if(keyidx == 0) { dimkey = key; } else { dimvalue = key; } keyidx++; } if(keyidx!=2 || !dimkey || !dimvalue || !*dimkey || !*dimvalue) { return usage(argv[0], "failed to parse dimension, expecting DIMNAME=DIMVALUE"); } apr_table_set(argdimensions,dimkey,dimvalue); break; case SEEDER_OPT_THREAD_DELAY: thread_delay = strtod(optarg, NULL); if(thread_delay < 0.0 ) return usage(argv[0], "failed to parse thread-delay, expecting positive number of seconds"); break; case SEEDER_OPT_RATE_LIMIT: rate_limit = (int)strtol(optarg, NULL, 10); if(rate_limit <= 0 ) return usage(argv[0], "failed to parse rate-limit, expecting positive number of tiles per seconds"); break; #ifdef USE_CLIPPERS case 'd': ogr_datasource = optarg; break; case 's': ogr_sql = optarg; break; case 'l': ogr_layer = optarg; break; case 'w': ogr_where = optarg; break; #endif } } if (rv != APR_EOF) { return usage(argv[0],"bad options"); } if( ! configfile ) { return usage(argv[0],"config not specified"); } else { mapcache_configuration_parse(&ctx,configfile,cfg,0); if(ctx.get_error(&ctx)) return usage(argv[0],ctx.get_error_message(&ctx)); mapcache_configuration_post_config(&ctx,cfg); if(ctx.get_error(&ctx)) return usage(argv[0],ctx.get_error_message(&ctx)); mapcache_connection_pool_create(&ctx.connection_pool, ctx.pool); } #ifdef USE_CLIPPERS if(extent && ogr_datasource) { return usage(argv[0], "cannot specify both extent and ogr-datasource"); } if( ogr_sql && ( ogr_where || ogr_layer )) { return usage(argv[0], "ogr-where or ogr_layer cannot be used in conjunction with ogr-sql"); } if(ogr_datasource) { int f=0; OGRDataSourceH hDS = NULL; OGRLayerH layer = NULL; OGRRegisterAll(); hDS = OGROpen( ogr_datasource, FALSE, NULL ); if( hDS == NULL ) { printf( "OGR Open failed\n" ); exit( 1 ); } if(ogr_sql) { layer = OGR_DS_ExecuteSQL( hDS, ogr_sql, NULL, NULL); if(!layer) { return usage(argv[0],"aborting"); } } else { int nLayers = OGR_DS_GetLayerCount(hDS); if(nLayers>1 && !ogr_layer) { return usage(argv[0],"ogr datastore contains more than one layer. please specify which one to use with --ogr-layer"); } else { if(ogr_layer) { layer = OGR_DS_GetLayerByName(hDS,ogr_layer); } else { layer = OGR_DS_GetLayer(hDS,0); } if(!layer) { return usage(argv[0],"aborting"); } if(ogr_where) { if(OGRERR_NONE != OGR_L_SetAttributeFilter(layer, ogr_where)) { return usage(argv[0],"aborting"); } } } } if((nClippers=OGR_L_GetFeatureCount(layer, TRUE)) == 0) { printf("no features in provided ogr parameters, cannot continue\n"); apr_terminate(); exit(0); } initGEOS(notice, log_and_exit); clippers = (const GEOSPreparedGeometry**)malloc(nClippers*sizeof(GEOSPreparedGeometry*)); geoswktreader = GEOSWKTReader_create(); OGR_L_ResetReading(layer); extent = apr_palloc(ctx.pool,sizeof(mapcache_extent)); while( (hFeature = OGR_L_GetNextFeature(layer)) != NULL ) { char *wkt; GEOSGeometry *geosgeom; OGREnvelope ogr_extent; OGRGeometryH geom = OGR_F_GetGeometryRef(hFeature); if(!geom || !OGR_G_IsValid(geom)) continue; OGR_G_ExportToWkt(geom,&wkt); geosgeom = GEOSWKTReader_read(geoswktreader,wkt); free(wkt); clippers[f] = GEOSPrepare(geosgeom); //GEOSGeom_destroy(geosgeom); OGR_G_GetEnvelope (geom, &ogr_extent); if(f == 0) { extent->minx = ogr_extent.MinX; extent->miny = ogr_extent.MinY; extent->maxx = ogr_extent.MaxX; extent->maxy = ogr_extent.MaxY; } else { extent->minx = MAPCACHE_MIN(ogr_extent.MinX, extent->minx); extent->miny = MAPCACHE_MIN(ogr_extent.MinY, extent->miny); extent->maxx = MAPCACHE_MAX(ogr_extent.MaxX, extent->maxx); extent->maxy = MAPCACHE_MAX(ogr_extent.MaxY, extent->maxy); } OGR_F_Destroy( hFeature ); f++; } nClippers = f; } #endif if( ! tileset_name ) { return usage(argv[0],"tileset not specified"); } else { tileset = mapcache_configuration_get_tileset(cfg,tileset_name); if(!tileset) { return usage(argv[0], "tileset not found in configuration"); } if(tileset->read_only && mode != MAPCACHE_CMD_TRANSFER) { printf("tileset (%s) is read-only, switching it to read-write for seeding\n",tileset_name); tileset->read_only = 0; } if( mode == MAPCACHE_CMD_TRANSFER ) { if( tileset->read_only == 0 ) { printf("switching tileset (%s) to read-only as we are in transfer mode\n",tileset_name); } tileset->read_only = 1; } if( ! grid_name ) { grid_link = APR_ARRAY_IDX(tileset->grid_links,0,mapcache_grid_link*); } else { int i; for(i=0; igrid_links->nelts; i++) { mapcache_grid_link *sgrid = APR_ARRAY_IDX(tileset->grid_links,i,mapcache_grid_link*); if(!strcmp(sgrid->grid->name,grid_name)) { grid_link = sgrid; break; } } if(!grid_link) { return usage(argv[0],"grid not configured for tileset"); } } #ifdef USE_CLIPPERS if(ogr_datasource) { /* check that the provided ogr features are compatible with the grid units */ if(grid_link->grid->unit == MAPCACHE_UNIT_DEGREES) { if(extent->minx < -181.0 || extent->maxx > 181.0 || extent->miny < -91.0 || extent->maxy > 91.0) { printf("\n********************************************************************************\n" "* WARNING!!!: you are seeding a grid in latlon degreees,\n" "* but your provided OGR intersection features span (%f,%f,%f,%f).\n" "* this seems like an error, you should be providing OGR features that\n" "* are in the same projection as the grid you want to seed\n" "********************************************************************************\n\n", extent->minx, extent->miny, extent->maxx, extent->maxy); } } else { if(extent->minx > -181.0 && extent->maxx < 181.0 && extent->miny > -91.0 && extent->maxy < 91.0) { printf("\n********************************************************************************\n" "* WARNING!!!: you are seeding a grid that is not in latlon degreees,\n" "* but your provided OGR intersection features span (%f,%f,%f,%f) which seem to be in degrees.\n" "* this seems like an error, you should be providing OGR features that\n" "* are in the same projection as the grid you want to seed\n" "********************************************************************************\n\n", extent->minx, extent->miny, extent->maxx, extent->maxy); } } } #endif if(iteration_mode == MAPCACHE_ITERATION_UNSET) { if(!strcmp(grid_link->grid->name,"g") || !strcmp(grid_link->grid->name,"WGS84") || !strcmp(grid_link->grid->name,"GoogleMapsCompatible")) { iteration_mode = MAPCACHE_ITERATION_DEPTH_FIRST; } else { iteration_mode = MAPCACHE_ITERATION_LEVEL_FIRST; } } if(retry_log) { iteration_mode = MAPCACHE_ITERATION_LOG; } if(minzoom == -1 && maxzoom == -1) { minzoom = grid_link->minz; maxzoom = grid_link->maxz - 1; } if(minzoomminz) minzoom = grid_link->minz; if(maxzoom>= grid_link->maxz) maxzoom = grid_link->maxz - 1; if(grid_link->outofzoom_strategy != MAPCACHE_OUTOFZOOM_NOTCONFIGURED && maxzoom > grid_link->max_cached_zoom) { return usage(argv[0],"requested maxzoom %d is higher than configured max-cached-zoom %d for grid",maxzoom,grid_link->max_cached_zoom); } /* adjust metasize */ if(metax>0) { tileset->metasize_x = metax; tileset->metasize_y = metay; } /* ensure our metasize is a power of 2 in drill down mode */ if(iteration_mode == MAPCACHE_ITERATION_DEPTH_FIRST) { if(!isPowerOfTwo(tileset->metasize_x) || !isPowerOfTwo(tileset->metasize_y)) { return usage(argv[0],"metatile size is not set to a power of two and iteration mode set to \"drill-down\", rerun with e.g -M 8,8, or force iteration mode to \"scanline\""); } } if(cache_override) { mapcache_cache *co = mapcache_configuration_get_cache(cfg, cache_override); if(!co) { return usage(argv[0], "overridden cache\"%s\" not found in configuration", cache_override); } else { tileset->_cache = co; } } } if (mode == MAPCACHE_CMD_TRANSFER) { tileset->metasize_x = tileset->metasize_y = 1; if (!tileset_transfer_name) return usage(argv[0],"tileset where tiles should be transferred to not specified"); tileset_transfer = mapcache_configuration_get_tileset(cfg,tileset_transfer_name); if(!tileset_transfer) return usage(argv[0], "tileset where tiles should be transferred to not found in configuration"); } if(old) { if(strcasecmp(old,"now")) { struct tm oldtime; char *ret; memset(&oldtime,0,sizeof(oldtime)); ret = strptime(old,"%Y/%m/%d %H:%M",&oldtime); if(!ret || *ret) { return usage(argv[0],"failed to parse time"); } if(APR_SUCCESS != apr_time_ansi_put(&age_limit,mktime(&oldtime))) { return usage(argv[0],"failed to convert time"); } } else { age_limit = apr_time_now(); } } if(extent) { // update the grid limits mapcache_grid_compute_limits(grid_link->grid,extent,grid_link->grid_limits,0); } /* adjust our grid limits so they align on the metatile limits * we need to do this because the seeder does not check for individual tiles, it * goes from one metatile to the next*/ for(n=0; ngrid->nlevels; n++) { if(tileset->metasize_x > 1) { grid_link->grid_limits[n].minx = (grid_link->grid_limits[n].minx/tileset->metasize_x)*tileset->metasize_x; grid_link->grid_limits[n].maxx = (grid_link->grid_limits[n].maxx/tileset->metasize_x+1)*tileset->metasize_x; if( grid_link->grid_limits[n].maxx > grid_link->grid->levels[n]->maxx) grid_link->grid_limits[n].maxx = grid_link->grid->levels[n]->maxx; } if(tileset->metasize_y > 1) { grid_link->grid_limits[n].miny = (grid_link->grid_limits[n].miny/tileset->metasize_y)*tileset->metasize_y; grid_link->grid_limits[n].maxy = (grid_link->grid_limits[n].maxy/tileset->metasize_y+1)*tileset->metasize_y; if( grid_link->grid_limits[n].maxy > grid_link->grid->levels[n]->maxy) grid_link->grid_limits[n].maxy = grid_link->grid->levels[n]->maxy; } } /* validate the supplied dimensions */ if (!apr_is_empty_array(tileset->dimensions)) { int i; const char *value; dimensions = apr_array_make(ctx.pool,tileset->dimensions->nelts,sizeof(mapcache_requested_dimension*)); for(i=0; idimensions->nelts; i++) { mapcache_dimension *dimension = APR_ARRAY_IDX(tileset->dimensions,i,mapcache_dimension*); mapcache_requested_dimension *rdim = apr_pcalloc(ctx.pool,sizeof(mapcache_requested_dimension)); rdim->dimension = dimension; if((value = apr_table_get(argdimensions,dimension->name)) == NULL) { value = dimension->default_value; } rdim->requested_value = apr_pstrdup(ctx.pool,value); APR_ARRAY_PUSH(dimensions,mapcache_requested_dimension*)=rdim; } if(tileset->dimension_assembly_type != MAPCACHE_DIMENSION_ASSEMBLY_NONE) { if(!tileset->store_dimension_assemblies) { return usage(argv[0],"cannot seed a layer with dimension assembling and no caching of resulting assembly"); } if(tileset->metasize_x != 1 || tileset->metasize_y != 1) { return usage(argv[0],"cannot seed a layer with dimension assembling and metatiling enabled (hint: rerun with -M 1,1 to disable metatiling"); } } } if(nthreads == 0 && nprocesses == 0) { nthreads = 1; } if(nthreads >= 1 && nprocesses >= 1) { return usage(argv[0],"cannot set both nthreads and nprocesses"); } { /* start the logging thread */ //create the queue where the seeding statuses will be put apr_threadattr_t *log_thread_attrs; apr_queue_create(&log_queue,MAPCACHE_MAX(nthreads,nprocesses),ctx.pool); //start the rendering threads. apr_threadattr_create(&log_thread_attrs, ctx.pool); apr_thread_create(&log_thread, log_thread_attrs, log_thread_fn, NULL, ctx.pool); } if(nprocesses > 1) { #ifdef USE_FORK key_t key; int i; pid_t *pids = malloc(nprocesses*sizeof(pid_t)); struct msqid_ds queue_ds; key = ftok(argv[0], 'B'); if ((msqid = msgget(key, 0644 | IPC_CREAT|S_IRUSR|S_IWUSR)) == -1) { return usage(argv[0],"failed to create sysv ipc message queue"); } if (-1 == msgctl(msqid, IPC_STAT, &queue_ds)) { return usage(argv[0], "\nFailure in msgctl() stat"); } queue_ds.msg_qbytes = nprocesses*sizeof(struct seed_cmd); if(-1 == msgctl(msqid, IPC_SET, &queue_ds)) { switch(errno) { case EACCES: return usage(argv[0], "\nFailure in msgctl() set qbytes: EACCESS (should not happen here)"); case EFAULT: return usage(argv[0], "\nFailure in msgctl() set qbytes: EFAULT queue not accessible"); case EIDRM: return usage(argv[0], "\nFailure in msgctl() set qbytes: EIDRM message queue removed"); case EINVAL: return usage(argv[0], "\nFailure in msgctl() set qbytes: EINVAL invalid value for msg_qbytes"); case EPERM: return usage(argv[0], "\nFailure in msgctl() set qbytes: EPERM permission denied on msg_qbytes"); default: return usage(argv[0], "\nFailure in msgctl() set qbytes: unknown"); } } for(i=0; i 0) { apr_sleep((int)(thread_delay * 1000000)); } apr_thread_create(&seed_threads[n], seed_thread_attrs, seed_thread, NULL, ctx.pool); } //the worker has finished generating the list of tiles to be seeded, now wait for the rendering threads to finish for(n=0; nstatus = MAPCACHE_STATUS_FINISHED; ret = apr_queue_push(log_queue,(void*)st); while (ret == APR_EINTR && retries<10) { retries++; ret = apr_queue_push(log_queue,(void*)st); } apr_thread_join(&rv, log_thread); } if(n_metatiles_tot>0) { struct mctimeval now_t; float duration; int ntilestot = n_metatiles_tot*tileset->metasize_x*tileset->metasize_y; int nnodatatot = n_nodata_tot*tileset->metasize_x*tileset->metasize_y; mapcache_gettimeofday(&now_t,NULL); duration = ((now_t.tv_sec-starttime.tv_sec)*1000000+(now_t.tv_usec-starttime.tv_usec))/1000000.0; printf("\nseeded %d metatiles (%d total tiles, %d non-empty tiles) in %.1f seconds at %.1f tiles/sec (%.1f non-empty tiles/sec)\n", n_metatiles_tot, ntilestot, ntilestot-nnodatatot, duration, ntilestot/duration, (ntilestot-nnodatatot)/duration); } else { if(!error_detected) { printf("0 tiles needed to be seeded, exiting\n"); } } apr_terminate(); if (error_detected > 0) { exit(1); } return 0; } /* vim: ts=2 sts=2 et sw=2 */