pax_global_header00006660000000000000000000000064136410544720014520gustar00rootroot0000000000000052 comment=4561b2cff581fc53571527f46420e4dee712a3ca tinyobjloader-2.0.0~rc5+dfsg1/000077500000000000000000000000001364105447200161745ustar00rootroot00000000000000tinyobjloader-2.0.0~rc5+dfsg1/.bintray.in000066400000000000000000000027701364105447200202600ustar00rootroot00000000000000{ /* Bintray package information. In case the package already exists on Bintray, only the name, repo and subject fields are mandatory. */ "package": { "name": "releases", // Bintray package name "repo": "tinyobjloader", // Bintray repository name "subject": "syoyo" // Bintray subject (user or organization) }, /* Package version information. In case the version already exists on Bintray, only the name fields is mandatory. */ "version": { "name": "@VERSION@", "desc": "@VERSION@", "released": "@DATE@", "vcs_tag": "@VERSION@", "gpgSign": false }, /* Configure the files you would like to upload to Bintray and their upload path. You can define one or more groups of patterns. Each group contains three patterns: includePattern: Pattern in the form of Ruby regular expression, indicating the path of files to be uploaded to Bintray. excludePattern: Optional. Pattern in the form of Ruby regular expression, indicating the path of files to be removed from the list of files specified by the includePattern. uploadPattern: Upload path on Bintray. The path can contain symbols in the form of $1, $2,... that are replaced with capturing groups defined in the include pattern. Note: Regular expressions defined as part of the includePattern property must be wrapped with brackets. */ "files": [ {"includePattern": "dist/(.*)", "uploadPattern": "$1"} ], "publish": true } tinyobjloader-2.0.0~rc5+dfsg1/.clang-format000066400000000000000000000001541364105447200205470ustar00rootroot00000000000000--- BasedOnStyle: Google IndentWidth: 2 TabWidth: 2 UseTab: Never BreakBeforeBraces: Attach Standard: Cpp03 tinyobjloader-2.0.0~rc5+dfsg1/.gitignore000066400000000000000000000001641364105447200201650ustar00rootroot00000000000000#Common folder for building objects build/ /python/dist/ /python/*.egg-info /python/.eggs /python/tiny_obj_loader.h tinyobjloader-2.0.0~rc5+dfsg1/CMakeLists.txt000066400000000000000000000104471364105447200207420ustar00rootroot00000000000000#Tiny Object Loader Cmake configuration file. #This configures the Cmake system with multiple properties, depending #on the platform and configuration it is set to build in. project(tinyobjloader) cmake_minimum_required(VERSION 2.8.11) set(TINYOBJLOADER_SOVERSION 1) set(TINYOBJLOADER_VERSION 1.0.4) #optional double precision support option(TINYOBJLOADER_USE_DOUBLE "Build library with double precision instead of single (float)" OFF) if(TINYOBJLOADER_USE_DOUBLE) set(LIBRARY_NAME ${PROJECT_NAME}_double) else() set(LIBRARY_NAME ${PROJECT_NAME}) endif() #Folder Shortcuts set(TINYOBJLOADEREXAMPLES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/examples) set(tinyobjloader-Source ${CMAKE_CURRENT_SOURCE_DIR}/tiny_obj_loader.h ${CMAKE_CURRENT_SOURCE_DIR}/tiny_obj_loader.cc ) set(tinyobjloader-Example-Source ${CMAKE_CURRENT_SOURCE_DIR}/loader_example.cc ) set(tinyobjloader-examples-objsticher ${TINYOBJLOADEREXAMPLES_DIR}/obj_sticher/obj_writer.h ${TINYOBJLOADEREXAMPLES_DIR}/obj_sticher/obj_writer.cc ${TINYOBJLOADEREXAMPLES_DIR}/obj_sticher/obj_sticher.cc ) #Install destinations include(GNUInstallDirs) set(TINYOBJLOADER_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/cmake) set(TINYOBJLOADER_DOC_DIR ${CMAKE_INSTALL_DOCDIR}) set(TINYOBJLOADER_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR}) set(TINYOBJLOADER_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}) set(TINYOBJLOADER_PKGCONFIG_DIR ${CMAKE_INSTALL_LIBDIR}/pkgconfig) set(TINYOBJLOADER_RUNTIME_DIR ${CMAKE_INSTALL_BINDIR}) option(TINYOBJLOADER_BUILD_TEST_LOADER "Build Example Loader Application" OFF) add_library(${LIBRARY_NAME} ${tinyobjloader-Source}) if(BUILD_SHARED_LIBS) set_target_properties(${LIBRARY_NAME} PROPERTIES SOVERSION ${TINYOBJLOADER_SOVERSION} WINDOWS_EXPORT_ALL_SYMBOLS ON ) endif() if(TINYOBJLOADER_USE_DOUBLE) target_compile_definitions(${LIBRARY_NAME} PUBLIC TINYOBJLOADER_USE_DOUBLE) endif() set_target_properties(${LIBRARY_NAME} PROPERTIES VERSION ${TINYOBJLOADER_VERSION}) target_include_directories(${LIBRARY_NAME} INTERFACE $ $ ) export(TARGETS ${LIBRARY_NAME} FILE ${PROJECT_NAME}-targets.cmake) if(TINYOBJLOADER_BUILD_TEST_LOADER) add_executable(test_loader ${tinyobjloader-Example-Source}) target_link_libraries(test_loader ${LIBRARY_NAME}) endif() option(TINYOBJLOADER_BUILD_OBJ_STICHER "Build OBJ Sticher Application" OFF) if(TINYOBJLOADER_BUILD_OBJ_STICHER) add_executable(obj_sticher ${tinyobjloader-examples-objsticher}) target_link_libraries(obj_sticher ${LIBRARY_NAME}) install(TARGETS obj_sticher DESTINATION ${TINYOBJLOADER_RUNTIME_DIR} ) endif() #Write CMake package config files include(CMakePackageConfigHelpers) configure_package_config_file( ${PROJECT_NAME}-config.cmake.in ${PROJECT_NAME}-config.cmake INSTALL_DESTINATION ${TINYOBJLOADER_CMAKE_DIR} PATH_VARS TINYOBJLOADER_INCLUDE_DIR TINYOBJLOADER_LIBRARY_DIR NO_CHECK_REQUIRED_COMPONENTS_MACRO ) write_basic_package_version_file(${PROJECT_NAME}-config-version.cmake VERSION ${TINYOBJLOADER_VERSION} COMPATIBILITY SameMajorVersion ) #pkg-config file configure_file(${PROJECT_NAME}.pc.in ${LIBRARY_NAME}.pc @ONLY) #Installation install(TARGETS ${LIBRARY_NAME} EXPORT ${PROJECT_NAME}-targets DESTINATION ${TINYOBJLOADER_LIBRARY_DIR} PUBLIC_HEADER DESTINATION ${TINYOBJLOADER_INCLUDE_DIR} RUNTIME DESTINATION ${TINYOBJLOADER_RUNTIME_DIR} ) install(EXPORT ${PROJECT_NAME}-targets NAMESPACE tinyobjloader:: DESTINATION ${TINYOBJLOADER_CMAKE_DIR} ) install(FILES tiny_obj_loader.h DESTINATION ${TINYOBJLOADER_INCLUDE_DIR} ) install(FILES LICENSE DESTINATION ${TINYOBJLOADER_DOC_DIR} ) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake" DESTINATION ${TINYOBJLOADER_CMAKE_DIR} ) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME}.pc" DESTINATION ${TINYOBJLOADER_PKGCONFIG_DIR} ) if(NOT TARGET uninstall) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake IMMEDIATE @ONLY) add_custom_target( uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) endif() tinyobjloader-2.0.0~rc5+dfsg1/LICENSE000066400000000000000000000021231364105447200171770ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2012-2019 Syoyo Fujita and many contributors. 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. tinyobjloader-2.0.0~rc5+dfsg1/README.md000066400000000000000000000310351364105447200174550ustar00rootroot00000000000000# tinyobjloader [![Build Status](https://travis-ci.org/tinyobjloader/tinyobjloader.svg?branch=master)](https://travis-ci.org/tinyobjloader/tinyobjloader) [![AZ Build Status](https://dev.azure.com/syoyo/lte%20oss/_apis/build/status/syoyo.tinyobjloader?branchName=master)](https://dev.azure.com/syoyo/lte%20oss/_build/latest?definitionId=2&branchName=master) [![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/tlb421q3t2oyobcn/branch/master?svg=true)](https://ci.appveyor.com/project/syoyo/tinyobjloader/branch/master) [![Coverage Status](https://coveralls.io/repos/github/syoyo/tinyobjloader/badge.svg?branch=master)](https://coveralls.io/github/syoyo/tinyobjloader?branch=master) [![Download](https://api.bintray.com/packages/conan/conan-center/tinyobjloader%3A_/images/download.svg)](https://bintray.com/conan/conan-center/tinyobjloader%3A_/_latestVersion) [![Join the chat at https://gitter.im/syoyo/tinyobjloader](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/syoyo/tinyobjloader?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) (inactive. gitter chat will be removed in the future. Please use github issue if you have questions and got issues) Tiny but powerful single file wavefront obj loader written in C++03. No dependency except for C++ STL. It can parse over 10M polygons with moderate memory and time. `tinyobjloader` is good for embedding .obj loader to your (global illumination) renderer ;-) If you are looking for C89 version, please see https://github.com/syoyo/tinyobjloader-c . Notice! ------- We have released new version v1.0.0 on 20 Aug, 2016. Old version is available as `v0.9.x` branch https://github.com/syoyo/tinyobjloader/tree/v0.9.x ## What's new * 19 Feb, 2020 : The repository has been moved to https://github.com/tinyobjloader/tinyobjloader ! * 18 May, 2019 : Python binding!(See `python` folder. Also see https://pypi.org/project/tinyobjloader/) * 14 Apr, 2019 : Bump version v2.0.0 rc0. New C++ API and python bindings!(1.x API still exists for backward compatibility) * 20 Aug, 2016 : Bump version v1.0.0. New data structure and API! ## Requirements * C++03 compiler ### Old version Previous old version is available in `v0.9.x` branch. ## Example ![Rungholt](images/rungholt.jpg) tinyobjloader can successfully load 6M triangles Rungholt scene. http://casual-effects.com/data/index.html ![](images/sanmugel.png) * [examples/viewer/](examples/viewer) OpenGL .obj viewer * [examples/callback_api/](examples/callback_api/) Callback API example * [examples/voxelize/](examples/voxelize/) Voxelizer example ## Use case TinyObjLoader is successfully used in ... ### New version(v1.0.x) * Double precision support through `TINYOBJLOADER_USE_DOUBLE` thanks to noma * Loading models in Vulkan Tutorial https://vulkan-tutorial.com/Loading_models * .obj viewer with Metal https://github.com/middlefeng/NuoModelViewer/tree/master * Vulkan Cookbook https://github.com/PacktPublishing/Vulkan-Cookbook * cudabox: CUDA Solid Voxelizer Engine https://github.com/gaspardzoss/cudavox * Drake: A planning, control, and analysis toolbox for nonlinear dynamical systems https://github.com/RobotLocomotion/drake * VFPR - a Vulkan Forward Plus Renderer : https://github.com/WindyDarian/Vulkan-Forward-Plus-Renderer * glslViewer: https://github.com/patriciogonzalezvivo/glslViewer * Lighthouse2: https://github.com/jbikker/lighthouse2 * rayrender(an open source R package for raytracing scenes in created in R): https://github.com/tylermorganwall/rayrender * liblava - A modern C++ and easy-to-use framework for the Vulkan API. [MIT]: https://github.com/liblava/liblava * Your project here! (Letting us know via github issue is welcome!) ### Old version(v0.9.x) * bullet3 https://github.com/erwincoumans/bullet3 * pbrt-v2 https://github.com/mmp/pbrt-v2 * OpenGL game engine development http://swarminglogic.com/jotting/2013_10_gamedev01 * mallie https://lighttransport.github.io/mallie * IBLBaker (Image Based Lighting Baker). http://www.derkreature.com/iblbaker/ * Stanford CS148 http://web.stanford.edu/class/cs148/assignments/assignment3.pdf * Awesome Bump http://awesomebump.besaba.com/about/ * sdlgl3-wavefront OpenGL .obj viewer https://github.com/chrisliebert/sdlgl3-wavefront * pbrt-v3 https://github.com/mmp/pbrt-v3 * cocos2d-x https://github.com/cocos2d/cocos2d-x/ * Android Vulkan demo https://github.com/SaschaWillems/Vulkan * voxelizer https://github.com/karimnaaji/voxelizer * Probulator https://github.com/kayru/Probulator * OptiX Prime baking https://github.com/nvpro-samples/optix_prime_baking * FireRays SDK https://github.com/GPUOpen-LibrariesAndSDKs/FireRays_SDK * parg, tiny C library of various graphics utilities and GL demos https://github.com/prideout/parg * Opengl unit of ChronoEngine https://github.com/projectchrono/chrono-opengl * Point Based Global Illumination on modern GPU https://pbgi.wordpress.com/code-source/ * Fast OBJ file importing and parsing in CUDA http://researchonline.jcu.edu.au/42515/1/2015.CVM.OBJCUDA.pdf * Sorted Shading for Uni-Directional Pathtracing by Joshua Bainbridge https://nccastaff.bournemouth.ac.uk/jmacey/MastersProjects/MSc15/02Josh/joshua_bainbridge_thesis.pdf * GeeXLab http://www.geeks3d.com/hacklab/20160531/geexlab-0-12-0-0-released-for-windows/ ## Features * Group(parse multiple group name) * Vertex * Vertex color(as an extension: https://blender.stackexchange.com/questions/31997/how-can-i-get-vertex-painted-obj-files-to-import-into-blender) * Texcoord * Normal * Material * Unknown material attributes are returned as key-value(value is string) map. * Crease tag('t'). This is OpenSubdiv specific(not in wavefront .obj specification) * PBR material extension for .MTL. Its proposed here: http://exocortex.com/blog/extending_wavefront_mtl_to_support_pbr * Callback API for custom loading. * Double precision support(for HPC application). * Smoothing group * Python binding : See `python` folder. * Precompiled binary(manylinux1-x86_64 only) is hosted at pypi https://pypi.org/project/tinyobjloader/) ### Primitives * [x] face(`f`) * [x] lines(`l`) * [ ] points(`p`) * [ ] curve * [ ] 2D curve * [ ] surface. * [ ] Free form curve/surfaces ## TODO * [ ] Fix obj_sticker example. * [ ] More unit test codes. * [x] Texture options ## License TinyObjLoader is licensed under MIT license. ### Third party licenses. * pybind11 : BSD-style license. ## Usage ### Installation One option is to simply copy the header file into your project and to make sure that `TINYOBJLOADER_IMPLEMENTATION` is defined exactly once. Tinyobjlaoder is also available as a [conan package](https://bintray.com/conan/conan-center/tinyobjloader%3A_/_latestVersion). Conan integrates with many build systems and lets you avoid manual dependency installation. Their [documentation](https://docs.conan.io/en/latest/getting_started.html) is a great starting point. ### Data format `attrib_t` contains single and linear array of vertex data(position, normal and texcoord). ``` attrib_t::vertices => 3 floats per vertex v[0] v[1] v[2] v[3] v[n-1] +-----------+-----------+-----------+-----------+ +-----------+ | x | y | z | x | y | z | x | y | z | x | y | z | .... | x | y | z | +-----------+-----------+-----------+-----------+ +-----------+ attrib_t::normals => 3 floats per vertex n[0] n[1] n[2] n[3] n[n-1] +-----------+-----------+-----------+-----------+ +-----------+ | x | y | z | x | y | z | x | y | z | x | y | z | .... | x | y | z | +-----------+-----------+-----------+-----------+ +-----------+ attrib_t::texcoords => 2 floats per vertex t[0] t[1] t[2] t[3] t[n-1] +-----------+-----------+-----------+-----------+ +-----------+ | u | v | u | v | u | v | u | v | .... | u | v | +-----------+-----------+-----------+-----------+ +-----------+ attrib_t::colors => 3 floats per vertex(vertex color. optional) c[0] c[1] c[2] c[3] c[n-1] +-----------+-----------+-----------+-----------+ +-----------+ | x | y | z | x | y | z | x | y | z | x | y | z | .... | x | y | z | +-----------+-----------+-----------+-----------+ +-----------+ ``` Each `shape_t::mesh_t` does not contain vertex data but contains array index to `attrib_t`. See `loader_example.cc` for more details. ``` mesh_t::indices => array of vertex indices. +----+----+----+----+----+----+----+----+----+----+ +--------+ | i0 | i1 | i2 | i3 | i4 | i5 | i6 | i7 | i8 | i9 | ... | i(n-1) | +----+----+----+----+----+----+----+----+----+----+ +--------+ Each index has an array index to attrib_t::vertices, attrib_t::normals and attrib_t::texcoords. mesh_t::num_face_vertices => array of the number of vertices per face(e.g. 3 = triangle, 4 = quad , 5 or more = N-gons). +---+---+---+ +---+ | 3 | 4 | 3 | ...... | 3 | +---+---+---+ +---+ | | | | | | | +-----------------------------------------+ | | | | | | +------------------------------+ | | | | | | +------------------+ | | | | | | |/ |/ |/ |/ mesh_t::indices | face[0] | face[1] | face[2] | | face[n-1] | +----+----+----+----+----+----+----+----+----+----+ +--------+--------+--------+ | i0 | i1 | i2 | i3 | i4 | i5 | i6 | i7 | i8 | i9 | ... | i(n-3) | i(n-2) | i(n-1) | +----+----+----+----+----+----+----+----+----+----+ +--------+--------+--------+ ``` Note that when `triangulate` flag is true in `tinyobj::LoadObj()` argument, `num_face_vertices` are all filled with 3(triangle). ### float data type TinyObjLoader now use `real_t` for floating point data type. Default is `float(32bit)`. You can enable `double(64bit)` precision by using `TINYOBJLOADER_USE_DOUBLE` define. #### Example code ```c++ #define TINYOBJLOADER_IMPLEMENTATION // define this in only *one* .cc #include "tiny_obj_loader.h" std::string inputfile = "cornell_box.obj"; tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, inputfile.c_str()); if (!warn.empty()) { std::cout << warn << std::endl; } if (!err.empty()) { std::cerr << err << std::endl; } if (!ret) { exit(1); } // Loop over shapes for (size_t s = 0; s < shapes.size(); s++) { // Loop over faces(polygon) size_t index_offset = 0; for (size_t f = 0; f < shapes[s].mesh.num_face_vertices.size(); f++) { int fv = shapes[s].mesh.num_face_vertices[f]; // Loop over vertices in the face. for (size_t v = 0; v < fv; v++) { // access to vertex tinyobj::index_t idx = shapes[s].mesh.indices[index_offset + v]; tinyobj::real_t vx = attrib.vertices[3*idx.vertex_index+0]; tinyobj::real_t vy = attrib.vertices[3*idx.vertex_index+1]; tinyobj::real_t vz = attrib.vertices[3*idx.vertex_index+2]; tinyobj::real_t nx = attrib.normals[3*idx.normal_index+0]; tinyobj::real_t ny = attrib.normals[3*idx.normal_index+1]; tinyobj::real_t nz = attrib.normals[3*idx.normal_index+2]; tinyobj::real_t tx = attrib.texcoords[2*idx.texcoord_index+0]; tinyobj::real_t ty = attrib.texcoords[2*idx.texcoord_index+1]; // Optional: vertex colors // tinyobj::real_t red = attrib.colors[3*idx.vertex_index+0]; // tinyobj::real_t green = attrib.colors[3*idx.vertex_index+1]; // tinyobj::real_t blue = attrib.colors[3*idx.vertex_index+2]; } index_offset += fv; // per-face material shapes[s].mesh.material_ids[f]; } } ``` ## Optimized loader Optimized multi-threaded .obj loader is available at `experimental/` directory. If you want absolute performance to load .obj data, this optimized loader will fit your purpose. Note that the optimized loader uses C++11 thread and it does less error checks but may work most .obj data. Here is some benchmark result. Time are measured on MacBook 12(Early 2016, Core m5 1.2GHz). * Rungholt scene(6M triangles) * old version(v0.9.x): 15500 msecs. * baseline(v1.0.x): 6800 msecs(2.3x faster than old version) * optimised: 1500 msecs(10x faster than old version, 4.5x faster than baseline) ## Tests Unit tests are provided in `tests` directory. See `tests/README.md` for details. tinyobjloader-2.0.0~rc5+dfsg1/build.ninja000066400000000000000000000024701364105447200203170ustar00rootroot00000000000000ninja_required_version = 1.4 gnubuilddir = build gnudefines = gnuincludes = -I. gnucflags = -O2 -g gnucxxflags = -O2 -g -pedantic -Wall -Wextra -Wcast-align -Wcast-qual $ -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self $ -Wmissing-declarations -Wmissing-include-dirs -Wold-style-cast $ -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion $ -Wsign-promo -Wstrict-overflow=5 -Wswitch-default -Wundef -Werror $ -Wno-unused -fsanitize=address gnuldflags = -fsanitize=address pool link_pool depth = 1 rule gnucxx command = $gnucxx -MMD -MF $out.d $gnudefines $gnuincludes $gnucxxflags $ -c $in -o $out description = CXX $out depfile = $out.d deps = gcc rule gnucc command = $gnucc -MMD -MF $out.d $gnudefines $gnuincludes $gnucflags -c $ $in -o $out description = CC $out depfile = $out.d deps = gcc rule gnulink command = $gnuld -o $out $in $libs $gnuldflags description = LINK $out pool = link_pool rule gnuar command = $gnuar rsc $out $in description = AR $out pool = link_pool rule gnustamp command = touch $out description = STAMP $out gnucxx = g++ gnucc = gcc gnuld = $gnucxx gnuar = ar build loader_example.o: gnucxx loader_example.cc build loader_example: gnulink loader_example.o build all: phony loader_example default all tinyobjloader-2.0.0~rc5+dfsg1/cmake_uninstall.cmake.in000066400000000000000000000020131364105447200227500ustar00rootroot00000000000000if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) string(REGEX REPLACE "\n" ";" files "${files}") foreach(file ${files}) message(STATUS "Uninstalling $ENV{DESTDIR}${file}") if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") exec_program( "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" OUTPUT_VARIABLE rm_out RETURN_VALUE rm_retval ) if(NOT "${rm_retval}" STREQUAL 0) message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}") endif(NOT "${rm_retval}" STREQUAL 0) else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") message(STATUS "File $ENV{DESTDIR}${file} does not exist.") endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") endforeach(file) tinyobjloader-2.0.0~rc5+dfsg1/examples/000077500000000000000000000000001364105447200200125ustar00rootroot00000000000000tinyobjloader-2.0.0~rc5+dfsg1/examples/callback_api/000077500000000000000000000000001364105447200223775ustar00rootroot00000000000000tinyobjloader-2.0.0~rc5+dfsg1/examples/callback_api/Makefile000066400000000000000000000000631364105447200240360ustar00rootroot00000000000000all: clang++ -I../../ -Wall -g -o example main.cc tinyobjloader-2.0.0~rc5+dfsg1/examples/callback_api/main.cc000066400000000000000000000120441364105447200236330ustar00rootroot00000000000000// // An example of how to use callback API. // This example is minimum and incomplete. Just showing the usage of callback // API. // You need to implement your own Mesh data struct constrution based on this // example in practical. // #define TINYOBJLOADER_IMPLEMENTATION #include "tiny_obj_loader.h" #include #include #include #include #include #include typedef struct { std::vector vertices; std::vector normals; std::vector texcoords; std::vector v_indices; std::vector vn_indices; std::vector vt_indices; std::vector materials; } MyMesh; void vertex_cb(void *user_data, float x, float y, float z, float w) { MyMesh *mesh = reinterpret_cast(user_data); printf("v[%ld] = %f, %f, %f (w %f)\n", mesh->vertices.size() / 3, x, y, z, w); mesh->vertices.push_back(x); mesh->vertices.push_back(y); mesh->vertices.push_back(z); // Discard w } void normal_cb(void *user_data, float x, float y, float z) { MyMesh *mesh = reinterpret_cast(user_data); printf("vn[%ld] = %f, %f, %f\n", mesh->normals.size() / 3, x, y, z); mesh->normals.push_back(x); mesh->normals.push_back(y); mesh->normals.push_back(z); } void texcoord_cb(void *user_data, float x, float y, float z) { MyMesh *mesh = reinterpret_cast(user_data); printf("vt[%ld] = %f, %f, %f\n", mesh->texcoords.size() / 3, x, y, z); mesh->texcoords.push_back(x); mesh->texcoords.push_back(y); mesh->texcoords.push_back(z); } void index_cb(void *user_data, tinyobj::index_t *indices, int num_indices) { // NOTE: the value of each index is raw value. // For example, the application must manually adjust the index with offset // (e.g. v_indices.size()) when the value is negative(whic means relative // index). // Also, the first index starts with 1, not 0. // See fixIndex() function in tiny_obj_loader.h for details. // Also, 0 is set for the index value which // does not exist in .obj MyMesh *mesh = reinterpret_cast(user_data); for (int i = 0; i < num_indices; i++) { tinyobj::index_t idx = indices[i]; printf("idx[%ld] = %d, %d, %d\n", mesh->v_indices.size(), idx.vertex_index, idx.normal_index, idx.texcoord_index); if (idx.vertex_index != 0) { mesh->v_indices.push_back(idx.vertex_index); } if (idx.normal_index != 0) { mesh->vn_indices.push_back(idx.normal_index); } if (idx.texcoord_index != 0) { mesh->vt_indices.push_back(idx.texcoord_index); } } } void usemtl_cb(void *user_data, const char *name, int material_idx) { MyMesh *mesh = reinterpret_cast(user_data); if ((material_idx > -1) && (material_idx < mesh->materials.size())) { printf("usemtl. material id = %d(name = %s)\n", material_idx, mesh->materials[material_idx].name.c_str()); } else { printf("usemtl. name = %s\n", name); } } void mtllib_cb(void *user_data, const tinyobj::material_t *materials, int num_materials) { MyMesh *mesh = reinterpret_cast(user_data); printf("mtllib. # of materials = %d\n", num_materials); for (int i = 0; i < num_materials; i++) { mesh->materials.push_back(materials[i]); } } void group_cb(void *user_data, const char **names, int num_names) { // MyMesh *mesh = reinterpret_cast(user_data); printf("group : name = \n"); for (int i = 0; i < num_names; i++) { printf(" %s\n", names[i]); } } void object_cb(void *user_data, const char *name) { // MyMesh *mesh = reinterpret_cast(user_data); printf("object : name = %s\n", name); } int main(int argc, char **argv) { tinyobj::callback_t cb; cb.vertex_cb = vertex_cb; cb.normal_cb = normal_cb; cb.texcoord_cb = texcoord_cb; cb.index_cb = index_cb; cb.usemtl_cb = usemtl_cb; cb.mtllib_cb = mtllib_cb; cb.group_cb = group_cb; cb.object_cb = object_cb; MyMesh mesh; std::string warn; std::string err; std::string filename = "../../models/cornell_box.obj"; if (argc > 1) { filename = std::string(argv[1]); } std::ifstream ifs(filename.c_str()); if (ifs.fail()) { std::cerr << "file not found." << std::endl; return EXIT_FAILURE; } tinyobj::MaterialFileReader mtlReader("../../models/"); bool ret = tinyobj::LoadObjWithCallback(ifs, cb, &mesh, &mtlReader, &warn, &err); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << err << std::endl; } if (!ret) { std::cerr << "Failed to parse .obj" << std::endl; return EXIT_FAILURE; } printf("# of vertices = %ld\n", mesh.vertices.size() / 3); printf("# of normals = %ld\n", mesh.normals.size() / 3); printf("# of texcoords = %ld\n", mesh.texcoords.size() / 2); printf("# of vertex indices = %ld\n", mesh.v_indices.size()); printf("# of normal indices = %ld\n", mesh.vn_indices.size()); printf("# of texcoord indices = %ld\n", mesh.vt_indices.size()); printf("# of materials = %ld\n", mesh.materials.size()); return EXIT_SUCCESS; } tinyobjloader-2.0.0~rc5+dfsg1/examples/obj_sticher/000077500000000000000000000000001364105447200223055ustar00rootroot00000000000000tinyobjloader-2.0.0~rc5+dfsg1/examples/obj_sticher/obj_sticher.cc000066400000000000000000000127531364105447200251170ustar00rootroot00000000000000// // Stiches multiple .obj files into one .obj. // #include "obj_writer.h" #include "../../tiny_obj_loader.h" #include #include #include #include typedef std::vector Shape; typedef std::vector Material; typedef tinyobj::attrib_t Attribute; void StichObjs( tinyobj::attrib_t& out_attribute, std::vector& out_shape, std::vector& out_material, const std::vector& attributes, const std::vector& shapes, const std::vector& materials) { // The amount of attributes, shape-vectors and material-vecotrs should be the same. if(attributes.size() != shapes.size() && attributes.size() != materials.size()){ std::cerr << "Size of attributes, shapes and Materials don't fit!" << attributes.size() << " " << shapes.size() <<" " << materials.size() << std::endl;; exit(1); } int num_shapes = 0; // 4 values (vertices, normals, texcoords, colors) std::vector num_attributes(4, 0); int num_materials = 0; for(int i = 0; i < shapes.size(); i++){ num_shapes += shapes[i].size(); } for(int i = 0; i < attributes.size(); i++){ num_attributes[0] += attributes[i].vertices.size(); num_attributes[1] += attributes[i].normals.size(); num_attributes[2] += attributes[i].texcoords.size(); num_attributes[3] += attributes[i].colors.size(); } for(int i = 0; i < materials.size(); i++){ num_materials += materials[i].size(); } // More performant, than push_back out_attribute.vertices.resize(num_attributes[0]); out_attribute.normals.resize(num_attributes[1]); out_attribute.texcoords.resize(num_attributes[2]); out_attribute.colors.resize(num_attributes[3]); out_shape.resize(num_shapes); out_material.resize(num_materials); int material_id_offset = 0; int shape_id_offset = 0; int vertex_idx_offset = 0; int normal_idx_offset = 0; int texcoord_idx_offset = 0; int color_idx_offset = 0; // shapes.size() = attributes.size() = materials.size() for (size_t i = 0; i < shapes.size(); i++) { // Copy shapes for (size_t k = 0; k < shapes[i].size(); k++) { std::string new_name = shapes[i][k].name; // Add suffix char buf[1024]; sprintf(buf, "_%04d", (int)i); new_name += std::string(buf); printf("shape[%ld][%ld].name = %s\n", i, k, shapes[i][k].name.c_str()); tinyobj::shape_t new_shape = shapes[i][k]; // Add material offset. for(size_t f = 0; f < new_shape.mesh.material_ids.size(); f++) { new_shape.mesh.material_ids[f] += material_id_offset; } // Add indices offset. for(size_t f = 0; f < new_shape.mesh.indices.size(); f++){ tinyobj::index_t& ref = new_shape.mesh.indices[f]; if(ref.vertex_index > -1){ ref.vertex_index += vertex_idx_offset; } if(ref.normal_index > -1){ ref.normal_index += normal_idx_offset; } if(ref.texcoord_index > -1){ ref.texcoord_index += texcoord_idx_offset; } } new_shape.name = new_name; printf("shape[%ld][%ld].new_name = %s\n", i, k, new_shape.name.c_str()); out_shape[shape_id_offset++] = new_shape; } // Copy materials for (size_t k = 0; k < materials[i].size(); k++) { out_material[material_id_offset++] = materials[i][k]; } // Copy attributes (3 floats per vertex, 3 floats per normal, 2 floats per texture-coordinate, 3 floats per color) // You could also include a check here, if the sizes are dividable by 3 (resp. 2), but it's safe to simply assume, they do. std::copy(attributes[i].vertices.begin(), attributes[i].vertices.end(), out_attribute.vertices.begin() + vertex_idx_offset * 3); vertex_idx_offset += attributes[i].vertices.size() / 3; std::copy(attributes[i].normals.begin(), attributes[i].normals.end(), out_attribute.normals.begin() + normal_idx_offset * 3); normal_idx_offset += attributes[i].normals.size() / 3; std::copy(attributes[i].texcoords.begin(), attributes[i].texcoords.end(), out_attribute.texcoords.begin() + texcoord_idx_offset * 2); texcoord_idx_offset += attributes[i].texcoords.size() / 2; std::copy(attributes[i].colors.begin(), attributes[i].colors.end(), out_attribute.colors.begin() + color_idx_offset); color_idx_offset += attributes[i].colors.size(); } } int main(int argc, char **argv) { if (argc < 3) { printf("Usage: obj_sticher input0.obj input1.obj ... output.obj\n"); exit(1); } int num_objfiles = argc - 2; std::string out_filename = std::string(argv[argc-1]); // last element std::vector attributes(num_objfiles); std::vector shapes(num_objfiles); std::vector materials(num_objfiles); for (int i = 0; i < num_objfiles; i++) { std::cout << "Loading " << argv[i+1] << " ... " << std::flush; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attributes[i], &shapes[i], &materials[i], &warn, &err, argv[i+1]); if (!warn.empty()) { std::cerr << "WARN:" << warn << std::endl; } if (!err.empty()) { std::cerr << err << std::endl; } if (!ret) { exit(1); } std::cout << "DONE." << std::endl; } Attribute out_attribute; Shape out_shape; Material out_material; StichObjs(out_attribute, out_shape, out_material, attributes, shapes, materials); bool coordTransform = true; bool ret = WriteObj(out_filename, out_attribute, out_shape, out_material, coordTransform); assert(ret); return 0; } tinyobjloader-2.0.0~rc5+dfsg1/examples/obj_sticher/obj_writer.cc000066400000000000000000000116511364105447200247660ustar00rootroot00000000000000// // Simple wavefront .obj writer // #include "obj_writer.h" #include static std::string GetFileBasename(const std::string& FileName) { if(FileName.find_last_of(".") != std::string::npos) return FileName.substr(0, FileName.find_last_of(".")); return ""; } bool WriteMat(const std::string& filename, const std::vector& materials) { FILE* fp = fopen(filename.c_str(), "w"); if (!fp) { fprintf(stderr, "Failed to open file [ %s ] for write.\n", filename.c_str()); return false; } for (size_t i = 0; i < materials.size(); i++) { tinyobj::material_t mat = materials[i]; fprintf(fp, "newmtl %s\n", mat.name.c_str()); fprintf(fp, "Ka %f %f %f\n", mat.ambient[0], mat.ambient[1], mat.ambient[2]); fprintf(fp, "Kd %f %f %f\n", mat.diffuse[0], mat.diffuse[1], mat.diffuse[2]); fprintf(fp, "Ks %f %f %f\n", mat.specular[0], mat.specular[1], mat.specular[2]); fprintf(fp, "Kt %f %f %f\n", mat.transmittance[0], mat.specular[1], mat.specular[2]); fprintf(fp, "Ke %f %f %f\n", mat.emission[0], mat.emission[1], mat.emission[2]); fprintf(fp, "Ns %f\n", mat.shininess); fprintf(fp, "Ni %f\n", mat.ior); fprintf(fp, "illum %d\n", mat.illum); fprintf(fp, "\n"); // @todo { texture } } fclose(fp); return true; } bool WriteObj(const std::string& filename, const tinyobj::attrib_t& attributes, const std::vector& shapes, const std::vector& materials, bool coordTransform) { FILE* fp = fopen(filename.c_str(), "w"); if (!fp) { fprintf(stderr, "Failed to open file [ %s ] for write.\n", filename.c_str()); return false; } std::string basename = GetFileBasename(filename); std::string material_filename = basename + ".mtl"; int prev_material_id = -1; fprintf(fp, "mtllib %s\n\n", material_filename.c_str()); // facevarying vtx for (size_t k = 0; k < attributes.vertices.size(); k+=3) { if (coordTransform) { fprintf(fp, "v %f %f %f\n", attributes.vertices[k + 0], attributes.vertices[k + 2], -attributes.vertices[k + 1]); } else { fprintf(fp, "v %f %f %f\n", attributes.vertices[k + 0], attributes.vertices[k + 1], attributes.vertices[k + 2]); } } fprintf(fp, "\n"); // facevarying normal for (size_t k = 0; k < attributes.normals.size(); k += 3) { if (coordTransform) { fprintf(fp, "vn %f %f %f\n", attributes.normals[k + 0], attributes.normals[k + 2], -attributes.normals[k + 1]); } else { fprintf(fp, "vn %f %f %f\n", attributes.normals[k + 0], attributes.normals[k + 1], attributes.normals[k + 2]); } } fprintf(fp, "\n"); // facevarying texcoord for (size_t k = 0; k < attributes.texcoords.size(); k += 2) { fprintf(fp, "vt %f %f\n", attributes.texcoords[k + 0], attributes.texcoords[k + 1]); } for (size_t i = 0; i < shapes.size(); i++) { fprintf(fp, "\n"); if (shapes[i].name.empty()) { fprintf(fp, "g Unknown\n"); } else { fprintf(fp, "g %s\n", shapes[i].name.c_str()); } bool has_vn = false; bool has_vt = false; // Assumes normals and textures are set shape-wise. if(shapes[i].mesh.indices.size() > 0){ has_vn = shapes[i].mesh.indices[0].normal_index != -1; has_vt = shapes[i].mesh.indices[0].texcoord_index != -1; } // face int face_index = 0; for (size_t k = 0; k < shapes[i].mesh.indices.size(); k += shapes[i].mesh.num_face_vertices[face_index++]) { // Check Materials int material_id = shapes[i].mesh.material_ids[face_index]; if (material_id != prev_material_id) { std::string material_name = materials[material_id].name; fprintf(fp, "usemtl %s\n", material_name.c_str()); prev_material_id = material_id; } unsigned char v_per_f = shapes[i].mesh.num_face_vertices[face_index]; // Imperformant, but if you want to have variable vertices per face, you need some kind of a dynamic loop. fprintf(fp, "f"); for(int l = 0; l < v_per_f; l++){ const tinyobj::index_t& ref = shapes[i].mesh.indices[k + l]; if(has_vn && has_vt){ // v0/t0/vn0 fprintf(fp, " %d/%d/%d", ref.vertex_index + 1, ref.texcoord_index + 1, ref.normal_index + 1); continue; } if(has_vn && !has_vt){ // v0//vn0 fprintf(fp, " %d//%d", ref.vertex_index + 1, ref.normal_index + 1); continue; } if(!has_vn && has_vt){ // v0/vt0 fprintf(fp, " %d/%d", ref.vertex_index + 1, ref.texcoord_index + 1); continue; } if(!has_vn && !has_vt){ // v0 v1 v2 fprintf(fp, " %d", ref.vertex_index + 1); continue; } } fprintf(fp, "\n"); } } fclose(fp); // // Write material file // bool ret = WriteMat(material_filename, materials); return ret; } tinyobjloader-2.0.0~rc5+dfsg1/examples/obj_sticher/obj_writer.h000066400000000000000000000005101364105447200246200ustar00rootroot00000000000000#ifndef __OBJ_WRITER_H__ #define __OBJ_WRITER_H__ #include "../../tiny_obj_loader.h" extern bool WriteObj(const std::string& filename, const tinyobj::attrib_t& attributes, const std::vector& shapes, const std::vector& materials, bool coordTransform = false); #endif // __OBJ_WRITER_H__ tinyobjloader-2.0.0~rc5+dfsg1/examples/voxelize/000077500000000000000000000000001364105447200216575ustar00rootroot00000000000000tinyobjloader-2.0.0~rc5+dfsg1/examples/voxelize/Makefile000066400000000000000000000000371364105447200233170ustar00rootroot00000000000000all: g++ -o voxelizer main.cc tinyobjloader-2.0.0~rc5+dfsg1/examples/voxelize/README.md000066400000000000000000000002461364105447200231400ustar00rootroot00000000000000# Voxelize .obj and export it as also in .obj ## Third party library This example uses https://github.com/karimnaaji/voxelizer, which is licensed under MIT Liense. tinyobjloader-2.0.0~rc5+dfsg1/examples/voxelize/main.cc000066400000000000000000000037511364105447200231200ustar00rootroot00000000000000#define VOXELIZER_IMPLEMENTATION #include "voxelizer.h" #define TINYOBJLOADER_IMPLEMENTATION #include "../../tiny_obj_loader.h" bool Voxelize(const char* filename, float voxelsizex, float voxelsizey, float voxelsizez, float precision) { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, filename); if (!err.empty()) { printf("err: %s\n", err.c_str()); } if (!ret) { printf("failed to load : %s\n", filename); return false; } if (shapes.size() == 0) { printf("err: # of shapes are zero.\n"); return false; } // Only use first shape. { vx_mesh_t* mesh; vx_mesh_t* result; mesh = vx_mesh_alloc(attrib.vertices.size(), shapes[0].mesh.indices.size()); for (size_t f = 0; f < shapes[0].mesh.indices.size(); f++) { mesh->indices[f] = shapes[0].mesh.indices[f].vertex_index; } for (size_t v = 0; v < attrib.vertices.size() / 3; v++) { mesh->vertices[v].x = attrib.vertices[3*v+0]; mesh->vertices[v].y = attrib.vertices[3*v+1]; mesh->vertices[v].z = attrib.vertices[3*v+2]; } result = vx_voxelize(mesh, voxelsizex, voxelsizey, voxelsizez, precision); printf("Number of vertices: %ld\n", result->nvertices); printf("Number of indices: %ld\n", result->nindices); } return true; } int main( int argc, char** argv) { if (argc < 4) { printf("Usage: voxelize input.obj voxelsizex voxelsizey voxelsizez precision\n"); exit(-1); } const char* filename = argv[1]; float voxelsizex = atof(argv[2]); float voxelsizey = atof(argv[3]); float voxelsizez = atof(argv[4]); float prec = atof(argv[5]); bool ret = Voxelize(filename, voxelsizex, voxelsizey, voxelsizez, prec); return ret ? EXIT_SUCCESS : EXIT_FAILURE; } tinyobjloader-2.0.0~rc5+dfsg1/examples/voxelize/voxelizer.h000066400000000000000000000556021364105447200240670ustar00rootroot00000000000000// // LICENCE: // The MIT License (MIT) // // Copyright (c) 2016 Karim Naaji, karim.naaji@gmail.com // // 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 // // REFERENCES: // http://matthias-mueller-fischer.ch/publications/tetraederCollision.pdf // http://fileadmin.cs.lth.se/cs/Personal/Tomas_Akenine-Moller/code/tribox2.txt // // HOWTO: // #define VOXELIZER_IMPLEMENTATION // #define VOXELIZER_DEBUG // Only if assertions need to be checked // #include "voxelizer.h" // // HISTORY: // - version 0.9.0: Initial // // TODO: // - Triangle face merging // - Add colors from input mesh // - Potential issue with voxel bigger than triangle // #ifndef VOXELIZER_H #define VOXELIZER_H // ------------------------------------------------------------------------------------------------ // VOXELIZER PUBLIC API // #ifndef VOXELIZER_HELPERS #include // malloc, calloc, free #endif typedef struct vx_vertex { union { float v[3]; struct { float x; float y; float z; }; }; } vx_vertex_t; typedef struct vx_mesh { vx_vertex_t* vertices; // Contiguous mesh vertices vx_vertex_t* normals; // Contiguous mesh normals unsigned int* indices; // Mesh indices unsigned int* normalindices; // Mesh normal indices size_t nindices; // The number of normal indices size_t nvertices; // The number of vertices size_t nnormals; // The number of normals } vx_mesh_t; vx_mesh_t* vx_voxelize(vx_mesh_t* _mesh, // The input mesh float voxelsizex, // Voxel size on X-axis float voxelsizey, // Voxel size on Y-axis float voxelsizez, // Voxel size on Z-axis float precision); // A precision factor that reduces "holes" artifact // usually a precision = voxelsize / 10. works ok. void vx_mesh_free(vx_mesh_t* _mesh); vx_mesh_t* vx_mesh_alloc(int nindices, int nvertices); // Voxelizer Helpers, define your own if needed #ifndef VOXELIZER_HELPERS #define VOXELIZER_HELPERS 1 #define VX_MIN(a, b) (a > b ? b : a) #define VX_MAX(a, b) (a > b ? a : b) #define VX_FINDMINMAX(x0, x1, x2, min, max) \ min = max = x0; \ if (x1 < min) min = x1; \ if (x1 > max) max = x1; \ if (x2 < min) min = x2; \ if (x2 > max) max = x2; #define VX_CLAMP(v, lo, hi) VX_MAX(lo, VX_MIN(hi, v)) #define VX_MALLOC(T, N) ((T*) malloc(N * sizeof(T))) #define VX_FREE(T) free(T) #define VX_CALLOC(T, N) ((T*) calloc(N * sizeof(T), 1)) #define VX_SWAP(T, A, B) { T tmp = B; B = A; A = tmp; } #ifdef VOXELIZER_DEBUG #define VX_ASSERT(STMT) if (!(STMT)) { *(int *)0 = 0; } #else #define VX_ASSERT(STMT) #endif // VOXELIZER_DEBUG #endif // VOXELIZER_HELPERS // // END VOXELIZER PUBLIC API // ------------------------------------------------------------------------------------------------ #endif // VOXELIZER_H #ifdef VOXELIZER_IMPLEMENTATION #include // ceil, fabs & al. #include // hughh #include // memcpy #define VOXELIZER_EPSILON (0.0000001) #define VOXELIZER_NORMAL_INDICES_SIZE (6) #define VOXELIZER_INDICES_SIZE (36) #define VOXELIZER_HASH_TABLE_SIZE (4096) unsigned int vx_voxel_indices[VOXELIZER_INDICES_SIZE] = { 0, 1, 2, 0, 2, 3, 3, 2, 6, 3, 6, 7, 0, 7, 4, 0, 3, 7, 4, 7, 5, 7, 6, 5, 0, 4, 5, 0, 5, 1, 1, 5, 6, 1, 6, 2, }; float vx_normals[18] = { 0.0, -1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, -1.0, 0.0, 0.0, 0.0, 0.0, -1.0, }; unsigned int vx_normal_indices[VOXELIZER_NORMAL_INDICES_SIZE] = { 3, 2, 1, 5, 4, 0, }; typedef struct vx_aabb { vx_vertex_t min; vx_vertex_t max; } vx_aabb_t; typedef struct vx_edge { vx_vertex_t p1; vx_vertex_t p2; } vx_edge_t; typedef struct vx_triangle { vx_vertex_t p1; vx_vertex_t p2; vx_vertex_t p3; } vx_triangle_t; typedef struct vx_hash_table_node { struct vx_hash_table_node* next; struct vx_hash_table_node* prev; void* data; } vx_hash_table_node_t; typedef struct vx_hash_table { vx_hash_table_node_t** elements; size_t size; } vx_hash_table_t; vx_hash_table_t* vx__hash_table_alloc(size_t size) { vx_hash_table_t* table = VX_MALLOC(vx_hash_table_t, 1); if (!table) { return NULL; } table->size = size; table->elements = VX_MALLOC(vx_hash_table_node_t*, size); if (!table->elements) { return NULL; } for (size_t i = 0; i < table->size; ++i) { table->elements[i] = NULL; } return table; } void vx__hash_table_free(vx_hash_table_t* table, bool freedata) { for (size_t i = 0; i < table->size; ++i) { vx_hash_table_node_t* node = table->elements[i]; if (node) { if (node->next) { while (node->next) { node = node->next; if (freedata) { VX_FREE(node->prev->data); } VX_FREE(node->prev); } VX_FREE(node); } else { VX_FREE(node->data); VX_FREE(node); } } } VX_FREE(table->elements); VX_FREE(table); } bool vx__hash_table_insert(vx_hash_table_t* table, size_t hash, void* data, bool (*compfunc)(void* d1, void* d2)) { if (!table->elements[hash]) { table->elements[hash] = VX_MALLOC(vx_hash_table_node_t, 1); table->elements[hash]->prev = NULL; table->elements[hash]->next = NULL; table->elements[hash]->data = data; } else { vx_hash_table_node_t* node = table->elements[hash]; if (compfunc && compfunc(node->data, data)) { return false; } while (node->next) { node = node->next; if (compfunc && compfunc(node->data, data)) { return false; } } vx_hash_table_node_t* nnode = VX_MALLOC(vx_hash_table_node_t, 1); nnode->prev = node; nnode->next = NULL; nnode->data = data; node->next = nnode; } return true; } void vx_mesh_free(vx_mesh_t* m) { VX_FREE(m->vertices); m->vertices = NULL; m->nvertices = 0; VX_FREE(m->indices); m->indices = NULL; m->nindices = 0; if (m->normals) { VX_FREE(m->normals); } VX_FREE(m); } vx_mesh_t* vx_mesh_alloc(int nvertices, int nindices) { vx_mesh_t* m = VX_MALLOC(vx_mesh_t, 1); if (!m) { return NULL; } m->indices = VX_CALLOC(unsigned int, nindices); if (!m->indices) { return NULL; } m->vertices = VX_CALLOC(vx_vertex_t, nvertices); if (!m->vertices) { return NULL; } m->normals = NULL; m->nindices = nindices; m->nvertices = nvertices; return m; } float vx__map_to_voxel(float position, float voxelSize, bool min) { float vox = (position + (position < 0.f ? -1.f : 1.f) * voxelSize * 0.5f) / voxelSize; return (min ? floor(vox) : ceil(vox)) * voxelSize; } vx_vertex_t vx__vertex_cross(vx_vertex_t* v1, vx_vertex_t* v2) { vx_vertex_t cross; cross.x = v1->y * v2->z - v1->z * v2->y; cross.y = v1->z * v2->x - v1->x * v2->z; cross.z = v1->x * v2->y - v1->y * v2->x; return cross; } bool vx__vertex_equals(vx_vertex_t* v1, vx_vertex_t* v2) { return fabs(v1->x - v2->x) < VOXELIZER_EPSILON && fabs(v1->y - v2->y) < VOXELIZER_EPSILON && fabs(v1->z - v2->z) < VOXELIZER_EPSILON; } bool vx__vertex_comp_func(void* a, void* b) { return vx__vertex_equals((vx_vertex_t*) a, (vx_vertex_t*) b); } void vx__vertex_sub(vx_vertex_t* a, vx_vertex_t* b) { a->x -= b->x; a->y -= b->y; a->z -= b->z; } void vx__vertex_add(vx_vertex_t* a, vx_vertex_t* b) { a->x += b->x; a->y += b->y; a->z += b->z; } void vx__vertex_multiply(vx_vertex_t* a, float v) { a->x *= v; a->y *= v; a->z *= v; } float vx__vertex_dot(vx_vertex_t* v1, vx_vertex_t* v2) { return v1->x * v2->x + v1->y * v2->y + v1->z * v2->z; } int vx__plane_box_overlap(vx_vertex_t* normal, float d, vx_vertex_t* halfboxsize) { vx_vertex_t vmin, vmax; for (int dim = 0; dim <= 2; dim++) { if (normal->v[dim] > 0.0f) { vmin.v[dim] = -halfboxsize->v[dim]; vmax.v[dim] = halfboxsize->v[dim]; } else { vmin.v[dim] = halfboxsize->v[dim]; vmax.v[dim] = -halfboxsize->v[dim]; } } if (vx__vertex_dot(normal, &vmin) + d > 0.0f) { return false; } if (vx__vertex_dot(normal, &vmax) + d >= 0.0f) { return true; } return false; } #define AXISTEST_X01(a, b, fa, fb) \ p1 = a * v1.y - b * v1.z; \ p3 = a * v3.y - b * v3.z; \ if (p1 < p3) { \ min = p1; max = p3; \ } else { \ min = p3; max = p1; \ } \ rad = fa * halfboxsize.y + fb * halfboxsize.z; \ if (min > rad || max < -rad) { \ return false; \ } \ #define AXISTEST_X2(a, b, fa, fb) \ p1 = a * v1.y - b * v1.z; \ p2 = a * v2.y - b * v2.z; \ if (p1 < p2) { \ min = p1; max = p2; \ } else { \ min = p2; max = p1; \ } \ rad = fa * halfboxsize.y + fb * halfboxsize.z; \ if (min > rad || max < -rad) { \ return false; \ } \ #define AXISTEST_Y02(a, b, fa, fb) \ p1 = -a * v1.x + b * v1.z; \ p3 = -a * v3.x + b * v3.z; \ if (p1 < p3) { \ min = p1; max = p3; \ } else { \ min = p3; max = p1; \ } \ rad = fa * halfboxsize.x + fb * halfboxsize.z; \ if (min > rad || max < -rad) { \ return false; \ } \ #define AXISTEST_Y1(a, b, fa, fb) \ p1 = -a * v1.x + b * v1.z; \ p2 = -a * v2.x + b * v2.z; \ if (p1 < p2) { \ min = p1; max = p2; \ } else { \ min = p2; max = p1; \ } \ rad = fa * halfboxsize.x + fb * halfboxsize.z; \ if (min > rad || max < -rad) { \ return false; \ } #define AXISTEST_Z12(a, b, fa, fb) \ p2 = a * v2.x - b * v2.y; \ p3 = a * v3.x - b * v3.y; \ if (p3 < p2) { \ min = p3; max = p2; \ } else { \ min = p2; max = p3; \ } \ rad = fa * halfboxsize.x + fb * halfboxsize.y; \ if (min > rad || max < -rad) { \ return false; \ } #define AXISTEST_Z0(a, b, fa, fb) \ p1 = a * v1.x - b * v1.y; \ p2 = a * v2.x - b * v2.y; \ if (p1 < p2) { \ min = p1; max = p2; \ } else { \ min = p2; max = p1; \ } \ rad = fa * halfboxsize.x + fb * halfboxsize.y; \ if (min > rad || max < -rad) { \ return false; \ } int vx__triangle_box_overlap(vx_vertex_t boxcenter, vx_vertex_t halfboxsize, vx_triangle_t triangle) { vx_vertex_t v1, v2, v3, normal, e1, e2, e3; float min, max, d, p1, p2, p3, rad, fex, fey, fez; v1 = triangle.p1; v2 = triangle.p2; v3 = triangle.p3; vx__vertex_sub(&v1, &boxcenter); vx__vertex_sub(&v2, &boxcenter); vx__vertex_sub(&v3, &boxcenter); e1 = v2; e2 = v3; e3 = v1; vx__vertex_sub(&e1, &v1); vx__vertex_sub(&e2, &v2); vx__vertex_sub(&e3, &v3); fex = fabs(e1.x); fey = fabs(e1.y); fez = fabs(e1.z); AXISTEST_X01(e1.z, e1.y, fez, fey); AXISTEST_Y02(e1.z, e1.x, fez, fex); AXISTEST_Z12(e1.y, e1.x, fey, fex); fex = fabs(e2.x); fey = fabs(e2.y); fez = fabs(e2.z); AXISTEST_X01(e2.z, e2.y, fez, fey); AXISTEST_Y02(e2.z, e2.x, fez, fex); AXISTEST_Z0(e2.y, e2.x, fey, fex); fex = fabs(e3.x); fey = fabs(e3.y); fez = fabs(e3.z); AXISTEST_X2(e3.z, e3.y, fez, fey); AXISTEST_Y1(e3.z, e3.x, fez, fex); AXISTEST_Z12(e3.y, e3.x, fey, fex); VX_FINDMINMAX(v1.x, v2.x, v3.x, min, max); if (min > halfboxsize.x || max < -halfboxsize.x) { return false; } VX_FINDMINMAX(v1.y, v2.y, v3.y, min, max); if (min > halfboxsize.y || max < -halfboxsize.y) { return false; } VX_FINDMINMAX(v1.z, v2.z, v3.z, min, max); if (min > halfboxsize.z || max < -halfboxsize.z) { return false; } normal = vx__vertex_cross(&e1, &e2); d = -vx__vertex_dot(&normal, &v1); if (!vx__plane_box_overlap(&normal, d, &halfboxsize)) { return false; } return true; } #undef AXISTEST_X2 #undef AXISTEST_X01 #undef AXISTEST_Y1 #undef AXISTEST_Y02 #undef AXISTEST_Z0 #undef AXISTEST_Z12 float vx__triangle_area(vx_triangle_t* triangle) { vx_vertex_t ab = triangle->p2; vx_vertex_t ac = triangle->p3; vx__vertex_sub(&ab, &triangle->p1); vx__vertex_sub(&ac, &triangle->p1); float a0 = ab.y * ac.z - ab.z * ac.y; float a1 = ab.z * ac.x - ab.x * ac.z; float a2 = ab.x * ac.y - ab.y * ac.x; return sqrtf(powf(a0, 2.f) + powf(a1, 2.f) + powf(a2, 2.f)) * 0.5f; } void vx__aabb_init(vx_aabb_t* aabb) { aabb->max.x = aabb->max.y = aabb->max.z = -INFINITY; aabb->min.x = aabb->min.y = aabb->min.z = INFINITY; } vx_aabb_t vx__triangle_aabb(vx_triangle_t* triangle) { vx_aabb_t aabb; vx__aabb_init(&aabb); aabb.max.x = VX_MAX(aabb.max.x, triangle->p1.x); aabb.max.x = VX_MAX(aabb.max.x, triangle->p2.x); aabb.max.x = VX_MAX(aabb.max.x, triangle->p3.x); aabb.max.y = VX_MAX(aabb.max.y, triangle->p1.y); aabb.max.y = VX_MAX(aabb.max.y, triangle->p2.y); aabb.max.y = VX_MAX(aabb.max.y, triangle->p3.y); aabb.max.z = VX_MAX(aabb.max.z, triangle->p1.z); aabb.max.z = VX_MAX(aabb.max.z, triangle->p2.z); aabb.max.z = VX_MAX(aabb.max.z, triangle->p3.z); aabb.min.x = VX_MIN(aabb.min.x, triangle->p1.x); aabb.min.x = VX_MIN(aabb.min.x, triangle->p2.x); aabb.min.x = VX_MIN(aabb.min.x, triangle->p3.x); aabb.min.y = VX_MIN(aabb.min.y, triangle->p1.y); aabb.min.y = VX_MIN(aabb.min.y, triangle->p2.y); aabb.min.y = VX_MIN(aabb.min.y, triangle->p3.y); aabb.min.z = VX_MIN(aabb.min.z, triangle->p1.z); aabb.min.z = VX_MIN(aabb.min.z, triangle->p2.z); aabb.min.z = VX_MIN(aabb.min.z, triangle->p3.z); return aabb; } vx_vertex_t vx__aabb_center(vx_aabb_t* a) { vx_vertex_t boxcenter = a->min; vx__vertex_add(&boxcenter, &a->max); vx__vertex_multiply(&boxcenter, 0.5f); return boxcenter; } vx_vertex_t vx__aabb_half_size(vx_aabb_t* a) { vx_vertex_t size; size.x = fabs(a->max.x - a->min.x) * 0.5f; size.y = fabs(a->max.y - a->min.y) * 0.5f; size.z = fabs(a->max.z - a->min.z) * 0.5f; return size; } vx_aabb_t vx__aabb_merge(vx_aabb_t* a, vx_aabb_t* b) { vx_aabb_t merge; merge.min.x = VX_MIN(a->min.x, b->min.x); merge.min.y = VX_MIN(a->min.y, b->min.y); merge.min.z = VX_MIN(a->min.z, b->min.z); merge.max.x = VX_MAX(a->max.x, b->max.x); merge.max.y = VX_MAX(a->max.y, b->max.y); merge.max.z = VX_MAX(a->max.z, b->max.z); return merge; } size_t vx__vertex_hash(vx_vertex_t pos, size_t n) { size_t a = (size_t)(pos.x * 73856093); size_t b = (size_t)(pos.y * 19349663); size_t c = (size_t)(pos.z * 83492791); return (a ^ b ^ c) % n; } void vx__add_voxel(vx_mesh_t* mesh, vx_vertex_t* pos, float* vertices) { for (size_t i = 0; i < 8; ++i) { size_t index = i+mesh->nvertices; mesh->vertices[index].x = vertices[i*3+0] + pos->x; mesh->vertices[index].y = vertices[i*3+1] + pos->y; mesh->vertices[index].z = vertices[i*3+2] + pos->z; } int j = -1; for (size_t i = 0; i < VOXELIZER_INDICES_SIZE; ++i) { if (i % 6 == 0) { j++; } mesh->normalindices[i+mesh->nindices] = vx_normal_indices[j]; } for (size_t i = 0; i < VOXELIZER_INDICES_SIZE; ++i) { mesh->indices[i+mesh->nindices] = vx_voxel_indices[i] + mesh->nvertices; } mesh->nindices += VOXELIZER_INDICES_SIZE; mesh->nvertices += 8; } vx_mesh_t* vx_voxelize(vx_mesh_t* m, float voxelsizex, float voxelsizey, float voxelsizez, float precision) { vx_mesh_t* outmesh = NULL; vx_hash_table_t* table = NULL; size_t voxels = 0; float halfsizex = voxelsizex * 0.5f; float halfsizey = voxelsizey * 0.5f; float halfsizez = voxelsizez * 0.5f; table = vx__hash_table_alloc(VOXELIZER_HASH_TABLE_SIZE); for (int i = 0; i < m->nindices; i += 3) { vx_triangle_t triangle; VX_ASSERT(m->indices[i+0] < m->nvertices); VX_ASSERT(m->indices[i+1] < m->nvertices); VX_ASSERT(m->indices[i+2] < m->nvertices); triangle.p1 = m->vertices[m->indices[i+0]]; triangle.p2 = m->vertices[m->indices[i+1]]; triangle.p3 = m->vertices[m->indices[i+2]]; if (vx__triangle_area(&triangle) < VOXELIZER_EPSILON) { // triangle with 0 area continue; } vx_aabb_t aabb = vx__triangle_aabb(&triangle); aabb.min.x = vx__map_to_voxel(aabb.min.x, voxelsizex, true); aabb.min.y = vx__map_to_voxel(aabb.min.y, voxelsizey, true); aabb.min.z = vx__map_to_voxel(aabb.min.z, voxelsizez, true); aabb.max.x = vx__map_to_voxel(aabb.max.x, voxelsizex, false); aabb.max.y = vx__map_to_voxel(aabb.max.y, voxelsizey, false); aabb.max.z = vx__map_to_voxel(aabb.max.z, voxelsizez, false); for (float x = aabb.min.x; x < aabb.max.x; x += voxelsizex) { for (float y = aabb.min.y; y < aabb.max.y; y += voxelsizey) { for (float z = aabb.min.z; z < aabb.max.z; z += voxelsizez) { vx_aabb_t saabb; saabb.min.x = x - halfsizex; saabb.min.y = y - halfsizey; saabb.min.z = z - halfsizez; saabb.max.x = x + halfsizex; saabb.max.y = y + halfsizey; saabb.max.z = z + halfsizez; vx_vertex_t boxcenter = vx__aabb_center(&saabb); vx_vertex_t halfsize = vx__aabb_half_size(&saabb); // HACK: some holes might appear, this // precision factor reduces the artifact halfsize.x += precision; halfsize.y += precision; halfsize.z += precision; if (vx__triangle_box_overlap(boxcenter, halfsize, triangle)) { vx_vertex_t* nodedata = VX_MALLOC(vx_vertex_t, 1); *nodedata = boxcenter; size_t hash = vx__vertex_hash(boxcenter, VOXELIZER_HASH_TABLE_SIZE); bool insert = vx__hash_table_insert(table, hash, nodedata, vx__vertex_comp_func); if (insert) { voxels++; } } } } } } outmesh = VX_MALLOC(vx_mesh_t, 1); size_t nvertices = voxels * 8; size_t nindices = voxels * VOXELIZER_INDICES_SIZE; outmesh->nnormals = VOXELIZER_NORMAL_INDICES_SIZE; outmesh->vertices = VX_CALLOC(vx_vertex_t, nvertices); outmesh->normals = VX_CALLOC(vx_vertex_t, 6); outmesh->indices = VX_CALLOC(unsigned int, nindices); outmesh->normalindices = VX_CALLOC(unsigned int, nindices); outmesh->nindices = 0; outmesh->nvertices = 0; memcpy(outmesh->normals, vx_normals, 18 * sizeof(float)); float vertices[24] = { -halfsizex, halfsizey, halfsizez, -halfsizex, -halfsizey, halfsizez, halfsizex, -halfsizey, halfsizez, halfsizex, halfsizey, halfsizez, -halfsizex, halfsizey, -halfsizez, -halfsizex, -halfsizey, -halfsizez, halfsizex, -halfsizey, -halfsizez, halfsizex, halfsizey, -halfsizez, }; for (size_t i = 0; i < table->size; ++i) { if (table->elements[i] != NULL) { vx_hash_table_node_t* node = table->elements[i]; if (!node) { continue; } vx_vertex_t* p = (vx_vertex_t*) node->data; vx__add_voxel(outmesh, p, vertices); while (node->next) { node = node->next; p = (vx_vertex_t*) node->data; vx__add_voxel(outmesh, p, vertices); } } } vx__hash_table_free(table, true); return outmesh; } #undef VOXELIZER_EPSILON #undef VOXELIZER_INDICES_SIZE #undef VOXELIZER_HASH_TABLE_SIZE #endif // VX_VOXELIZER_IMPLEMENTATION tinyobjloader-2.0.0~rc5+dfsg1/images/000077500000000000000000000000001364105447200174415ustar00rootroot00000000000000tinyobjloader-2.0.0~rc5+dfsg1/images/rungholt.jpg000066400000000000000000002734221364105447200220170ustar00rootroot00000000000000ÿØÿàJFIFHHÿÛCÿÛCÿÀ€"ÿÄ  ÿÄJ !1"AQa2q‘ #BR¡ðb±Á$’Ñáñ3r‚%c¢SCDƒ4s“ÒÿÄ ÿÄP!1"AQa#2qBR‘¡ÁÑb’±Òð$3Dr‚¢ÂCƒ“Óá 4STñEs„²³ÃâÿÚ ?^J3ž¿†t_ 1ý5Öø~ÀÏÐh†8éÐÀëÙMÃ/þ#Œr‹=Ç×ZË ‘ŸÈk¬càÿÔãE,ü]þš†+°Ç$´q’ž„û k,§ùqø v +#õΊ[PöÑîX¸8äSÔcZŒ‚ècå|Ñÿ(Ñ<±þaôï®ÑaCøsŸ~úÔZè'èFŽq\ƒŽO–>cÿÆŠϾšëy)Ïo颖~_¦‡X¹äùÜÈgEòºú‘®©`v}‹ðçæ1\üñÉ-uÁÿ¦ŠYOòùk®XWÌŸËD,¯‡üºX¹ùã”Z5žN‹åŸæ?¦º…“Ÿº“ƒï¢–ÿ™?†?ï¡Î.Ç3‚þ®ˆX?Ê“øë«ådþtBÒÌèI8X®1Ì-”þJ:({¡žº~Pþm’}Mœ(W¢ÈùŸÉ:(|ÿý]_%_MÉWòÓBNñß$|Çä¬k öþ}uKD}ÉùŒý М/â'¿'ü‡þ]dû þi×P²ŸäÇà4_)'¶- Ç ø“Ž_–~dþ9Ðùyúü']2Ðù¨~'Aå§üº=Çñ8åð?äý4_,ýÿ!®¯’>þ‘¢ù_Lþz-ÄúàÅpqÍ åÿžƒËWòë®—?k>|‘úh‰+Žo””þ¿öÐÕüª?žº>Hý4GùG塸`xëŽo–¯äWë¡òÏò¯]#ÿwüÚÏ#ÿwüÚ<Œ¸çygùW¬òÏò¯]??Ìè>é£ãÆ\x|¯¢¿M””þ¿ö×CÈWóÐh|ýßóh§åã sü¯¢¿M”ͯqcê¡ø’t?ÿ°þ#DL`qŽxhŸdþGFò•òOé¯wÃãØÀh|üƒ@AÀññàòÏùä:ü¿˜×¿ÈNsÇúhÞV>GñОpF¸çpIöý¡òÒ?›út|¤ûÿNš0h{ù ÂMÀÇ7ËOÉD{t>^;·‘ƺ^R“úhÁ¿~=¾z0Fàc›åŸd§þlèÁ+íÐ~)×@#=8ãñ7–£ØøhI Æ9þRþ§ð7£îOãÓ]'è?12¯ËCœ Ü s‹ç×G 'Ý#ñ÷†±ÜϦ„4œ÷ü‡Q¡ÎnE:ÖaçøSúcJåCIÆPFˆa#¾=ôÈ.Nl“Û  $þì~:Ö`¤tâGàt¯0Æz'úh†öõ҅ѸI°Sé„y‚:úT=õ¨Á_ÈidaƒÛ'ñÖa|ÿ¦–.øÂ\‡ÓÕ@V2:ëQ„¯¡8îF–j…×¶ë­fCþãJc9bŸL# 3×¢Oå­&úz3úija{ ~Ö`—~ý1¥‹£„¯µDWn$~!ŒFzü´³0¾€~Z!„0AÁ?-,]/®rÇŽ……cøèžQùþ£Y?4¤|Ö£Oû©üŽ•ñHp«ê„ydû„ýr4BÈîP?-+•OÎ} |úkY€3Ñ9ùôÑ‹”ÂMÀí„‘a=I úè )ù|ô©4à3è }jU<|”1ôÒüt>¸/…¹LùùŽ‹äæR*ž:(þ)Ö¥SÎ1ž™é£ñ’{༑é„ÿG@F>šÖYWòg¯Ë]õ@W±ï¢ª½‰8ùtÑŠ£ßmÀôǰzä²?”Àk¼a,…?NšÖa»õ#å+Å\zc‡ä€:ÿN‹ä§]Ï…pGÏÖb¯Ý§ÐèüAƒñ*ŽãBÂ}“ ø‘ð×gᕟý1øÇù¡_ˆ#G¿+¿¶8ÿ¡Ø‘úk<…1ýºÞFÜW_¦ŠXùr/IÑŒŽØãù*>àŸ¨Î‡ÉWÉ?òë«äþ#óÐO±?¦Œ¾ñ'(üüô_%Cø? uü‚:à}ÂÚ¿”ŸËG¼a_Ž9k=ÐOà5žP?À¯È u¼¥'ôÑ|³þ_ù‹|`ÅÌã•å|ÑÄë #ùᮡhç°?€Æ³Ê?!ýþzÎâqÉò“îü´¤üÔ?øë¬XHîüÆŠZHÇoõÑïWÄ®9~J™_òè<¡þùuÖò¿ÊGà4_((ýí¢Þ=°>$c—åóÿˬò‡ùÿå×WÉÿ'÷úk<¡üŠý†ñíƒø‘Ž_–Ÿ’¿M”?Ïÿ.º… ;¡CñYå§ùOôÐÜ=°>$c—åóÿË¡ò“óQüS®Ÿ–Ÿå?ÓFòÉì üÿí¡¾=0Fàc—å¤|ÿ4ë<°z“ý5ÒòÿÊë£³Ý þ):çâ1ÍòGò/Fò‡ÿ²?¦º¥{$þÿ0eÉùœŒN9…±ìÑüô`ÑþAúã]0Çøý#FÜ=’>™N‹|` ¬{ïÇ/ËV~êqøèþZþiý5Óœ÷õ:0ˆïò~˜ÑuVôÇ+Ésê džç?û†5Ö–O±'ÜA^?‹Bt^*ûáa.¦8áŽùê?Ê­0?•'ò×m4ò‡¿n5°S±ü*=$×Aë… L{cƒå'åƒþ]ÊrO‘Ò4îØOè{kziý~î1Û:ÆniÏ|d7Mé„Ùk§ÝQéØ4{ñéN)à`òé×[“N#õ ié2.Wppôî0sôÑLlt ußør:p¯\h¦:t~u5 ñ‡@O¶ß ;Ÿ®ð£§Cù wLsî€?¯’tl,DóŽ ˆ1ÐÀáGºzë¼XPì ÿâ5žAþUgê4b¨˵NÆ(èONØÖ³§ÓJS¸þšÖcc¸éôÑ|ASŒ‚’'LlûkYŠ‘]ýÀRü6OAßFøe|¿ý:?‰8X ­„·Á¨Ž©è{gZÌ3ìŸé¥YƒÛZÕü¹ü´ÑP¶Rp”0½øÂÏtž¾ÜF•†.sÐäè 2qœ~CJ' K„‰ƒž¾^ Á>4®ø.™éÃ@bÔ gØ‘¡ñGðÛÓ{64CÉúõÒÈÃ'°üô…?¦‡Æƒh>˜E|Îq×ðÑUOÎ;說Á|ÒätSãSŒôôèÅç8/ªþXCšpÉè?z芧òÁö*ÒàÂ#ÙË­=À?Št¡{óÀú¬ûa iÃä3ò:!¦û§úit`ÿËþÚ!‚”~H:_Æüð“”O¦¦™ž¥#®µšf:ñN}½´¼øŸ¸3ÿ·E0n?N‡ÇG® êP}0€4Ïb’4ES?„ŸÌéÀû=#²Gé­F—§Jð{àŽH#¶?f«ùUúh¦›ßÓý4½4ôÿ.-€dŸÓGõ‡Ïr0}0ßšY=ÒOá­fÿ—úiÀû;ÿÇ¢ýžŸ—ôÒ†aóÂNB=°€4ìÿ—ZþÏWÓðã§Ó‡°ÿ]ÓÏòÈiBüa?Pü°Þý›þ]gÙ§Ù?ÓNÙçä¯Ðè 7Ãý4óÁ}@¤öÃvi}ODÿ¦„ÒÒn¿-8?güÒõÐÓô÷ÐúŽðžþ®ï²Ïÿ³²ÿȯùt¿û8 Ð}›þ_é£9÷Àþ|°ßýš=СÿÄ×Yöoù¦œN'ºt_³¿ÈOÿ¬~x?èü÷@ý›áþšÏ³òùt¾û7¯Ü#òÖ}˜~GôÑ}`=ðÑó턦ŸdçÿŽŒ)Š9ôšt½û7ü¿ÓAöp÷Eõ‡ÏŸØA}š}ÒŸÐh˜;¿‘Òóìì{cúϳ}±Ð{h¾°øXÓ˰†û7·åŽº³Ëý4¹ÃÜ'žŽ)À É÷Ît“˜|ñ‘tøöÂÓs׎GÏŽŽ)àœþxÒçìÏ“có2ißåN>zGÖ=N2 ’¨ôÂÃQêëó!†Gqú .>Ï#§ø¢ýžGðtúçEñË8PÉ«L"~±ÑL^¿tãKo³ÕüªÖ`å?òèÍòác(¬0‹1 îŸé 0þyÉúiiðÇþÏû覜s÷ü¡ñ©Œ«•ÕöÂ4Ĉüzh¦&AôçòÒÈÓ¾~€Œè¿güÓÿéÐøÕ>¸Ê¹]Aé„p†OðÀh¦9럡ÒÄÀ'²Hé øüªüÒ4Bõq•r·˜G|_Ÿà…ôQÒÀÁ?÷h†÷ä~4Fô{ã ÊÛÛ g8?Ž4S{…}}ZW|íÁ_©Ð|ù ~ºʹYŽØG˜#¡ã§ÓYð_饇À‘ü¹)†{`œ|´føÇPO¦Æzq'ð/Àä?¦–_;`œý4_êO ýtŸçFP=°øo×/èF–Ÿå9ü4où±£øó…Œ˜{a`çøqøûè ,÷I?.šZ|~]>š/Àåÿž“ñðbp±’é„gÙéùM§§ùOâ4³0GË'Yð¦ã±”d`úaöp÷BôQOÿ.?]->>Éöé 0ëŒç·Q¢7àac#ŸL"Ìî‘ÓEøü c°ÀÒ×àëÄþšÃ)ý4C1ÁŒ„{a “ü#ôÐ'Ø#óXü =’1øk òGÓ¾¿'¾2 O¦¿:tONÙ:³ÕòþšX|Ñ:Ï‚Ïðô:/ß ú=°øžºÁ cÒzüý4¯0ñôùàhAžàç¿M$ßÏ®2.@¾£ ú'FztOõÒ»àÓþ_Ôk>  Hü’sï…Œg¶>Gþ}àA냥p†Fs×óÐ|'Ó¯×Eõ„zã"ä)=°•L×Óß¾taÀ:TˆgŸÀhÿGðò餜À\e{a-ðI=0OËB!ŽƒÒ§àÈÇ¥GðCðdGÿ-$æ;ã(ÈÓÛ Àãæ1îŸÐ*>€ ~*ÖÇü™üt¬¾2®F¾ØMˆ_CÃFñŸI?€ÒEéÙê4? 3’r~|4ƒ˜|g\•¦¿ôè?Í­‰‡Õ8#æt£ø`p}D’Œ#“™ùçÆs“ ôÂsà‡ÈžøÖÁ ûÀ¥ÃЧ?E9£èéé@ÈíŒéþ}qr…öÃôiý†lkY§cø 04¯1óÜ'òÆu¬°ž£‰×Qq˜“ë‡VÓÊl$M<)ú{kY§ü'Jï#?À¯ÓZË<:Žä§F/Ͼ1<§Ó #ŽéQúgZÌ;ÏV–FÐ k, |¿$éC0>øAÓê=0’0²3¢˜·>£®•…„Ø?‚±¢)„ƒ÷‡ã(_±õÂ>¡QÜa"`'¾?öãE4ñ쓟©Ò¸²=Ô“òëiTt€N1òÂúic01ßú…G¦k„tôùcZÌûøé[ä{€N§—mQÆ=@;tÞø#‘,öÂIP€Î? kWÁ'¨Æt¬,|’1õ#@¨ÿNŸ. èÆ`G® ê5öÂHà û ŸÃZÕ ýôª,§ø@?ŽLc¯P>X3~ÃõL%> ?Èœç®N4EC=:~ºS–ì3ƒ×¶³ÉÊ1¥|s Ôj}0•3ÐO×D0‡ò$cë¥:šA9'ç“¢y²âãÜúàþ£_l&Œ!îœ™Ñ Dý?-)ÊAì}ε–BAì? /¾õÛ ß„'¨IÐCä¢G°ï¥m èH÷!m#9ã®tF2DöÂ|Å>øü´Cè1wÔ”ô럼ýtR†ðNç¢øâ}p¿¨ÓÛ ÿ„H=”4O„FO¿ã¥JÓž5«‚?•_®ã‰ÆEÉ;c†b${uöÇMár?‹ó^»ªŒq^ù´N)þUþ§þºO®2J~Øâ˜ƒ¦P?­ŒýÒ1òÆ»e#¿>d¯D)HÏ¥³—þ4FøƒŒ‹’ÓÇá~@žN5Ÿ “œõ뮿OfÇЭD$g°9Ñ|{{ã Ééã–bޏÈÀùõÑ~'°Qüº„b“×ÜhŠROR®4Bù®2 ¢ž9†8÷O|´ =?†ºmá@ÇÌëYu#8)N>CCã[ß \ªˆÇ‹áÑóO࣠øtá?®½EöÀÎSø€5¬ÉHÿ§ aØàþ® 1ç1ÓØcçƒ×D-ã|¿¼ër¤§¹ëøœh¦R?Ëø h|]FõÀøeï^R?Éù¤è¥”uô£ñ ÑŒ”gøsõÖµJAèTïÕZ?‰|ÂZŒ-ÿ\ ˆþÀÑL–‡\¤þZÔe·ƒêú gEñ ðÖÑGüÏüƒBPŒu#·PS¯”Ø*íõÑ>1¯u˜ÑüCa?mQ û¯mg{ÿ™¯˜Ð=óõ$h†syîOË'Eã¶ Sµñïâ?•šµœR›ó^¹Æ{_O®U­f p?æÎ‡ŒØkêñO¾çÑx#äæ×+ãÛ=AOᨠw?×Dk6 -1×<ð£óÐzd¤ô×íg §ð$è>ÐGÍ?©ÑÌ0sl1ÜÊG\ óÐ${ôú ë‰ö’~IК{t‘ÐñIÂÃÛŽ÷4öär•: §æ¯ù4Ÿý–ti§æ?æ:#Pœ€Âˆû?`g}&¾Ö¹#ëÈè>ÕF{ŽŸçÑnl¸µùaR²:v´%Áßü‰ÒWív~cÿöh>×hcÖ‘ÿó4Í…‹›yî12Ë¿éÝGE.g#–~‰ÒücOÉÉ*·ÃõÇë­*¼aú‚[”JGQä€Gã×UñÕZuG7 ûôÅ¢:u¯ªvËêÿf?½†ÅÁÓ¡#äp5©KIèx‘Ó~o¸'ȘHAm9ÿ]iUãøX”¤”÷è5úa¦‡ûBþÿðã2ô»¨oÛ/©ùíÿ"â#8OúëIpå]û`é¿ÿ4£Ò3ã9Ç'–µ‹P¡”Åtç°Sƒ'ëÓH:×M/û@ýþf^’uÿØö ÿ¯ âêAéŽÝs×ZÔú=ðOÌ i¿aS)„¢p2|ÿûh¦èt€O~OÛI:óL/zßò·òÆdè×R_ýŽ?¦?ëÂø¼ÓZÔódç=þº@.æ|Dv@:¼Oûh†ã ýÃ8þCcm¦þÐÿe¿–6¢]HcÿÃøÔ§üÎÊy}â1ïœëYy'ºÉ»cMù¹%’Ãi8È=óÿkÒÖ;20^'þºÆz‡¦—³·öN3¯Bºˆýè üj§ò8^ªB@V>dœëQ|w矖F»;%%-$àŒ¥öO}«ËQO²S÷¼¼œþÖ3Ô8;þÉþxØ^u»­!ÿz?‚áv©¯P?-jT„û¨+ät…5ijÈmÖÉõy8ÿS­f©5Xõ„Œ’‘×礦d#Ñÿ²?ž6èù®OsDÆÁ…É’=”µ.P÷P? UÛH¡P–I*ttë„$vÑùX½p‚z• u?Ö&ê~H;#þÅÿ6èë¬Ïz´GüOþ - ì¤~CZÕ Ù?ˆÎ‘Ÿ+% ¬ûò_ú”꺗ÖO^gXÛª9HíIÿåþxØO£–©=î(üCÿHÂȾñÿÇÖ_ç'ë¤bw÷Ë'ÌFŒ—¥ò$qÆ{`ÿßXÛªyxíEÿjãe>ùù>kºCò¨€Â´È$­#éiT¶Çw_®’¤óR0´zppR>]5¯ˆRBðH'ˆ8)ùô÷üõŒõNÓÿ§oí/òÆuú6æþ·´ÿ±SùáRf´;©$ŽÚÒj 8dö´ž)䣃ÄB”SØ|ûtÎŒ0zñv(RQôÿ¶±7U)z[Ÿíå•ú6Þúß'þ•Ô˜>b{ÿ6´«þÐò ×,£ŽQéPÉ+‡B4`¢@BS”å<°=úëê©ÿé¿çÿüã8ú6ÕõÌåKùÔÇ­UFsÐäÿ]j5fº‘Èü œþšó§ºAÏErr?ë¬ )I$¨¬Ãéø}5º«WÒØlÿ‡ÓèÙH÷ÌOåHÁÍQ$ò Qëü-“þÚÔjkèRÓäé(dŸöÑ”@ •«‘ ÎzŸÇGûÄtˆ<½` àõ'¶±žªÞGËý¦þXÌ¿F¼¿ô³Ÿ•:űã5'”#¾p?ý‘ÿ¦ˆfÌ?v,’OÿŒëÝåç•§Òx’¡×òÿ®„€3Ǧ¤ãAê¶eénŸµ±™>Yé_Ö?‚Rå*lÃ"È*ªxkQ“PVˆðÉèT@ëùv`pŒ„$$¯öu˜ €tJB1Ð÷ÿ]c=UÎj)ÿ7óÆdú5ér|וÏþÿ¤ãˆ¥ÕÿÂ9Œd(¸€?×DP«c&)HÎSÉÿ®»ÊÂ:§ˆ 9õöé¡ a<‡¿„|ÿ®±žªjJtÿc‹×è×¢ÇÞ¹®âOü¼' *äê2øê4C°r<¦:{Cô¥ôô( RUüdtùþZÃÔ‚U˦GN¹ÿMb=QÔž‹LÂÅŒËôoÐ#½JçþðÂa0«,$ü0'&GOè4Q®¬žQ@Áó”3ŽÿÃ¥@èAI9È>ãéþšÛŽ$/@0}‡ö4ƒÔýR{ðë•ú9táG>1ÿ½?Á0’U*­„©OÃ@#¨.(‘ý5ŸcUI— ˜JÎtªJI%CýÒß@pØ#‘'()OÓÿ:ÄÝLÕŒ>úÿaž6èñÓïJ©ük?òIý‹P|P1Ü6³£ ~qÏ:ƒI =JX=¿]*¸I! ŽªHêzÿßEÆyŽÀg‘åïían£êãÿl?°¿Ë ô~éjÿ³1üjÔþc cnJRJ¾ÔGCИ„?æÐ&Ûxñó**!JÆQ ùûÿ]+z©E8ÂqÔ£ßéõÑRà*%\Š—?ß·é¬MÔ-^Ú?åOðãizÒ¤ÿbŸÆ¥Sÿ^ʶ*©¾1ÜÇYþG_þç!Iö„ƒ¥J•æ×% ó÷ã¯áùèݱ÷O#’ ~ZÄÚóW7ûIý‹þl'DzV½¬ój‡ûêa.›Y¢T“6hR~ö‚3ú}5ŸáhŠÿøÊ‰õa$ÿÿ?Þt¨<:t ]qíó??}Eç¢3žßöÖÖú±7Mû¿ÃµèßLÿÃiŸÇyÿû0›µí…ÿuOüæš=(:'^ –{|ëa¥Ó‘Æ Œœßõ×¼rÏ%úˆÇOLãCÓÕêÈHôàöú blÓ3~õŸûmþ,m.šÓ”þí¥!ÿuOÿ/?€‚O¢ 4Ž_wáR?Ѿ9bTñîµ0“œÿã^Œ,’¡É(èGÓ¾OËDA<”JR8òÆ!ò–°›ÛÆïQ¿´ßâÆÊdùB)šƒòÔ¼”„ç%i9 ØÐçª,Y' íýþz(ã=åê N:ü¿MJJ•‚RTBJGSõþýµ­‡#ŒORy“DZ8=ôŠBŠ}±Üyý4`ž§)# •õï ÈHJýKÏ~C¯_`t=0¢HÀËÅ!]zô1¬R¼¤’ 9O,cóþÿ]aÊNIÈ«^ú¬ä}àÀ¦†ß¿ž^¤Ž<‚N9|Á÷ü±ú肆R Ò$§äF'ªVRyŒ…`a>ÙÑúå¨Bú+Ÿïýô0D À¬zr•ä¤dŽßôùkZ¹(„+¨}ãßFÆ}'$`p:~zÁ”•-$ö·NØÐ㜢€Ï`zäqòü?'‘=Ë']N>`èA#*r¡Ñ)P#$ôþ‡AÇ \±ÄDàçßC'Óa@ã¿rŸ¦µ1Ü•`’sÔÿàëaˆÇ.ÝOSòÑR„ŸPë×®~öÐÀ20\:ôI$¤ý$úHã“ü$ôúÿ¶‡¨îT@=x’?Ÿá¢$`q>µ% z°OOËC ðucQ)|ÿ®€‚8ž$û–?]R=ò}µƒ'Ž+ ÊrùgßC `À“Ë!!$åiÿ¿_뢬áW¤‚=?€ùhãÕ•œ öRÉü:m²pzõöéþŸßM œl!J8#ªˆütžE)ìO!ÄuûÃÜ™Á€È'X#‚EO×ßë¡‚ôÆ,ûĪùÛYÐBPïžß×B2R2sß8öùh ãÖ®€uuÉü~Zœ ?{æ=8ÇñшòI $Ž\ý4Pqœ$(wQ÷T¢–p…tV8õü?3¡€®|²‚;•¿ÓX :“ÇÝYÏÓ-R¹(ž£'¡÷/ÃX# e*IÉ?.¿- ÆòQ8dtÆU N2”‚¤ŸnÄlëE«—:§÷Ÿž°’yסúc¨ü40mÇNJÂrž¹Û¿¿¶ƒÙ?uAà‘ÓA¡È<‡\B’¤ã¦Šz( « CÛC)RR¬õÀÀ þ=t)ô+É^>¾€ÿgEd¿®q ö$äèü1ÿMp]θAʱÁ9I:/2’Ó<½E9ã?/õÖR°¡„ä äŒcFâ’ÄågŽ×CgGP)(è@É{}5˜É8^¡Ëµ’¾œJåË®¼Žš.HVs“ƒÉ]úûtùõÐÁÁÓÉ\RIÏpãž¿_ËD!>ž]. :hQ„•z”µtÈR°Gç 9V|p¬Œ”õ??öý40DL!A\H✃É#'ôþúhÊ*IÀ çÕÔ}¾º0ÀNHãÝ dœœþ}µ¨ú²1ì<¾>çßóМ(ñž…dÜ9=þ΀(€pr³òÐ’£Œá*+ð_\×;ûhV ””+¶t0QÆuÉÉQ'3øèyO§ˆ`Ž¿#ýtR“Ä}3×ÓÛ¯OÄkL¸ŸXä‡|ý~ZTàR·HÀ*W|Ž£>ÚÌ€£×ŽN8ž‡§ýµˆÊB}(޹÷?M˜JHJIè=ó߯M '|c`ÒSÐúzd}·O×BV29sO#×Ó×éïò:B»tWc§Ïç¬AÊG.Ÿ3òÁéýÿãCÉÀôÈÁ V0NOãŸËDàr )9$Œ¤Q£dã'8äGNŸÙ/Eg)Q䬣þ¿éÛCñëƒ4¥`ã!g‘J‡·s×X«¨ýï~ŸöÑ½Æ X rà’@Ͼs¢•(€xç#¸þó¡<`ØõÆíÓ9ëÄkZS„dz€Éôãûý4d÷ô‚„ƒ” `bH<Ô I9±=‚žqŠè®@$ñ éƒõüt^YE%HFA#¸S£œž¤£©êžšÁ߈”¢:€ŸÃ:9œQP^xs#9ééÇûèx‘î¬ãJöéë¬Â€WÞ!ÔQ~‡Û¯ûhAIJqЬûûë¡‚ˆ8ÎGúOYöùh¹ މ*ÊNt!$(+#-§ß'·ãï¬äTrJr’’=8ÿ¯] /Œfêˆ%@¤£¿ûhW€Èâ;”œõÐkeg'¶Œ’¢°WÄŸn¿§é¡8HpUp'9ÁÿÇX¡éIP*åÛ>ÞúÀ“‚¬õôAÿm YQçÔ‘êVN=Ά 1œ”<¼TO§ëùè¸I …”‘Ødb”Â9,c—c£eD¡YÀû£ôÈùh`À8!)À!G#9WR1Ø~ôМq €êOQøèyeIÀ)=ÁÀ?>¿ÓD9ÊÁ$)•~ß÷ÐÁœCÈ9q( ‚}ÿ =D©=p_m¨ð-‚NHïõÐ'<“úÿ±ÐçÀœ d¶NA:+Dž# që’;ŸÓX£œœýëõüûèJB•1Ç}‡M 8ƾaÊBJS×®1ôþšN8cÿr{ûàèyqõ$d†ÊÓƒÓç¡ N £Ø+þIÑࣜ8‚©\Lcß¿áï¬õ$•tqGÙ#¦=ÿ¿ÇXABxör êOŸæ49âH'¡'™åŽÙÑ`7ÏâÇN*'$ßÞ4\Œ˜RORÓ¯}aBÕÈ „’¢µt?ÓðѲx`ñÊ3— ËGØàÈ8*y) -^¬ƒ‘ŸÓ§áÿmSÔ¬•(ûüè¢8+¡äz…$Ž¿_ÇFë×>’Ž¥*ö?ïœè†çPV 0Iè ì1­`ú€J–£Ó8ëúõí£ J3ÑG9#9?ØÑTÂ\W@ : *$õO$Œ,|³ï¡')INH=õe'§ãõöÖ`œ¼UÔuíÛ#¯å 8F‚IꞘü¿¼h`¾C%CÈ΃ïß®„'?tp$þ§?OmaVpOLá?/ükÏØ”ätéôÐÁ‰ -E-’®½ÀÏëßY”œ$§'¹?×?-g"¤ä…¥a9Vé¡Rˆ>’ G'ŸõÐÀ"N@òQJN $õÀùNÚÁ…(`qƒœüô>¢G¢®˜ä{ÏXByŽªÀÏaßú qçaŽG—©'¿maVFzåC<€¦:d~Z¾¤Ž˜>ø9þÿ-s~Ù¦4©+z©NB ¨" çÆ£ -J)ξœ¨ƒŽ !Þ%– Ÿ‡~ß>ÝðaÚIù|¿—ù÷ÇL©\’¤¤œuFUÓ#ßôÐ’^)è’~gçú{~#´û-¼Ë©}§ÙBÙu§’´+%$wG|ƒ£$$©IÊO§=×K‘ƒOuÝ%8ÿÈúh Šý˜}ÉJB€$(õÇÐ] IâR9(u ž€w꾚"RJÈPR† |÷ÎŒTxÄ;OOì÷Ò½p®1™8)Q%@ô9Ç~Ć…$•„¥I>G™: 'ˆ ò8 £BTII'¡î40Ÿ_–%]²R¢F?M8Êzcùzô÷ê?1£ä“‚I@ÎUžÇñΉ×8)J=O.¾ý¾z4ŒÊ€Iô¤ŽYß8Ï÷ùhã‘åÔ•Œ/ íùëXþ"?9<?ë¡ôv!>fxœc/¦‡€¦JO¡@u ~¿×EC#°•)?ÓAÅIç”’zœg¿¿úk HàOUêéÓéúgCÓ çР‚°I Œ}4Jp;§ïßÛå¡9 åÕ ÆÈ€Ö))Â’¥)J#ŽÙöÐÂ@ç$`Dc¦{ûè#8 ^=¸ž¿žŽpzATHû÷Öe$ñP89h`.^”Ÿ¿ÄtJ?‡¶°žD¨§*Jr=]‡ãO VÇRq“Û§Om=ž8ÇSÐ`èz`sŒ:‚¬G'ûë ƒË=:$à|úƒøèA)RBTßQJ}(#îƒÓ¦† E$z‰ $óöÇ\ `Z¹……åƒÐüÏmâ9’’S•±¡}ìò÷ö÷úþ2 Àgԑž¿§ë¡)) Î#¥??üëQÐŽ'ï,¯õý5‰iR’®XêœŸŽ€Á0“Á á“Ô×/ë`¬P€åÓûÆ’Hð®[ŒÙ<†OËùþš¡ÂÏÜPüÏë p†Ry«‚o’²s„’te9”%ÀPPR•¡Æú‚…')V3ò þz/˜©²y‰X˜ŸÃÓñÁì}›£ŽÓóïƒc’.xìr?-H€ÎB•ËÑžiqE rêPz}?ßAéê•,e@qR}¾GJœ& c ¾hl«™ Ϩ`|¾žÚ>FFR@)ôúOCØ{üµ€‚@I$…|’;û÷Ñ29«#¹Jr†0ôag#§ÃçÛFZN>è<~cç¶>Ÿ]z)9 ŒÄv:ÀpRTµ(”Ž+Waÿ~ÚÆ(r¥(…1Äu:ÃéO$œà`ûc'?Ó¶ƒd(T”ädc§ãß:ÎXdòOd„§û?ë¡<àzvJV‚8‘Ûç£(‚ ‚Brøè pAâ® ޏï¬ä•F1œ„ þºp!eC ÒèS5jªI‹HejKÏŽ¿»AJù¥'U/±>7n„Vœ¸7¶›’Ì¸é´æ“Qb¨Ú™f©ç¢;ñЄ„†]+}µ¡’\G"H⢘6±×ÙNˆ­l/ÊV$nP@"Y‡Þ#™ò‚`1çi ­5ö_¢*ÛüUN©;Šj"Y€– H0¢`1çiSpDúpœœöñÔ*4ú<'êYði”ø©GÄϨÊC 4x‚·B@Ê’2¢;êø’ñNöÝR`¹µÊ·®éé‡S•uJBŒ¦©±#¡)AUÁN|C‰BÒ ”„‚®$gL•±âúï³{¹G¾¢ßùöµ=ŠM^¯µ´6j•I9`)¨Ðã¡¥´µ+Å'ˆO"  :Õ(ºrÔf¨Ç» ßL.¥ {Ä)€ÄN›ªúDê4Ëi;T-ÄEñ)+0•Vd,DÈ ˆ™vùÜ‹².“þÚËŸxé!Jr©'n]nKÑeÎ.§!)BšZV—BŠr’‚R ôìîâÍÜ«MZ&Ý\‰M7Q€¨¬y-­k ZÔ’§QÅH$‘ÜU/„ ÷=¹cGÜgmBŸ ¹R *¨Å^EZ,dIn3åÒíCÈeÔ!‚îŒ8âŽ:´mƒm£G²Mß%‹žMRQ Ã—vHb±-†Ú@RÃkXR¸‘êF2= ¤æ·7³vv €¢ù¿ªJ÷XÉ=Çl\‹o‘R¥MªÜ€®;vÁ$m{(i&#¼’0Çx¥ñSUÚ Ve¯`С\Õ áÒ—oA9¹TÊJPáK‰–ÊŠ\òÒ§V HI+PÆ£ý?ÃŽåJ¨Ü{õ|Üqëpî:m2¬Š5éŸKį9HzZTJ ¤%QV®S)%=J‹Ïâ^´> ¬ºÖõÕ¬zEÍ"­vBmí!ñNf³RZ\)‘.и¨[M—\QBCJ!%- ¨ê+í—ŒûÄõ\¶½é|î#kî ƒt‹E4Še&œóì©~;¹ m°†Tïµ—QÑIA@óïWÜW§x–õز<5@mªÄ@j°--²š1Ä#êlË+ÏéÖpooë1§J•*ÍF…*dâU5Wnï(î®C¡€ ›ðÇâÅÝnëø”ªeùDÜ(öÕ¡)€c3\SŒ/Ëu¶œQ,¸ÊïAÁEXÌÜŸ»ñ·»œªÔé´övæø­T!Ø *š¤@bžB%4á-6쉅À¬€UÑCË=ÒjK[ãføƒNÏÞ1èë‡Ãöçͯ[t¿&DÈÀ•O˜ó¨qDµ(*0>£Ä%Y%ACRÇÄÑ*Þ<0V­oÚźˆºkmضÜ3X"{¯8™ñƒ9Œ—a‚Œ¸PR*/Ù–Wš]eöT–òªŠ‚ŸÝ©úJ>aµˆ‚ Ï+è%Þ‡£©ôzØšµmoìÂî Qœ†“â8Tj*ÊwVa–®oG‹ëÞ•ÿÔ½µßÛrU>€·0¬ÛVc”ZÜ9šS"'²•„ùŽ$«Ö“È 6عo[wqnV÷Ýiöá76©K¤\5v¢I§S%,±¥¨-¬¸ãh!¢|´’N3_Þ`y*S|”’•'Á„¾eÚ’û/cqN7cÁ%÷qÊùÀ Äwr8nÈ_UÚ–lÚŠ–"UQØþŒ‘æÛÎï(’ðx’1v· çiÚ0«’ä¢[Ëy%Q>ש6Ê–¤¤­«* *@$ ¤üƾlÊáÁL¢K®«8!id‘e¾%QrxšÚÚ £lO´èWÝ.ì‰W¶÷F]r#0›l¬¹Ë’ÂÝG”ÒÒ¿AXõ„ñôÕÝgözx·‡6}ÉTÜØ”ÚSÕ¹êN1£(§Êh-ô…—U€?„jr—hÉ…‘ÙŽÒ=ûÿyðj—A[c^ÜüÁ†"}O$vçggh›ÅV£5&»t=.}P“)‡d- uï).,ù~¢÷,3è?#«¨ïNÖì>Ù±:þ»à²ý]‹ ~[Ó]ÂÖ–Ú*R•‚°žEX (‚N¨cäî;ö†æ&âÝ}Âv³¶¹J§M¦^î®32!Åe-!.£(u”‚28¡$zu­;Î庤V. –«R­U]øÊŒÊÕi×CòõÈp¡Åqæ¥/=:uéÜ 2Ѥ(gMâ8Q$ûú #“òÿ×w9½¾X¬Gs$ÙÿßA{«ûPbÐÃðl¬¯ËžÓ®´Û·f!¶—QÏE$$©)WßÉJ“¦³l?ivåȹ)OG¥XG8É­[Ж⡞AJÊ2´$ ŸWUÔ‘ z)Ö›{·X·Ã7 qU+r:‰uªœãqåÕj0–YnJX!¢ú[ì2´¬+ôòmtdnW†k­÷ªpXªÛ•úx±›® EPuip­p$¸Ìy(_§*@ â/_¨¨k ¶•©R¦H©Q‚€ƒz tppoUN`žK}¯ó¼¾æ¥J–n´h7œ°V@Ü6±•†ÜñS cèæÈÝíºÜj{5+Vê¤TcÉL¡©Í¯¡NNQí…ÿÂ~ZrÎ Q HG¤yƒO_Ë_'6ûW&Ûî}±C…sÖljÍfu)ÇgQÝT5ü,´4ï/%i)Z“Ë©+hョ“ãËÄÍ“U«Zô«é5Ô––Û© ŸÄ3,´K#ÉR8ùa ã$duŸ Öëv´ U,À‘Ș2'Ú?”s‰Í®¦´¨6Õ*Iö‰Âyò˜1w;Éã{h6'pÛ]ËrÐjʇe.¦ôDªús©%É,-JÃjJ›âS•-*2P¨ý¦” ¸«>Óèh¡˜(l-ÃÜ!.-* œc!'¨ÈùðÝï—vè_ôÛçv&ÒëuªD&âÁ_Ç™ Ç*pFXl6ÉkWRœ÷'$hÖ¾íÕ·f»J®Y0-iµª; =·\KL‡¢²Rã~BÞÊŸZ@sÕžd%>¢@¯57Q+iûꈖEéS]œ"ït¿[Þ8æD??׿VïR•¦ëu 5Â(?¢•†Öän=Œ‹ÞÜŸÚáæúÛõ­zÕ×2๬ ¬*sËq¹ËC¯Æq´óu@$©|IW`}Î5 ?gý_mv×üvÞÓ,K*I$Ôó§ùȶÚ*)RV²œ')HÁGPzî°“u*ÎØ—4ËB=VªŸ‹¤QÏ7ièØSñÜqm¨6…IKR¬§$µ[‚VÍÈÕ¬ÜÃYjߌëH«ÅiŸ†ûåee¾j 甎Ø”,‡ª&£¾ðª°£H¢UY ¸ó‡0W¿ ´ò®á z©ôslÀTh ÔƒªÃ^ÛƒžS¹…ÚyYúˇâCc§6dFÜ»Qæ[h©Åµ<(W‘ÓKBIì ;‘®ÌMêÚŠ—’!_Öô’·B[ Ìõì1Žþß ïÓ_4J~èÑ6ßrìkŠ ËjÜÚ‰µH÷ ¥0¸ó)è›çPÊÚmE Ž#-g% €“¨Ùc5ºs³í[zuBDßPb˜êÊÙŒÒ<Ç]JоIR*Î:OM?iímešdU/®¶R^JCîX) UWs+²d0æØkÑs”S¼¨‹±Ëí*ᔀåSÌvÌܦ6±Ú`Æ>Î TéÕhé•N—s H)z;ÜÀÈd{d`õö:÷ +ïp~šùãðÍûDÛv£×m»ž§f®˜Ê[zr¼ù0¥„qp%° VÆRÚ‚^Št'6Ãexáðñ{Dˆª}õIj¡PNcRœ–儦œ)Re*ÁëØtÌ'Ì«f™zW©E¨–çkÄÇäHäsß·¦&™nmg˜Z¥@v±”h‡U„žAÁ È’ï·]kŠF@â;9ì=û~:. œã‰ä}%#>ÞúÌ-ED © vÀü4d+äSÈõQüôIÀNI$«¹ü40}° RŠÊzõH8#=ô')'“ž¿"}õ…A\r HîUПŸ÷ÛF} …'§Ë¡éÛÛ`@œk)Y)ÇdŒã—ËZPB*N‚¢Kô7J[HpÛíOà#ðQ×­J@$w8êžúÝGyæeÔŸC0—E>CX¨G„ˆÞR¿v“ÙjzK9R²ž,Ž ˜î§¾66U7»T¦LIÞ§“IƒÓY §Æ]°-µ9cÆÓéÄ’b‰÷ÁÙ†Ÿ!L>DgšýÛeÙ =¸§ø[9#Ÿ¿^9èN¸õ²£SˆÑ⮓Ëe/¨>Èò’’’ïT¸B“Ô©qÜ{yß–¤—d¾âÖáP+åêRÔpJ@¹Æ5Ù©Ò[¦5OˆÄºl÷ [ð>Ön˜‘†VQ‡ #¢Ç˜•'8VB°q–kÊ6Ôó»q{p|jŠñµÙò›B¨=‹HÝP’çŽä&­êÖ|¦±µ¢<$+2¡‹}ù,OË©G=ls§" Ë‘©‰r’DVª&3È^}8R²È>ç§¶-!™O†üµ#™SNGX[jm]RP¡ÐŒ®%] ]" †‚ ‹†ï  4$ùc?ûøŒûkªâ‹P©Ñßd¡q‘"€]Ì–;õR]qNƒÛŠÜÂ3¸kfVx‹V¯‰D @ ¤¼+¦’ª|ÀŸ\k VY†RÆ=•CO•hY`ä–qS‚q ¥J¤õÐ%X* Ç?—÷òÑz’G+‡W {ÿ¶Œ¥)#)ÉÀNz{ûKùœG#P”õåÄãÔ¡’?±¢àŒŽ#îàƒ“<ÉìIᎉ€þº(+HÈI¨?ÛCÓ)Pu$ë8¤’¬äç¦UÓð) “Õ#wûÏË^uΆÛÎ0fÄmö›=ÉhJÐÙìµ$œ¤`§§M!ê%1,cñ1Ï·?ýñŽ¥JTT`nHúHýÎ=GõJ’Hè}¾_ްBO ¥8Œdã ç’5|MxŒ—³{sI»l:Mpêµë¥øìǯ±Â;!—}ð9€ê’Û$£*RrqÐ×mwöš]—Uõm ¤¹,ˆÖŸø^(ºZ´¨µ…ËSmž+q [kÃC-ôm'9%C|û¨ÚoNÝ5‹³J)u {y‰#•^ìÚIˆ6Ô}?]š.¡TÞM5Þ¡Oi`Än#Ì«ÝÀ! a·+||AÓî?NÖÙÛÃoÒ-š™:ùm>$AMÅ!õ¶×Ĩ%hJ%ßÜ¥K $•œWîìxÕ±©k¦áêÑÛZí2ªaÿˆíbÇ“L­Wb7ÅËŠe%¯22 RO%ræ¬)#Uý¼Bð·/MÅ“u 4Å_T™ÿkÛ•±K1ÔêÜ[Q”Ñyg#©O§¹'L5PS׈&¦Úhòa…5åFBPÊ‚Eªõ`Ÿžªì“'Ëõž¾¡œ=O1¢M2°ÀyX´JíÜ!a”´ç¼®–uWëJ57TªËQ™K4ÕHT ŶʷÚPJ!`*("Ì,ßW}ñsØöõÙµ[m*›zU>¡*m(‘/“Šq~S…¢âÊœËd¯±>Âê¨^-{mSº´ûvÄ·.Z}„º­!›NAŸ!Á’ èNBÞàJýúu×Ï~ÔÉ„‹·ef<¶Ûn5ýESËCEÔ€òÓŒ,'°PÕ¼xóñ-¦Ú?ƽ(¶õý´i¬^;‘dÝ›M‰õ±:Zd¤;!¶Â””RžœŠ…ů˜dTi5¨eDV;i¯ p[j®Þþ DúöÅ‹”TË2|šâåí÷ ~m´Ð=Ï•T,·$û÷38h,{Óq¶Þ5ÕOÿêVÝßPeWÜvâzôãGvÜ¡ºÂŠ”Ë€:©.áv2í9®\­ª‘RmJ˱ª ¥d!~Nå…#ÐFSIeÙC©®.ô±uÖìæõe·h“Üš©4ÍkËLÚWœ”•%Òã-…d‘ŒP×'êíM­ï..žYµ¬6RzDñQG<#;@ä»ó÷6š|9<ϬµWRs+›ºvµA²¸_Þ¥>Z´ä±ò»°ÌÕb)í4¼ºåm´°÷Ë`njàüš„Û>åb㣮ŸOv¢`®4måq{Ì!l©ÆO¤…¤j›ï+z¡µ[·ymeªM°7éy;i¸ŒSÄèMHæÛ¾bÛièüÇš‡HQòÒœêÕögÅ&À)S­zåb¥R¸aЗ1s†Ñ+Irq ayoÌG@®äމå¨O¸w[0n«º•u&ò‘J®Ür*ö¼[&ÎbU>—LzL„F‹ƒ-%Å¡ ñR¸x+ÔP®!ó¡Z¦ÿTj¤£˜8{Ò„Hh&’ÎJí(Τˆ)µ™î MúeÔ<Ÿ5§f•®’ãè•gÀ§W-+16ûUÈÒ¾"mVàíA×›+S‰KJYÂ|Õ„œ`¶ðxÞÜmʯxg½mjÄí©®øp­Ö¦Ã‘J„ÕEšÊjJi2”¥¸×6ÓJiMe\üÎXJ“¨jŠæÞÔ ©mÝÕúI< ‡k*L,¥+Ï&ÜIJzuù(e=uT-S¥ŠUýkV¤|:ÊéÑš›s€+‰JZ~2Öx,w‘}vKi]2J¤<› Kq»ïpLr ù{ÀÅðùî¤5^±vÜñ-Nß»æxŽó>ä÷Ä0ñZÙ»Õ"#Ty7-×V©%!¼¹¹u!!H ’ç~DôëÒAøGÞKfç7}Ö¶óü]Vzé¦Õ#A‚–cðà‰–Þ[k(QK‰ 8 ôi“ñ9GG»7jB‰QN¤^•HÔÊlÇ̉mGf[imqÉRÒž)88$œi/l¢| U¶å²ûôxï>Ôˆœ”–Ìw F:+$1îu’¥­µå"›~ÌÇˈçð‰ç ÿqF¦ò~Óq“óæ~]ç/k?h®õɽëušuÛº¤‹ïê¿M»ò‹\äÏi’°îƒKéÔyeIÔ0݇'Pªwõmp·êÈ‘VX¶cÌq SÞ/¡_Ú¬%¶–ûÉà’ëøé¹Û†ªu;†­X 4ŠÕ`7OŠ—Ya†ä…)Ä·…çÉBJŠ{KKå›>®Ô¹ŒÌv= äL“WÅ%Å%¸Ä¬=Ÿ^~ÿ/|÷öy~_FÆÑšš…$~|O3?ÃçŒ×wU.®±,ü½8íü»—Á|7UráeÊýÓ“W²Ú¨=M§Ö”À[Éq„«’ŠŠq.O¾}_1«d³ß·÷{u/-š¬ZèööÒn-2Ý NuX}öfÚ)2œzG"¤¬ÉSÏ%âIO˜“ÑHëU^§nÇŽñöö;Š•…-ÕÉ€†Ðq’¥© HÏR¡ŒYÆÑÔY·¼Hxž¯HumG¥ï-d§cE[lÚJpá¢0£„+眃¨Þ¥Pn÷z€¤~¤“«Âðï6vþøƒ³.­Ö¬B—nØË¡Ê»«Õièe3[жYŠ™2–2¹2$¥‚ãž®ª ΘÚY²P^ÞÈÍx~·äî]áº*]²ªX´w¦Cjܨ¾ã²":ˈT·Çù!iâìyAI?»ÔoTX唳t§oIÕEbÃyaÏ—i¾ï<íï„¶§G)¸Í/b‚̃‚¤Ä€DÂÇ>½‰ÅmP·Ö52Ô©"•.ë©ßoMŠË)æÝ‚ÊÐKˆ[®¸žxmM …õOC¤uV‡}ÓinW×B•pR«ò—.§CŒx5)KGš§ØýØ*p•qÇ!‚4±»6¢ê³§]v¬½¸­Ôd@‚Ô‡÷ A‘ d„´—%´¶W€§¸„—Iè%Øêj§Bºm+më–¯:«ÄJ¡Ga–Ó%KuD.)â¦Â›PPl…{V—98ÉC½ xsQC“¸ª6²ÆÐ¦vS߃&¡|’Ã*·zöT!¼Tó¸3*N6%Š«½÷»óež4øÛ;&™.ã¬RªR¤Ú•ZDØOÌDÖæA Í,‚Ð|ܼ–’VR…qs¨H†[ß`Òv»ÄÞùí¦ÝÂY‡gV‘lÇr|u³¹m¡“- XJÀq.2T¿ýTòÀxÕ›øÞû}xkz~ßE–åt‘!‰6ˆÍJ~$p´4µ$­çi\€ëÍ!·’œ•0êiKm $xÔßZP¾l®ŽÑIhxtÐBšd1r\L{¸’Á¹æÍÖ^U•iz”-m…*©IgFAIˆ† ©÷àýÁ!Ìu»úÍR2‡O¸mÚCî³wTi«Lg•¯÷Р[[jSÈ \ÉH"¶ßiè—­J„ãv&ðÔdµi\•z’©I]òå¼JW(¶ë:V…tN0­hÛ Ò¾õF¯Pf·sS¦UèÒ\ÈëJVÒ,‡YW'BAFOSÌ•q:„å×KÓF¼“±i£³ÔGBÓæF'ió0 ›HQØ¡.ô¶°ÉíÞµ:j–QOÌõD%^] %X–e РŒY/‚íñ”åB%Õµ6“”M¶¯!lU¥î]aÊU\ErBÞŠRK«Vç­¤(IêHÜ>3j;O^Üͦ[»¨»ƒgÏnŒÊ¯+•ÊtdCZg@ÉJÖ‡XI Zˈq` ?~÷†þ«þÎëV34zþéìí©Mj•-*_­8^eICešc:²ÚBŠTYÔJ”Sfïn 7{&Ñ7Ò©%ˆW}Õì-ÜAŠˆ°“rÓVÅðJGІ¦^{((c ^ö”S1Ì·\SÚ&©–C»a;ˆÝ0Â@o”‘"ÿÌ2·±µ¤]ž²ñ»qApVVS´9&¸ä]}“âúƒ@°ìz–÷ÖcŠí÷oÕ±Q³m9TÚ;8Û..0åðî0êJJÉ8 À ÀãÕ¼pÊ··Z첫»¸?àê:-ËÆ•¾ª§28?Äá¦XQåÑkóЬ +×m¶ï¶öÇbf_4 ‚³an tÐ+TÚˆv;öíaöTû)yH I(s(PÏÔØÄÏ©ÞÔÝʾ\¦^WÕ)©÷ú„hÐn c/“¥N7Ë€t:ÙJGMŒtÖõÅÅt§iJ»P­æa»k1 ~é;€ 7gæˆ8nÎê-†YJ• ÆRHØà‡f…,dTºóêˆ >›6ãy,=ÍL–mª¢þÛ§ }·lTâ*<øKéÉ.6¡‚R}i%'¡¶ªûö‘^Þ"i×µŸfmÅëFfÓ¨@j{6]­Wû>²·°‡÷ó~ckVÊây+ÐJy* m‡ŒíÚêµ>tõÀ¿aAJ‘ MM”E¨¡®“ÆBQÅÅ)Ìg¤i¼[‹jïÅíH½•rÝ4‹¡¶£Å«Å¿îFËÒ›BœS)/))J€¦Ò<§NÓ^­0ê,¯WÜiö¶jU'–Ri‚€A™¹R‚‚A£ 9•Þw méV©h,Sòš˜bIo2Ÿ ŠŽ=16,Ï~-·Wkî«FÌ¥7X¿­Æâ ²á£ÐÄú/9.6bƒÎ&CŠe)!↜Bù$¤Õ2ÍÞ+z£uo7nê–àЪ’œ¤ÝS¦;8RW„ºámKR¼¥üA_…zºzUÆ Õé·5ÍNJéûû¶=Z£V¹n;bë”Ät0®O"DpçîÈY0€y‘©þ-;5¶´šÖà×·&­.æH§ÛjªÜ.¶™ )—Ìï-¢”e¢â8B½‡Óç§,9Hc!DŒ>ÿâ4eƒ•“¡ü'8¾?¦°æSü9ÁÉöütL‚•’Gep=» è`æ0% Ø%¼…$®°0¤òÈ¿—Cý4d¤…dç’!C¹Ç¿ÏE ©+õŒ=ñž§ÿ“€98â}'éí¡Â“½Ü`”ã·×XH=¹€zþÿ¯á¬ô$`ñP=A ?ÁùöÐÁŽØ×!ÂÓo:sÆ;JZ½C=N½HeÆ&Qี)ö)ÓZHÀ\‡cºó™ÿ‘*ý¾¼í¥Í‚ÒÀ[)qOÊmJÎZa>aê:õ_–Ÿþ_˜™»·í‡âcíêctI»t31;€j¶ëÒÝ‹"Auˆ!·[) ¦Úòó•©À1Raš†æ’Ô«Yþí½9àOˆnÃÙ)þ[»ó‰6KB«%*I÷«kÕ Èj­oÓf¾"±À‡§äÍy+#Ô°±ƒÛP}U«2ý.-®¯¨•åªð[ìÙ!Qª¬Ó,K7s!Ûáj¦ŸÌ.i‡Ê›2ª vj[ª9ÉvðõW ÌÉ ø¸³ËmÆ«o”DŽ}©(* Ž^„d´r¤ã#’zÕ†Ü3$?†¦³3â)ÎÈláœ”óØ…©$éR‡^Ú…U}úªíÆÀßWĶ*7†ÞFqÊ]6µl'ªa—P C…!Ôž !/#<åêÆ »wqà]ñ­ëµ4Yãßvë5ZlèQ¤ vÊ\q%¼„)\Òy|Pê¹ÄàèXk¼ˆåö·wE…•Õ+â½w*þ®!]Ax‚A8„hÝOg®º}GPÚ¡·,ÈÛ^ïmÊ/9e€¼+ñ° á1U¾"7{sí¿Ш?nVUl"ŽÍNÎUnSãEi÷¼—#Hl‚S.°´¸øS W«ñKQBñw\Û‰wÚ{w\6õÝaÝ1æQm4¡L¦E1)oÍS¯ý|!K_3”B€âu(|ElÁâ{Ì_vEbŸ*ΫšÖÕUi4©tù!×-K¥¾ój-Çšl8XlÈi>œº¶P|ííV³H§]{q>-:Úñíõ5ªãIcÍ}] qÀéæÂ”<ĂЀGTÖ™íÍ®<Û—§\)R¢’QFƒW͸B¸¥~òSǽBÐùvwÝ^Zß×¥BñxPn¥T©æV>!PªARÅ#M©r›LÎÚ†}Ï·Ô ÕV¬šÝBr]SÕ6Ø ¥ä…•'r5f§E«ß•7,ÆiÓêÒ¨§•=æƒ!Þ.py¾-„6¢3Ia·Ÿ~ëÕ7pì[n‡Z¶h»]j:½Øžëì96¯VÜn"b¸§žêq!,„ò_’¢zu6f£§mð"•¸D¨a•i¢È¤@€I‘·q/ÇRdº'%¹°kKĦ)²l%B,Ž¡ä(Úû(B\öæÌî­oííÓS¡E¡M¸]‹9ú"œöã¬Õ\~89‰)÷O˜†Tž )ôü/ø1ÛÅÛM»6¾Äµ/÷éï¥ûŽæ®\êŽÚí6ñnKGyilr 8Pߔe+= båÅ&ö‹^­[Õ¸‹D«¢œäjåKkÜ(5'½%qÖÛkDæ²dS’”¶¢K‰*'R?ß‹'6ßÅ-Õ¸4¸Õö¶jØÚç©õ»MtõqÌ×—*L²²W†ä$”y‹RÃN€¢z¤×Ô4ö¬ÉrêŸTPdªªÌw*²Ñê[j÷©æž³2Ì£¤Y*t¼ zT7"Ê*¯,R’–#ÔŠKÍÄ’A87NÉì}ë~S,Ö+=d±@»"Õ(–¥7oë-WdÕ•)¸2gCm¶\Bp'M ð R[)X/Þä[w.Þn…Bª÷²Z±iÎÒØ“ºôËR™¡ ç!¸R'Å2K>iKŠÂðéuYÏa|>xå—¶;ð»¥vÍZá³î}´¬Í¼#Q‹b`*}·#Hä zÉIãÜ(“TßðÑã®ÜñAâå»FâÛ5*“RÚ•›Úäv«"Î1Ç2d­¬4©MsÂ[>BO!ƒ¨¾{šu>Ô+Vjn”FmÃ’6Òo)äÁŽ=±òÌ¿§ž3-tÅBá";O+ ð7ĉ3ëß+ÞÉÝûz·gÙô{'¹Tª«*¹-[jVÕÒ.H4YÒR_{Hb8I9Zx¥ X ‚¢×ï§‚{®§Y®Ò6Ûd)ÛkmY(3à\«°˜‹=.ÄqRþ΄ږó6^t%• ’¦’9õI—jC•˶¥|Ñ’P,.Ù«½–VôC1…‚”ž8Rä'ïŒtÆ”{%V¸«»)f©‘j²nŸ†5fjTòõFD˜3f½ç0J]mjòV¨A̺ÚÐ$$e$ä1éÚ4u:u÷*°W*!•¦UËKì§Êøö0N±ô£Ij*Ö ´ØU_S¦IPw¶˜ûÒKpxS'lœ|þ\[Åó¶lû2¹³ä¸ãW­jЍj ÂP°ŽD%µ5Å+C $ŒãVá¾Ôðm~àL¿oׯîÍÔÒ [k-W¾Æ·éóÞuD@bieJ>X%×q¶Ð^?tcMÕR’i”T3Býžæ£SRzL¨Ó˜ªòg%ÿ…SÒ¢)Õ¤GqÆ%Pâ¹¥M€@âL,V¿öpìϹ¨•Ý»­ÐëF]:åA“—9¤£Ë•l´êÕ²¤rQ P Á#=s¥ôfšÓ™e:Yj•d!Ïš„;™ì¡ØvªÄ8Ç.hþŸi½h­iH ´÷’IŸ·TÚ8PI( $xÞ]…µ÷ئ/öÔV6ž}¦Ä©;V«>úª…Õ"4Z]hHukˆä‡YlǦx¶IÂs®ï™×[»žp³ŸP¤¥èµXKôI:ë‹äB~ò\}Åe #Ö8âut{9âÓho¨ nuB˸h“aP$QÙ‘{^Q£!T˜ÓÊ›mt¸ôQ#Ò=Mù8ÀBR“O~#šÆn­šÜ±X"=&Lÿy?ž3|5e«´d~=¸ÄÌðÒÅ*Ëßj dº”H.8¥Ç¢¼´¯FvDwQ¤‚ÌI(y”Fuw ´éÕæ·]Ê4+z…qÞ/Jb™&‹¶?ÄZ)Îʼnño¬:ûGh!°®=h¯ÃüÿñâlUì¿&4züÚ›sRˆËR¼ÄCxr^z$ñq¾ÙÊ®Ý5g‡¹õ˜Û³BÙ–$Ô-«’Õ¥»z®"â–f6–òÇB³Èáîcï"A mKâQ ÕÔ’­Ý2¾ÇðãÖ=£åë‰Bì–í»ßüÿŸ–"~ã_• ƒvé{ Pv˜Õ2lô T·%DR~ŠëM´ë €<´.cïË)R ¸¬¡Ô8ðóµ+·sn=³¬Ö®Ç£îu1«Rå®Ðî"&”˵ sžW.JSEE+Ç0V=ÁLˆÞŸcö”S"¥LNZÍ»R†²G­ bÔÓYONAÕ) û¹ Pçlæ_”»÷qâÙt¦gÜïÝWj==ø­¼úR—eZ  QÌ•¸J¾`k·‚mJ€¤ÉàI=¿ûsƒ¬jŠàòHhŽæ=Áw>¹³Ê»j”Ý¥d¦ ÕbÁné¾*í».±3… ¨²Úiµ¤—„ŽM¥YÊÏQ1éž¶ÖÂmVùnvøÓì ½‰·ÑíŠNÙ|]^mrZäÍBãùn$.;,º—Vë¼:¬()Uá~í¥Wh۷웞l½N©cS*riì²ÿ•a*ˆÓ‹)-öR‡’3å¼Òˆõ«Ý·ÜÆÙo t*Túm”-«‰éµj¤Ä·ºŠX‡y«'Ò ˜²R==oã¢N¶^µBh•XÝÁô3é`ÿ#Œ*‰5¬ü»{G¬þüuïr?Üsù>N^”ɤoô\´)¶ó£tèK¯ÑæŠÃÉ”Ü÷¤6° Þ ªKå颣ø‘¶îÁ Õ.µÒm«±5&¥tÐ( Œ"4ÊÂØt‚Ã…kkËp‚L Ó¬‰Ý/‡âsy)èØë^‘lVï4N¬^±¯IÏG [Ñu—Dšsn¥.,8§Ö·#2ÚÔÛŠ%D¨—U·7âU©í(Ði7bœÌ)Ž|<¤¥Ÿµ•8”“Åm†Ò8Ž€ô'¦u?üÖÜ —ENvâÛ´µ[Ouhõ$Æ™N~cmž Š Zy¥³¦œK…Ipd§ ¦ÉÔ”*jšLÍçåƒvn@˜aÆà+ÇÈÔi¦òAb-Þ˜Ztˆˆô‰9‘"Gx?¤íÅ> ¥|£d.ûÒÎÝK^oÙìUoËF¢ô 0g aØÎCcÍae²HY+l¥!\’86ÏìÐÝ 7¬ªféΤØÛ}§Æ%M™>àe B©ÉaJJ´•+Íì•rJHPJÚ_²î½å³wçzíD†k3äÞvŨ¤Ò©µù3O7ü2¶ðJK`œŒœ¨òÕŠne˶Ÿ‡Ûöµ4·ØÜMų׷»}jN®sXTç ;¼®~G›%÷pȶ¡žÙŽRË*hd‹5o ‹3(%ÁvÚKÁÜÀLŽ#…ÔÜZ‚ë‰N@˜OÀRÛ¥·¥¬Hy‚9y%Ô(º<Åå9î®Ô–yS]ÛÔ¤ßf]RU¼»”—j‰µH‚8žb'¼ã1ÍìtÕlÑ+Rðé¦à6Ào`¥D7q+´þ°1‰?S¿(ôÆ"Í5§\Uvé4vàÒœu [e>è[d¸ôVÓæ)!kÜÂ_÷T‹“p÷l“Q¢Š.Ðxfø¬;àI}êÚk\†$bvÆW€ä‡‚xb5m&ò;"°õášõ>¯I—ÙvíËI‘¨ÝMnðAó0ê<òP°B𜇷w«– Aê=ûµ[{gíTëŠÊ}í&ÑR™•PS‹JR„,:\JŒ©ey+ÂI挳ªš§[ç¬nÊÛº‘R;yy’Û1PxÜ7C_Ñë®ùOQ5|Ÿ2Òì&ÊTžˆž$Ó¨§o‹â¶÷I2ž‚Ïti½ßX£l;ôÊšÍB©¼òéŒÀ¥[&¨¹Öóí„‘ÉÏ4%µôIôä;ÁvÍ™nvÚÓk3%·Ã¾Û Õ0¸•àÔšuå¶ŸÞ%Ie²S”9Ž…9 ]§²n-é²­ï ¸7µ«Cƒ2ÕZ7­AÈê/¼Èfc‘%GDsäGC¨Q”s‚ œvçðÏ·—#£ZÖU;tbX ÅE·=.M¸ÓH„Šå­ÇAyÅ¡AA·TAô’*¿}dÙ:—«t›€ §qH0f%@ B‰<€ w]¦­4µÅÎ`J‹kŠUÃH,…XL‘°ùˆ‘ÙŠ;yãÕo‹+q¼>Ƕë´xn>Ät‹:Ÿ.¡ ¨È}§ZóÝ-6T‡d§÷<’H.r<4ÿZvŒšÚ+.ľD»†uM4¨T¸¨›E-Ùo| Û¼T¯-•Çh¥eò9ëcîuJ1·J±t¦µL]ÒÕFªRÒ%™’Ø P<šJ–ß"Ëí`…(–…Ì4=öY5&¬¡WuZµ*MHZ”Q"H2XÌn>¸‘]t^Ë2³KœÂíöÀ§MPÄe¯T³ j®Ü’OlNÕUkôÑsס\1)ÎWPª"Ö¦Mª¶dªB‹n%÷–‡BTQûµðs‚O–p¯Ù–ó¢æò­Í¿¹ä´÷—nÄ­íŠtÄ./÷•´•8ãê”–ùñOD§ ÞßøÛÞŠvòZn\5ºe÷mÑ¥M­n5­2i]51`—Ú‰ç¥8|€·Yl€òÆPu—†ÿYö¶Ü[[­Ob¹}Yw|úkT‡ìÆšóÈŸ”Çq--ÄóÊø ¥$¬(àŽ‡PíO{›èÛúfÚÕV ™{©ÚÍ»h"79àñë‰ÿMºmÓìžÚºYÒ W˾K»m2T“PçqáG#œWÍŸ³þ0.:Å&±pm­ƒLL:ª¦*}ÕyJ£I¢µ¨¡ÆÙ~BÛkÌuÅ–›m°²Ë!)Mø‡Ûú®Ó;a7zßûº™©UflTˆ1ŸDxQÑÂyRh¾Ó ¶µ)M“–À$á²µ> = ^FRài/)* H8Î5´ÖÚÇ7½¡]ÛÈ… ;÷h™ “Àçç1bÔÓZS)·ª *Ê˱"IÐzñòùa¾½ªR+%¡º7-ã}Q-&è2ãVé5›Õ~}:tÅ·%˜µ7˜À`ðLFÃ=—Ò®JRеò™pn4çfî¶©õÚÝÛ…K¬ÑX}Ï"-2<ñ&žÊÔøËžRÛÏš¤…j‰îþ³vK{\ªÌ²*Бš„Û»‘PB™pŽ 2áÍH -l´þYÚšuD[*AùÙñ“àŸs¶&UÝtmG/ ¨¦OÍ:䥥u ­¶ (v³ºÒTpú¶BxuÕ¡¤óÚÖå²ÛŠ Ü$C‡,JÜnXgΘ Å)®ôùÔY8½°¬ötØ’Êi‰%U„³è»Š¡a<ÉÅ?í-Á¹vƒ À۽ʪS(uÛú™ Ê-aeKR8º^ò”®)s1ørI‰)ä#WǼ¶·‡zírÂ7g¯º†ìnå±EžÝÓkJû="R™ýõ> …Û’c²¨Là©)sšTTJz³þfÞØ52ƒ¹gˆÇ*Фў—Pø-¿r—ILç\Bá¸yRÉGšžJJÊV0UšÌتfüm3U¸÷5¥µ°îKÉÛsxÔîôL‘ ¤ÜÕ¥·£¡…4—ZC¨\5©B‚[Õ[TÝæªÍ­¾Ñ(ƒJ³)ÝÍBâ£ËÁPcÔÚ G²/_(ÒT³Ÿní¾‘#nåA q̰-Û±#qb•®ÚvíÓP²voznÉW…ªÛ7ujÝ©ÓêpcÓr“+ ·Í\”áu ƒÄòå‘®eŸu[þï*ó¹ÓØßãjµ ©O¯H·"Ö~$ -«ÉHޤ¥·’…rS.D¬ä`\ö×þÍ/”I7n;«t7Z}½%A?Lr¤äH2¨¬³d„-KJ¦=”sSÄ©JûÉÕ‰_2ÓžK}Õ•Cƒ¨!”@W–m$ŽyÄ4ØæíQšáB3µ63Ýž‘RŒÇ‚YR¤±ŽÇƒ¸·§Å^ÉÓvïs«6Ý­ËcÄ r%Z¢õbÚ“ME¾Óm&DW¾Áç<Ò¸ž ¶ž$-IPZ„ð1»{_xlí½r¹P§Voy{‹W£Ñ. e5j«>º“ ¸Êðo+i‡8…’ÒCÜzS‡Mœ­SwžNúl5F¡^°¥Ö¨Þ𪱕¡l¢uKàd¥pžÜe¼\*!)m/³œ‚­7‹Q"^ÛyF¬Vmè·}&Pº)Tj©‰MnLÖ$:–[JLÉ|Ržéui'ƒOuÿ ÐÁåÖTÂ\Ief2€`IÜ  ¤‰äصô}¦s­ó‰¾»©¾  > € ÷“óF8~#ãoþÑï­/nöçz®¬°.mtJª=Y‘RKe•¶ÊÚ\e¸`–_mxa@s PBTqª´ñ%¼ïn¥Û´ªö›¿6m"m¿2㳪ö †Ó2§PI“Ta® ºÚï©´ü€P´;ßÇ>À_[žõÕ¸~­ÝÅ]™2¡MÛëÊ·1ˆt»˜íŠzóKÃ(QZ’¥SÔqÔå·¼Mmò}â‚ì:fØÂ©ѠË)§JCæ2™f# J<ä«¡°•qëØ«c/»»·³§Y‘‹8$.]ÞÒ AqTÝZ+Ý”gQ±¤À™ÚO¸>_S7haÉ1Cmv'µéeíä­Ûð§ mè÷k¨³')Š-5ª=%—dÅ€—g¾ã¡õ¼–\Àû,=Ì-ÔëæîêÚͼ¼@Öfmï†Äµmº–àÖgY¶„[2z .ˆô‡ÝŽÚTP¤¥ih.¥ €B@è7Æ®ñÑ÷ŠÓ²m­£v™{O‡]“:¡Tv¸Õ5p8µÁ1ÃJâœ+Iä…`{ôJxU{Ä.ÅøpñW¸ÛÓjÖ-M¿¨Ò˜«m,é—|§Í’¶DGSžÑqÆÒµ–Ö—^?»$§Õ¬Ù^U™eTZê­Wg¨Ð´Þ‰y%}y‘ß°I+̳,É–…:jª‚K¬“v€}8ÂO=„Q~úøOñi×ö¾Ø¼öÖ­hÜ›’ü¥Ùêìˆìª`‰“ìóó8¶âF2ÚÊTIIÆÔ”ðQànâ+bìºÛûÕhZ2n™«¦Ñl÷èOH©½!3$—\ *C yIJKƒ+!µ$dh>h¶öèmýGÄbìÝ •;f«R¢Sj7´E¸ËÛmÙˆNf:ä8§¡— ó˜B¼ÓÈ“¨U½ Õn±[ðËtM°¬Û–;RgíÝßJ•GfŠûnãÉ£"' ¦”ß7æ<·‰ÓÎ`ÙЫZ•§šª¨ä@bOXöO»{ieé“2S{£¶™'¹‚@žw2=ý#¼wÀ¦éÛ;hÌÛ+‚Ú߇nZMQ«’´•?ŸI¨ -",¨ª)um»É¢‡ŸR¼Ä)(R_/ăÿ¶~ÞQo«§nkÐmšÝËðŸ¹1æÕQ%¦–¢^€ÃŽIŽØžB#Ǹéo^«9bî»RÙ?²ïÍÙ½š•I«Ø×µ"Õ¤=±ç«É”>)¤¸Â\Y@ U¨kãÂÚsa/Ê¥ZÑݘw$kºZáuÛÃK’©(Á$aÞ<Ð|ÁŒ…' :tÛIo ¡h 7IîXmô$Lá°»=]VH1°öçßžÞ˜óxðëâ «HÜZµ“T¦íÄ A˜2*™KÎ>óÑÄWY§ó/+(.Ÿ44dõv7Go÷&Šê5õ~[·lKNòØHð,Û†ámh‰6]9Æž’˜«XóÚ}丮‰$¸NO#ªìÙšUêý©p Þ¦Åj]ëJ-Û1ÞW9M¿&0<Ë.¬áx$7õ»/ÚYxÄÛÍÔ´®IwÕpÒœ·ª‘(ŠªV‘"tz„ˆ­üG¹òR\l(8P„Ž ”4gô¼+ŠÀÜj)ŽÝ€°õã™#LmåuÖ­*§°FçƒÜÉà$sÄHž'"]¢ÌŸÍÁ¯ÒÓS´¶ßoì‰ë‹"š¶þ"¤ŠxLf–€¥0ùZÛàJ1Б… ßì¾Ïµlø“¤nRk0¦µY¹ªÎK¡VhŒ¿”ÔY}ÓŽ©óÆP‘‘ƒêÒÔñE°³å9a¿^¤Ä¬À«ÜÔû‚©µVC SnÂ~h@wÊp!xJ‚€ZÔRé±[ÇEÝ{®×¶­]¾¥Ç½QÕ*ó+ñ"<¹bŸLLg”’‰iR’+_îÐ9F¶Û+¶L™éÕõB7<Á1>¾±ÇÎ Öêâ¶mLЛp!`™©6Y¤»"£y’CgÌz0m´„¾8‚ÙP#‚T‹Þº¼í&ùY4½¥ñ ¸tK«Ä•XK[Óc´–j±£Ãu—P‰áGË}b=B#ް³ÇÔÑB;üå;þÙýþU¸ö®àѨ7D¨T½È³%:š}E+CŒ%èªà¥yœœP ió2¶ð¥7Ùê ]A`öíÅm ‘Øqê= ‘ëȃøáÆóOÞå-Jð©%€ìLñÁý G¤H3Ï /`&m)(¡\~B-ª<ÆbS.%ûEôÇ‹Ë fB][|ÛpåC®§_íÚšæØYÞ%¤E—dP¢ShGUˆp™˜ãíãÐâÁHl»À)em¤ƒ4^wÒØ´wÂÝ Ñ6¦©2Ǿïj…§žÄZ›U¥Ô$4‡$(¼P§‡¤Á)ä”pJ› ¤–ý°{Çø·¶:zиh×Ün]fÑ®Ðà´ÊWM)¦F¹ w—6ôYÌ-.‚#é·>Ì>úÙj¸UPLúyIˆØúÎ5íMµ«PFÞd–6Á‘о®' »nT¥Ê£Ê©Ö¦ÂûB¸Û±iðÌ—uÖÖ ¶K¾’I +æŒd@sl‡9Îí¼j-æ5Û‹) 9î!·©¾/¡€YIeJ-§RByÜöÔiØë¼ýi÷*Ói=j-X›~Fœ§*?áÎ\r8¤4y)=Õ’¢ 9 :ß»bÊwí ^¿8}FJ_„„ 2Èž#’¸ôÇÝ:‘¦Jùe|“.£fÈWÂD»˜ÉŽ6üÉÉ>€ [#Éhäšx f€G Í%™˜È™?²rþÎÍç{k|ES)UJ‹ŒYû·NB}‰”±+9€£Ý\”ïCÇ‹ ,¥(:¼¯ÈÛ=²n †»*-J©îc Q!Ò`Æ3$C›4,À”óM­<0ÈRU…¯œ çn­Ú5‘oÜ–­ÇW­ÜîHˆåFš¶y)¹ÉD„6Óå«É<€Vξ‰|+ßÖ6ëm¯¾Ó¨ÌTw»‘çøˆømº­ ¹,ßT<–¢8 ¼ïÒ ¹©oLòœå3ƒrR§Sí Îéhg)2A>nÀ+³Xçö––Юj2 ž›Hä«nîÌ(“Ü1"½¶ÖA›»”ª”—×1èìNšó޼µIŒâÔ²TI92T¬œ“ßO®î]•h;¹R·éè2©Ô«Z܃M.ÖÔ‚ =‡R]ÏD6CªΘ8ƙ͹ÛMÖµ·É®ØWdHðmwP¹NRTëd¿„pZ“œa ’Hèv¡8¿¶û‡\Ýûú³IÙ –½J‡t@¦5R‚䆞¨Cj#He¡ŒÆ(ä¤à%G–RGLWñ*fÂ2f=TwƒØOü1Í5_övaË4&I £¹ßñ I÷µÕ+¢¥UUF5‘%õD§:í5¸Ó‘äÌAŽ…!*H%8øÔ®ï™ƒBâ·£"-ÍCrÔ.ÍTÿRÊPâ9yŽ-+!'$(c¹ÃWyøhñ³Þ‹l\~wŽÛ§B’ 5©ÖEAµ-Ì!Ùrðª! àñô‚ •š;"ÐÙµ*µ¬¾ÒŠ!ñ<áTq¸¶×(IàŸ&âDñïζÚOÀ`ÔØšl¥\Wæû˜äÜ1‘º`Ž[çwz-&¡&’Ûp+–ôä¹2¸Ín ïy„©¾ œ+÷‰PP)RGLž¹w/yš¥‡C—>Þ¹%ÒkRbÊ´ê4ÚÓkn•(ó ŠHÊaæ[#9 lg¶¸KÙûn,+ßhîX«º¥G£ªLiô¦fgÚl°]Rã¥÷S—û;S‘’H%¤ÓêTÛz9/»~£tÇ ±KGÄÇ1œB]å‰H|¥ÆÔ N(–ùà“_ÕµÊ.®)›iZ”Û™1¸m$0<cÚ iÝ»ˆ}原¸¿¦,÷-Z/æ$À¨6’YH Æ" Ê»I`ÇoÙ„š°“qK¢Å\ùnӨ骇 #—Ìg#µ$¨€øóp´r HO¯§JÍɃÄ­·™}¤©¥Â-)'¿$+)*ÏSÈûôÕIÜ´õ9ÙVåkR’Yà÷ ת¶’ SÇÊHõ!µcªzc«]ñuâ½ÔÈÜÇ-èŒDËîјMR¥:”y‹WbpIð5Ú9gÐ˨-¥LÇ6©k—Ðn©^º€‚H …;£†bDxÄ»1ëöËíiÓ±§V«  ,[‚7v•Ú )2&1t[‘dX[“·µCx蔹6mqõ·V¥\RŒXk1¥ËçPËN äã>ãUy¶öo„ý¡ …_ÜÚ=ëo[TÚÛ6ƒ Ùî* z3ãÍ[M’èu¹(vü§‡-¤”/Q‚ÎCÛñF5—w»sÊDÉ5™ÏNi•¶¼8•¥ÕòBÈRT: óIìtÖî»´m­¨Rér« W¤Ô!\H[kv*“€Ròyá$’®'Ü$aé·EþTÖí¥ÛV½ÖcLÔcJÞÞ¥%û#æu­Z“¨€ajMâJ³H±Ï~‘”õsW'µÊ©øÀÈZªj:›K‰@ªÐXƒ»ÔŽqbéñ°6ÕÝF»m™7œwmº<˜TÊ=¯k1mÖÚJWPø‰$Ï[^[eà,žƒÌ'N³>>#×iUæö¿iå¿[¡ÐJ)­V«¾xL²ÚÜS ¶€®`$¥¥­$ú 5M6•ÓH¼ªðhT×$Å©O}¶ã7>2°V®‰Üà™#Nêíæäí¸¢ÈÛkOÜ0#pª¶ë²ZŽÁmÏ/àæ6!´+šÜIâ=(^þ•½ú7tÃOµ®`ŸÒ:Áš]Ö­Uš”ÍáÒðP3A õªAoÑc´bKZu öù¬)\¥¥vY…*K ŽË!¹PXqë‚ø†¹wª ÏuÝ[QxΪDœÂj›¯kP Ge-NLt6^Y^dJ[Í¥ ò@[cŠˆ=x„Åøf©W¶,½Ë¥Ýpîz”F—D›P¥»D©*G7Væ•Éâ¤ú”Ú±Ó´àÜïž"oëJ˜6¡·¬Ý uuC£ß-Ê‘6ˆˆ­Éˆ´OR†XZ¥8QHáËøuͯx+«øŒÛ{n‡U©Ú–þØPyK¤³ÚĦUO¥¸’*\’„3-Øî¼oîÜBÒJŠñæmMD5šµ´Ï@eY¥âx“ZˆU*QUa—qÚ6 Ù´9Ü'Vyµ×ºr…¦}nj &™®k¡­B*µM‡Ã¨ W#e-Õñ@`N=•WZIb•rÔVÍAÏ.] ¶\RQQ~It©•(¤€P8¨¤ž…i>ýS L«¦£nW¡Ûõj•·QêÖôfÒ•ÓV¶Ö·]˜Ë«äB’„§ +BÏQ“Å1ÃÇNÊî/†/Swíõ«qÔ¼=ͳaЭÈOÎ_mŠŠX*™m—+’PòUךZè¯I–ª7Þÿ7þ.ªíåÑnÀƒp7÷z­F†ìØ…HvL† æûœÕÌñJR~y¼Qø˜Ýù÷ª.=ê½oÍÏ»a-Ê¥kɬ3N· Äqå:ÄR†@.4‚pB‚J‚x•­wwF57M¨P¡kjƪ¬Ë× ;€<©VÝ÷·y™oOo5nQBÆÞÅó•¹¼ZIL0ÞjÕðV˜j®ÅiÁr¡˜ñÏ;G%¾ƒö’ÚµfÓ¨×~äUöú–7+ιh)ZhLÓÞe%A\Ê™å´%© àÖPz‚5÷ßÄ=׸> +;{·”ŠþÝøYÚ8°ØŠý*‚)æî¯±ËÍTgðŒÓP 9嬋,õáéUs~ͭóìÍȯ^¾ ·š«B­3 O[6ÔÙrWo¹Vœ²VåA-dŸ†BC**+$£‰›~;|OZ»áŠ“¶[%*,Zý6ðb³tW9—#M–•(%ÖkŠ€+QV”ž…c¥±Ÿd³Ûp¶ËìR)ª €ÀqR@+Ûq {Òš¶ÂÞ·]ƒ ;‡ˆwC ›O–¥eĶçÜW¤„£šcÁÕÏwm­ïRØMænЭÚÖ½×E¸ö~Uìˆhk¨Õ!¸hJ¤-¦R}¦’âBÛ) !:½ß»—:ƒ·jå÷ß5zù\¨ûž">>gZš¨-A³å©¼ 8á “ÈàPOŠ-ƒ¶l¯/VUýpÁ¸¼Gø¢ÊØðXB)c:Òâ´b¾Cå©JyÊ__5hòÇþ¡®)\eyöfr‹ëÿŠËB¤2šjÎì„ C À†'–>±2¢s¬ºÑ³[/ «ùw3pÁÈD †å”‚ p1‹!¹âo=ã[Ýx0×H°~ÚKû e+Œ¸ÉÏ)–ä¸ß”Ó~T•!rÉ(9)Éæ2u®ÛðýoÛ–Š¬vîK¢%¼ãQc¹M Õ¾ÈiÈqãù °âXÀRx“Ä'’PÇ«ÙG­Sëô¨uŠtÏ‹§ÏmK -)äBŠTI8!HP#Ø‚:®‚œÇÝ)B³„ñ@¿_ÏÛVGÔMG¥R¥=õ( ÒIÚ!Xòh=öú˜Ä3üÞÚJTŸb1cµ@IåA‚BÈí»Ó¿yIYv%«·T3oY”Ÿ±(떷ߌËî8’¤„©Õ­Å’VR„{kenç‡f>.IS锪i†ãUŠ¥@%ˆñÐŒ¬;&f ’ÚQç$6®eÅvÁÊמ2¥K=üÿ—ËMŽæ3I¸¬û¾Úr¡GLÇmÃÉŠ¶\e¯ˆæÌˆHõy.ºÉ)ÁPRÒ’ ÖÅî]c˜Z5½QêB¾SÜDaâc^Ó0Ì-nÖáê‰,7KÆddsϤwÇËO‰ ¡µ~n4Z-ÌU·‡r®Çí§mE 1Ýçùí4àH1ø)`!`p HJFxê:؇[¡?nAÛí̸$ Ô$Ìm\Ðd<óHx©n’ÙsÊòùò Ây¥¤ž½&Ýà~WªÛöuFÌ‘S’m§«wtuËK+ŽÛ§² žRmÆ%C‚ƒiqÎW=$ìוºjõ›žãÛÊ\·[ŽíKWaqÆ›%mIS­¥ ¬¶â¼µ´=JOïæ7“©nIeqkiZÁ)IƒË1 ·”Á&ybA–õ‰Æ¦{™Ø½j7ïTµE4ÆÔíó(0°!FâÍ£±Ú,‹Á‰ —q7Ú`]B›*.9ðéÌ6Üj{L³ Çe¸H,…-KS‹'’’Ø ô'MŽñ\³·^.omˆÙ+Êt Z•i±qP¨7*CTa)CãhémHRa.OCí„À„äòÒOÃ}Œ÷‡ì…º÷Fäí­R&UEFߤܸ–¥.7ómº} „8Òº&@ JJ1¥NäÜ4­ýñöüRnzŸµ´=¦“E®EbãœÑ–㣻k…-6€—òáZ‡– ©XŠäËhzŒ·l”ÓUWÄ>F¡I $@æAÜ 0"´õ’½ÍšÊÊèµÃ"0@*rµ$Éšj ‚C;Jƒ†Ãb··vl-¼ßJM¯Z•Fµw¦QjŸ%×ì ¥ÈHJÙs‹o´ôÁÉ=GÈŒ47Ünýn-±B·ö»pëµ›’à¦5NG²f>ì†J’µ”1€ŽG’”0O¾¯çf|9xtÛkÒ‡›î›^»“fÔ“1k†:Ÿo¢KÊmqŸ%Û®;!¤6ØsŠœX9:wúm‰am…ɲlC¥mUÓ[Š™Û{U¡ÑžFª=Ц Ò#8Ûƒ–èZ\)ûà-* Ô·ëš«„¢„ÖªªXð{Ï#±`0¿”r«ÆG7¾;ÃËÄž;ˆ1$GlQ¯ƒ»vNÅøÑØ;7qöÂâÛûÊÕ­ª¡yG»)ÏÇqÊY‰)H}æø©i^sIó®'+ Q:³íÁðs¶¿´"ú½¯¤Üuûzo^*E^Æ·‘›ö…&{,L9n!İò„÷¤ðR]KeM`,׋[kwn­ÜµgZ,³yY6fß&—A¾¬Š£Ï•Q ³Z©—ßxÏqÒ€÷A) WÕ×µ»¥2}øWݵkK~Ìrî´îjš¶`¹Uy‰Œ¿”sáÂ"\$‡I):jʇ6°vn(U4ö F É18•ïÝù Ì—LÔÓù5Ë[Ý#V]ûþú²ñÉ“Ï?tNÈÓi~¼xIðºOÑí]››s¤S¤Vm;¶ò¨šÝr 8qжÒÚRŽæ¥)Ÿ4­IÈZx–ÇÆ÷†ŠoˆêóJ]2„댢3uGîŠÉˆœ2ߪÑRImÕ— ”-Û––3woh§+Sw~ŒªŒ+§E©?bTÊ‚á­ã9ƒ )Mù‹iÆŠTÒ€ uå ©)Ê T¯¾nëÖú¹Ü¹š³ëµHpâíýÚÝÚìשRšw!QÒø 4ã T†p¥«Žy¨jµÉ´®{§óµÍó ŠÕî6•Ç–8Ȱ"J‰æ6'·¹Ö_¨òÓ–ÙÑ£BßpbTù¦~ñ>f“ë´1]«ˆuvlEÝgînéxe¢Öm:J5—MI›ŽQy§éì¾&6 ÊNT·ÏÄ'÷iA%€=$Õ®åÑlL¶kò…š*T& ³:«EˆªDJ„ˆí¡°ä„3ɵ<´4§䲿JýBHxª¾v‡ÄW„Ëå·nºŹÛ5bÑktÅÓÔÌæäN§É\WÜqHêXyJ(_˜Œ¤*Õ#pï8 ~ŠeJ$EÅ’"ƒyÎŒ‚‚¤'È/8ÑR‚Š”¥#mž)Q·4î þšenÊ ŠlP‚ zAã‚ ò<¤}ñ§c–ôï8Þô¼Jµàਠp#žxCy”;ãë›ÆOƒý¬ñ'´·r’‹?o÷ó¶¨â^ìH¡ÇrSð"-·¢Æ’óŽ# „¾aÄ¡+Y$ž=ƒ¨ÒöFæÜØõZ·N—dB¡]sk¯;*MÈ&pˆÙ RØqQSÓ>Z€V9«YØmÔ¹`låv\{fܯÖvd¨pë7 õ\‘\ å=SáŠln?(“#©ÂWÉ·“% 8ÔÛͣثž“¹—•gm%Ã¥Ú²êó^¦n„ç¢* û¾M?‹Õ!ß}ü’…(Ž+<‚’«×Ï_'¥S)jŒMRªŒ©¹–\ óÇi$bXÙU¾§ÍiçhªŠ[D/ P”îFÒ<§´ž[¿|HÍ¿ñQ] V.JíðåíT•xGeõ\Ô*TåÊŽªzc%/ùí,4ƒðÑʸâÛi Êx¤ëÝ´÷—ƒ«B 5É›mcDº¨•'—Lª;µH}Jˆ²ë‹ç!żïÄùÒ$(?ݳåqÈoŽ Í6MºÄš÷Û*“IZ-9RhÐàOuß‹žV†™CjNH¾äTT:7Œô#K{Rƒy^V×z¹u‚§¶4ÔTÕ(ÂK,S`Çø‚™(HÔ„-g)[*i@8ÛˆDLu"Û"¾k\¾Z›Èóà9%Ô©% lÞNâ%¦0÷¨z~¹í¢U¾4éçià,°UÕÃÅX l%±Ç©é¦[¶¸Ï¯.ÅZ"•ªš~°‰\Á¼À^d÷/år­9“X½ƒZò ¨j bUA R ¶K@â`ˆÇŸ}¬û—ÆMǵõ­Å¦VöSivÂá©M³lJ=@.è¹Ý–Ú#,O ä0¶’¤ù(+Zƒ„-ÆÆS©Lº6‰yÜ-S Yôêu2¯V6¼,6ìɈiǹ®²S„¨ Û$= ‡]H«3náP’åA K®\0¢ýZc~t—= ” $zôB¾t«wjèÕë^£[ß;ž‘`Ù2 ‘j¬ÝÏ¢ $Á_4º™.:´% ¸ÒÖ‘…y$á$uÌu†OLR·½·~‘Ì{Ç÷a¢â­ååCR¹™óa$’cóüÏ||ÎÆ½ïÚ…ré™uîí^VMÆ$¶ÄG‡;®¤<–Ø`d´Ûn¥¢žç×Ô’ =øÔº¬¸°ß•}ß°ôV”ÖƒM¸ÆHXà÷F>Iw‰ÍˆÐ¼xxñ‹W¹n ÷ÖìX–ô))5[¢ü´šª[®¸ÚZÊ"LLĺ—ÏîÔðSj O¸Õ†Z¿³bht¥›Êfà²Ì'_e·"^í­ƒŠkôÅ l(€qŽŠ¯P4üÙ½jGk£@#•<Ü«ºóÌÃ;Œä·6¹ÝsoQ*[’vº™ ƒ ƒòïêqóÃR´\yn9Y¹gÎe‡8™w#ÉK¯ „©$!|@[hHù„á# PêµjÔ(÷3U;š©R(òP‡î7f<¸­9À;ÄHû¡ežJBsŸåuôâòÖýŸ¾vyÛÅšUCu.ÊýÊÍ̵ãîä”4ý\£÷†TÆü#-2ÚÖ§ UëKiÆU‘\ÛsãŠðÚÍš~ɸöâÍ¿ªwx¦IØËžæE<Û²â0Ò[•T$6ã’]m”+ƒŠ $­hÉ#’Lo0ênG‘^Šf!˜Ç0d‚Üü¿ Ð$ˆŽ§êÓ9­;Kšç{#¼¢ï I˜=ÌŽÒGvÚ¾`áøRÚt\ûk¼µèPgÜõÿþ³M´dÏ”µ7 eE§PòÛ*ô2·[[@¸¡ŸN umÞ¼'W¬¿£Ü×”xÔKÍH¯µI«P.”O[ Îr(R‚ Ž¿10Q%JR1LjʱE07KÄ5·~Õ¼hX7]“Y›Áh9´öÝ‹.Œi¼T¨Jƒö\u!‡[ŠÛîJT§ ­¤'!Ò1d^ ?jNÕÖvR¬½û²êvÒýoŒëÏov÷ᨸËÂÙ y)KŒáI_¨••a<ŠTLRŽ´³Ô—̤¤ÐAî ˆû¤Éò‘ÌH&IÁi¾°é«Ú±QšY* /·sSrC Œ=&gX݉V©Ùßổl8Ç™* «0è$”<•>Û_Pxäñ#¡Æ¨#t?i¤=¶ñx~wof\¶ý‹P~…ó’³E¨I¬FýÛŠ\r°„C.õCÃ%ÆÇ$¤ªñ âöü¼¼Eî=ÁBNäY{S»"›·V›—ÄúSR)Ì ò}À%:•&B”Ú‹h+ €A–›Mdl¶ãÙV®íUªÖjS3ȹª#ŽÍ9(ç%nªKá)Sªp1€¥¹Í]9i‹S뻬²ÿà²ýÉ­Rm¤–ù>ex~·ëu˜ßü˜øIÜëX²²¾Õ%WnÑ= ¬î¤eâJíµï?5;ÖE‘I·¨÷%Mªâ¶ªÉ­NT r¹ÎðsœwÊ-„%E-WÞÔe)³n;¦§jW®Õ+V+•隌PÂN°¹-;ûÀµ¥)Ê’’Bzôœ¾6 ø{ò6ò¥fïœ̸n¹N¹& Æã»I¥¤£Ì\‰KŽ¥!kqÄql'ÕÅeA Ç_Öu²ÎñRvÚe&å=w:¶(J¹( Öú_Œ—T܉2É 'ËSGq àfžÝ Ù•Kʮƣ¨%vq7¤màp@ƒy†šW7©^­õK«†g¬P¢¢Ü¡žvvh*¥H{‚VK… ò@+â|¼ƒŒã¦qíþÚ‰WvüÝe¹\m˜p•äB¥ÕZL¸­‡KnºÊVR¬—OC•¤Ž¤ésqQ÷.C€?%ê‹|qšlô´ØüSéëùi‰½cO¦<ˆ×}L˜ïĘîKiG% „”’HÀQI uéóƽÓúLtbß­M-ê\½!C{x~cJ¬¯g¦¥eÆÐ)<››1")ÓÍ9’ ò·MNá*©R ó&9Àäm¼ÎŒÞ »iSŸ°¬Ú…»rÛФU&V‡• žã±Âl-OqSn«šAR@)H¤i{ì î…ëmL¸l¦…:á²!Lº¬üμ™PàVÄŒrmAN Ô «Úª£—Q¶ojl¶bÇLÆé ~2%>t¤… …(•a%8ÇAÈc];›roÛJé£]vûK®ÛöãM!Êmqï5ÆZLO‡B’µ!*(º¨)JG:ñI:y­z{Ýæ:bþµ½ÅZu)™j*0YE¨ $5DVwd@2N¨:5eq›Ö«—šÂ««í5Ýå7 €µw0`í €í ÀL+Vöçm.*…%– î}©"¡J«ÛuãAa‰ QŠÓ¬¹æ5#©ÀRHõ'¦&nÌÞ5е‚›’{Qí«r•@2\}…)R”Ë,© |Í(J”ÀZT£êW,œò¦ÕÞY»Ó»U;¾ß‚å¨Df\ºjc†`ÅoƒAÄç‘p«õ8*ÏÝíÆòne§T§Y«¿'L¤U>*-jÔœV!|#…ÀPÞOïß$’pVOpF:‡¤5¯S²J7ÝÓVÌÂ!v®Æ£…–@ÁxŽBo.žñOм×PèŠë—ÁR¥EªZ¡PTˆ‘*£ÊvnÜ ™õ$ÛŽØoen±wÛuÛ. Cn¶åŠt™…’qT¨ISËu‡\mIFHaÅ¥*J\* âT4üOÞ:­£xÒoË}lÑ.¨°E“[zHuš„9kDbÛÌ„ðæ—^_–U…‡’JVÉ7zj†Y²—MÛÔÚÒÞ¸*piæXiµ8ãie 8ˆ®ù«q')ÁÉ:iî™ûC»·ª+”]w쳤¹mÒæÔ¦|ZÙ–§a)#Ë*/aö€H*R²ysÁãÏv9uJ™“U§EèÚe•>(ï T2|ì[™ä TÎCyŸÙ憭¡¯kaM\MÍeVÜKù˜-gr74 î Ù£¹Åã½óvþR½fÉ~Ï’ŠœÔü2[§VÛ•JTgÒ€“è ž.¥<ÚóÉV¶WüTKÚ¹5-¿Ùêd øGtî¿‚Te³Q©$%JŽÃˆ* hÇm’µ-dùœÇT 1Qo:õ´æÝC¸èðèUŸ…”íFí¹çAr; Œ —U%) _$ ré§1ôY&\3þ#—UƒsÝ®šoØŒ#Ê–C®ϸ””:G%©]Ahã%$áj¹UdkªMVVT+È0î]· À€YR=‘†»mi¬´¥ñ¼º5«x´Þ’VÝ™nò̼ÙØ ƒFi¯0Å ©N5— |ÇžHIÊ!I:œ›)Zºh^!/O­µ.L‰•UÛz€³LüÉ+y‡T¢ÛiuÞk*XmLöJGL½¿ý˜[wD¶.„Ó÷ûS½é̺é®ÊnDhóáÐú£´ÛéW C‰ ƒÉjlÈj­JnÒâL sNi°¦A`<Ý \)Ê5ŽEsX¥Óøuj5ª#VJÔØ’ê•MÍ2(°¤Ó÷Z¬Œ|÷¢S¡±ʤ•Ô$¥NÕ!Õi®6㮯ª8(’H¹g$ý4¥Bª4¸ÅºDÕÂOš R<À”¨ T¯RpGdóùjÆw3öUxšW›pÐî=·ÜÕÌ·d6š«´™ I8CiiЀJ@K‡ †£tþ,)ê«CsÂþíp¢E\šœú%+ãb†‘•ËŠÀqYI-­k=IÈ×­T3+©h|u…õ*ࢽ@µiM"@ÝL)ðj tøE-LöûÄ =?”½Lƪ¥7-\þˆVŸÊ?)þì-ü$l.+Ò—º–ów»rXw5.Ûiy‘–kðh²§Å}µ¥Ì©MºÔt©9P!h I ÒOÃFüZÞè µo(›€šÕá³”êRkô:Û2$S‘KžÑvq¥¡! ªÍ(O. -ñã÷άbv pö;į¸5ŠÛ·™n¦ýûp>Ÿ#Ì­WÖb¹OIhŽÓ0‡,äyý=<@©íêŸ>­»s•Ub‡.á¦V+‘î)´)AæŠSU¸©*%H[,º¤¢®‰ QYnun¹ºQPT³¨²<Ç€®Ô„à›Ïng¸žžÏòJúO@ZL¥å6‚JŽY•\óØÆàƒ¿Ýhí‹DÜÚ³Y¶¬Ë½¯¹tÄ‚Y¥Õ¡.€Õ¦¦“(iÅ–¤8rJõ-¿á9Àw|:Ó¤øÍ]+}-k*¸7k·"•%sp/¶e4ÛHÓ+t(4!¢•…Õ… ¨KáƒÁÅ7te£rw®§BÛ†¶¥Aró¯]·Q Íz$ çÃ9OuèêmÀµ!\x«‘ê2øÝ¾3U¸u¤möÒ7RÚí•Ûm½sü‰‘¡¦¤njyã ²íN+ q‚ê[ç.NVHÞåyºµÓ–ÔCc^ãh4Ð0iBãš•Ÿ¸¯ ݹ*¸ÕÓº«3ÖÙ®¢¾qlÅ| AÀß Tv¥$‚7\ʧc‹ˆ¹û´w¥cÚºoªB©÷}F[7N•ñô”*ª$OßÄ! ˜ÌByÎ! ʹ¸Ú@X*:öTëû½T§Æ®í%BÌÝZ©0ÿ‡ªíG˜Ä`à»"#¥* x‚µ2¢|”„¡”ƒª°ÞmìÜ=¢ÝKÍûÚ¯CvʹeTœ©[WKÏÔ^˜õFCÎÄ‘IddxK‚¿)+B“ÃÌÁLF¼›­_5v6ò³Q‰U¤Ñ¨[•z\ ìT߈óaôJLŽºX_£“h! +ʑȎo©Ô*ÚqÖ¼>£»ÆtZÔ…E;'jÔB­´veÃh–„u éÓ|‹VÜe×¶¯NØ-`.©J u)Õ4™ V;¤§v•%Ý»|røˆÚÍãj·³`¯*5>áu¸ûkY¦!mÏÃr¤7ñJt6Ü¢’µã÷h_PA2Ÿ`ª{º­ÜµŠý¹ÉnïÛfWED¿øõ­¨5´³!ÇnFRî|ðžN¨umd$‚ߎmâµéÛxýV}…}Ú×nã1fÍÛÍÌ¡¸ìèOÈŠÌ2Û.’—‘ðà—ßh‚¹Ô-N¥+ë8©¾1ìû+j*÷ oضè–ÖãRݹíØÒäRk²Þaç%KGÀ¿çÔ„¡Ô6„ -O)MÌ-zƒœçº%.€%]TÔ]¨¥éÔʶÓLž ©tga´€ÜNzO¨ô.­É›1·ÌÙèÓiÔ5èš æ¦ÃÏM·#l!¥gî^÷me5­š¾Z•X¯Ôä.œÂ‘š·ÙL-"[%æ‘”’•2‚•s%'ŸQ5YÿÒ½¬GÅ Ú”ggÓÛQ–Ó’Õ%À„$¬ä•`!*W_áIé€pùîµr)[ËYªî•ôå÷hË®Š–ÜÞ´5:Üðü¤¦T6âC[ºg÷M¡JG £•s\C"üÊb.zú$kr™rÝû±î ŠmPZšßÆELrZR‘ÉlFyYIê‡=25[æ_H›¬»8{{+AQÉfsÌTÀòž Ÿ1^%HbGõ3éOé­ys’Ûe‹6®éQª9äÓ'rùV`ÃyBUÕ÷b3oUWk¡PmëNÇE†Å^ö©6Ü©4ú”V…$(—R¢Ùp8Ò’1“ÅCå…fÉÔ¡[ï±LmÎॠW*KmÒŸS7X)B¼¤e¾2ž‰>ZVRж÷lÝ;mgR߸iÖå×@wu¦"é¬BŠc:ÝIäòŠh$É(XJ“•(¤zµÊ­ÜKQÚ}§·5IǬӦWip¦­OyñÖ†–˜l„”)¬6Óe9aÂ…Ž¬Ú£:¸êv[N¡*V ` –Ùä‰n9R7+maêDñZëMCuÖL¦•RWmPê –¾Ì‚[2•ÞŒǪ´‰ò¨hþ6²ŽóF¡_«^ âOÙŽ&2)óaˆKNÈR[<m pô# IWBF¡fþìý/gnZk*﹦P®k:jŽä•˜ò£°ò––Ù}(QO1åò:ã6_|Ý—•zÖ·"íõ^%µ}1X¬ÑfAº)Ò#!Qª°J€¢‡ÃM4JJîÜwÔÙf®oµMá‘rܵù07N¹º‚¡?¦ˆé9Hj2<´ºÃ>WèÏñÄŽª‘ô£¬ú›!Ôëw«3cðd:2˜a ŽËN˜Ú Á5ÀÉë†nŸu?Sä9À¾ÕY» :2Üw®Ê”áHcU ƒï ‹³¾1¨• 6"œ¹sàíMCoï\weÅTif×PŽKu¤)˜ëp  %ÅHé[^<¬á½´´ ñ©Tù‡pmkQ/¡oHƒÔ’—0•ER_©(ðBR¾X ¨ì=ÍðÍwZuŠ‹ô Í5l•¹ci—MªGq²Ûé}—0´§’•qëØéüÚ¬f7.í¨ljüÈ„ˆt¸UGÅÃô`Ä•)•¸µJISCym€ž}{}3=?Ÿd´ó ¾ ©M¤«)Ü­Ép © <‚ ‰î=-ª¬õ «mYjQqÃ/ €H>ÜÊ•2;‚ ‰»›‰gѼ6x€ÜË"û¦Ö¿ÁÔú=vÑŸgÐáI­%ÂÕRkŠ|¹PÔÕYÆ]e,: €’UL»Žæ£Z7­­mH“SŽMûZãDYp_iÅ~ñ–’È9IÉÈÏlðÍãʽÿníãögÿI-ëîtÕTi7Ù[Õ4‰F3^ó”$°U-(!æÏ¤ñÇso»[á3ÃöòÛuÚ^æìÕVîM¾S‡¸5HT4Òªl­¢QbDo%M%è‰%k NeDR†«YC?Éì«æQ¼ „„ÿXq ¸+À‘ÏË‹cFPÉ/u4¾Åf]€²Ç¡'{y¹iò˜€ 2qÁðSºvˆÊžÝ]U³lGÞÊ‹U¦o _µä3ITwiS]JÀ@B‹Î©.6z:§“Äc±ûBv>óKt Ρ̸kÖ…. Öm”­N"˜êÔf4’àò”„¸µ¤%*C@sæq6*ß´m›³z/Ž­Dµ˜Mz}‘pÑ%*¡sC§©‡>æ"¾òÔØJV€ÖÊÁÁÎ`~ýø€ñu±;‘*¿nJ.ã•L»n™7º‡V£!Àã[†•¶ÔÛŽ)#â GCÚ?¢õ>A[?®õ\¥ÀØvNåØ@xHܾ'Ú·Jç6ùm¢¡¨y„‚Ó¼‘'’I÷<¦{ O{_Ãí šU*eßQ½ ÔqŸ´´ÌTÅJ’~&BP Á ëBy`žìÕkÃuçy™ÞxûñF¯ÑÎêS§"Ó•aɦ¼ªjê ÀKì.Du¥àJy¸„¬%\°£•3¼Cx4%V]§K©Q«±Ê¡\»}qŠØp¤¶êf)¿Ý…¥ȦÛ©'¼ìðßµgÄÔêåÖ»æÉ¡\füYRè^•Z¬TCeQÞøwм¶L„·ûß3 q!!±¶u&£Ò¯§.^¥ÆÆž”î°$²íHÉäÆS¥õ#æÔ¤vx©,°H‡ÆÒXˆSµ’ꟗÌC0å»ÉÌ‘ÀäÄb“â ™jl¾òÛq¨5Úí÷Mצ»&†ÊDiFt² UÉ(q†\BVP<‡§ ˜*u%Ø’%=ž.˜aÇb÷äy¨ •H[Džiqc äU€žjÒ7ƒn-[®s6íhj5 …Ü e=YïÓª,4ÒÌe9 *[î ^⥨($’‰hÌÚ;‹OªÛ¶ÍAúzmymÚ–ã·· ÷!qa˜4¦ <²¬ZJV UÖo¥]2û ›ÌÉ‘’D!bgŽÀŸHÄ{Rd™šÝ£2(^ï°yýQó>ƒ¿˜¾Ù=÷¿­™¾#lZÅ­Œæím-6"*wÄÆM2c !ºTÇÞyhãØ®ðäÒO/Üñ t°…í½ºÕ¯k^snš…—2挻¶¿dSR™O¾´ùÐ ¸C-¨­imÅ-$©\–’¤‘9wà¿÷_e|=ÖáÚiwWn+J³"æ\+m•TTD7ç©L zTÚ˜ƒ)k*JU€ êÀ½ázýÜ=“Üêu­mű·Ví¬PfíDª·.,cÃB—7›‰Gûr|’ÚKˆâ¼¤)Ic[l’ñþ°ZdW’ ²D3$ªžW€L‘$sÄf9uæa§,ü2èôÚ¨¨ ˜Ý̸Ž`|ø!–ÞE¹Ý‹ë¥^4Ú9Wøz¶•!m®žâƒ¬¸ŒgŠÛ¡xsE$!AGãWwá*Ú´wÂõqÛ4YˆEEصjUrÜaÆ.Ÿðª8RÛ¶VÐ*'‘&£¼kZ÷?‚ù´·Æß¶ëöfßÞ2ªp"&Ë-Tmvœ‘5m·KšÑ)RVì3]Ò…•;Ã’™'OÇì÷ñÝ´Ò¸6¤ŠÓ°©ïÓ©Ñ ÍCÉ_F3)-aN8ÉRƒi%K “…Jb¹§‹eMVT‡‰$¸$zžôäv8˜ÒÌòL®¿Ã×% •e;‡•„8ù úÈ=ñ>§ÙmÓ²(ñ6žÆO‘[¨=CD:m6r£5D–‡P^@+(äæ ZŽ'¯¨Ã˃w-ñÞ»ò½³bRïûco'QåÛ•êÔץåÕd<ðâ#†Ô´©÷žq-%+Î=BJÕi¾ÂÜoÓiÕ‹&å…r?pÚTú¤ih‘W‚ÙÄRÃ<ˆóÁ,¸•8¤!' “¼SZ>%÷nè¨ø‹·¶Ëuh6eÅO‰O´­Ša†‹ºZæs¬‡ò ËÒd£÷¥N)¤%¤% #MeïJïǫĂ6€Œœ_6àO=ÄG=ͨ¯,jÛìµcµ ÉfWóIn ÇnçŽ,;~® žëx4°<2Þ´Û>à°an„™4Û›nëËr*‘M‡!j[©Z|÷EIS‰mÎ µÇ÷€¤a á³Áu±b8«Öÿ¹níÆ¼¯ª; =aÓž—‰pZCmÌ„ëÊ%¿Ü áõ©$«‰ößÃe½ÜÛj-ûpV`ξ+”ÕKƒ*¦†’RZƒÈC~´¡ÖøµœaIŒ¨¥Â¡ôMoÚ4»tºˆ¨‘"T”Ì«T2&KèŸ5åz•„€z% Ÿ/rÍ=•æáßÏ.’@þ¡ˆ" z ӈŞ{¨ï²öZä s´!3Á'±pO—™‘Ìí7vþÝ®lXÜìÀ‡KŒÚ~Ê¢«…=ž˜Oœ¤ãÎÂzôBF1§ŠºZ´;Z<¸®¹Eve>ÜŽ´™NAeiBÜf:}E[ˆI✠4Ào§‰]¸Øh.µZ–šÕÚônT»:Žð2×ÓÒ§ˆèËyþ%wë€OMUßâjƒ¸W}Cp+vmÑ@»å[RáV-«Š®Å†ÑRÔu¿ ¹)n)KS+J”NNz J2þ”õ]å¢ç/´g£èÒª§·Ý ÊXw’²'ô‰˜„f]Uéö“ÍM­õâ¥aÜyš;ðJ+ßÕ1ø »Iž.펪GêB‡*© פJ²œ›1)AâS-¶\+ON'¢²¤§®*ïöÖܳ¿6æÓn-’Û7>Ém =÷÷Ó·%d0Â{T‘>^9~·öM½»wY·ë5È”˜’éïÔiT§Ôðæ"+EÞž[Œºãx^S…àö±ÿÚã~÷ÊJvçaT­–³ÒØŠÖÏV•&–ôœ$±ñ…–êeÌ$!ÒZJ“É$“ÈD›>ITûn•rêvýf!-Ú+ÒÙ…J¢¶BCæ[Sm-o:òÒ¥ræ}8úK²6gdSmº›uûjmà ÔûÂÒºãR*UE¶„¥ÙKL2ëŠ àésï¥9Œó ¿Hõæ‹»­Fî½½ñ)2 ´• :™S $áØâ¹Ð9e ö½å¶K~¢Ìø{ÕÎÏncp<ƒÉ"*†$ÀÇÈ$­èÝ-ѦªÝûÊáºgÓÓ#ì¾TFäL Ià´ùñÐÏAQh9„©JƒÈ‘®FÌß\ ¥.œå™t­³É˜ÖõÅ@™bš S€7æ6 Šœq`( 81ì5öø-ÛMƳjT§m[yw•"\‡©÷ýñNuú“­ –Ô‡Ö¦ÁIH Ê8Œ•êèÝýzïbÖíUnAmÊ@Dp¦DöY(8A$’ÜV6¯xwwllÛRÞ¸vDëi¨‹ͽ§HuÉD2ß÷!ØÌ-Ƈ”ãŠÉXJÖœ©=¸#*><][Ñ*s,ÊÎùð ´ä芕2rjË [2RTâBÔ“†Â°)ÈÉ¿+V]Ígm”;J%R[º(°[‡oU.¨Í¦œáAQe.3iâÓh-¶ YQJI=t×íË;ÙY—V§ï•»´ÒbÏ’ë´§lš»¼Î[KQߊ¶éÿÕWœ\+ëǨ=7rM;™ey-{†d¦=)ÑxݹÂxòÜì ^Ø—å=Êrû[[jõîš©ERÊj”P°Ì¬“Õ`Ǧ>TïHWõ±WbÒÜ{Vî¶¢59ÙQrPÕ@KÓ§‡Ô…Á`:ûjeZÊ⬠‚“ÈÈnðmÝ¡hզњ¾*2cÛï¿g=I¹­ùñ‘)-¬1N|yl4BO4rJRGÞξ˜¯mŸÚé'5>Ý·˜MV#Ôè·0ô' % q¥ùG ’ÇB¡ÅSÀg†;¸ó)6¤*|¯‰2K–íÇ >Û® c’¥tQJUå®™âÎ]sM o™ ª¥Ý~`¨¼B{zþ~øoÎzÚÂîÛP…iˆ™éøíëžo ·›{»¸²œÞ_ð}FµÜ]^ήnå"( IfJŠKHl6ì„ru( ¥)k'Õ\ï†?»¸;ÅlÞ7M¡µ—FâÂRc\ X±ÖŠ ™·˜[í¾Ú¼ßKM¸WŽiZÄñWngìõÛÊ3Ê™¯¸–ܤ‚¸s`ׂ´ç8è*GNÝ 9É:tíø/øw“µU¸k0áIqŠ­bBœ—§E<ÂÖ°Ÿ-/'ŠAâJFÉÔQ:uÒÍSÔÙ¤‚Û /;c @GÌvÇOz;™åzˆ¾f Y,Ô<¼(UhKùۃ‘ݸùh,÷=V:g\JݱC¸âü%f›¥rCeÕ7…vþ:ã?©ÒˆâêpÓEPÉõ`ké&¥uƒÈÇ´.®-ª‡¦ÅXv Á„ 6?ý6·á0ûPc<ãK$³£=õ6ÙèR””¬) vÏnÇJ»/fk›£S‰nNª%b›J[TÚ"å*§Qy¢êÜ[4ä­(„ùŽ,0ã‰Y$ð*ÉB0F3Õ_x”ý4v”ìwZ}‡]Œüu…´û+)ZVž¡IPêéÔvÕÔ£Þ†×ùUtJ sPµ²¹1§÷O¤íØÄO3–ØëÍCh6µBãúܘùŸÏžLœ4ÕŸU7áÕktD×Í6ÇX­§ì¢“ g3’¶W„¬ŽÀž„²Lxkº­ê˜—oÚ3nIÌÒù.EµÍ”Ë-§«¨IåÄC=ÈÁÆ­Øñ tÀ˜™7Ä$îK­EKkuzÜŠ}zc¯õHêKÜ{zó1‘×6%´ûS¹íïñUˆôÍζYl&éÛêŠã¢ò¢8¶^h!3YR‰PK©($ñY>„ù…Õ¾‘õs¡ö†æþÕ.¬'h­M˜Óóv%2Æ@/ OäÃ\zg©WY™ð rdr¬$>cïp'Žê@ó¥¸[ɹ×.ØÜW:\Še<ÊŒÝJ”õTÙ’˜e¶’äY8y†R¥à,• ã#^žÚÕZK‰]U*L‘P“&˜´½QB´©É1IQ|´UÉM!EÎ ­HB°uôòÄoÛ‘XU:£ƨ]heM;oß–Ãpë$aI\i%Õç8éÈ{ŽúiªŸ³“ì«­ëÎØ£][kp3R‡PiËë]6#F#Š£Âp)–¹`r  ¾ç<Û’jm#–S¯DXU©,0K•‚X¤Ïo4BÓ,Ë,rK\©­li¥e‹‘MAÞ繩ÏxòÎÙ Äbª¤\õkb•cŠf¹vYq(â§J¯‡+ñŸõÏb¤¦ÂÀ[N©pdE—¥-­¥ ”sÓüþömÍÅo7H™Iÿè-ç\­Ë‘"åj‚´Ð×&G›–¨®yÍ„»!Ç‹«eä© )póYLܯÙù®˜S,ˇŸ‰N[i-9¨ÈSkZ]%–TcŸ_ÒPÂr 9ŽG…M絫qåÕìjµ¬¨qÕ6<Š$e;f#‰wÊ•+ÏE”Kkl¶Ÿ)Åy¼“̧‚›*äý2Ï2-—Wi.¬mbXù@à‰2aIƒëÛ YÖ]’êKe²Ì,Ô[+ 6ŠJÑË-0†˜=çj‚w4³³eŽÌí5[혊~àÛµKÞØpH®±.g)<¦+Ž´‚•yŒ¸ëÈ+Ì%4ÜîWŠýö·ò³¶õ*e_d­êÝû‹ª#MîƄàTɰ¦) —š,«™KeJl:q öÖÁ» Ý®Ü3h•Xráš“j a>|g•5ðŸ-}Å6פqJ†Ä–°%¸ÿXÖd…F¨3wS“ITÇœ¦Ó«pìªhv;Œó(¤9å©,¸³ÁE¶™R}JZSC.Qa• ŠVªÿkT™Vþ  ,Aû¦=$˜^[Ñ=g§jQ°ÍØ]Tvo;M25 ,¤yX¢’£sEß›äÅó\q›¦ŸâŒôÔ.•]²ÿ…¶ Œ¶ÊÊ–x¸•t9 Œ “©%pV,« |Z¼Õ?!ôBb£t®(XA ЦR§9J òJ@)NTs¨ÉnÍÙª¦U Ó·"˜Å*%Nt÷¡È­&T„ùœ ÒóˆO˜ÿ„¡<ù)( œj´nÝøkvâuUé6Í:®ý_qm«Š‡X¡Øt)‹m÷Uty¾¼%À–‚–¬„€¨-rþÏ/R·NùÜ:å¯d[v~ë®vàÆ¹¡Kj“2çI+¥¶×7_°„¥%hJˆåÓ‡àv¡¸V…õâkxw&©O¾ï^¤¸”‹9ô„Ujw؉“LE>G—XŠäd•(¹„Hâ\ ÚñWcnžõ]ÛS[¼.‹«mÌz™J¦¹æJ¡ ã­ÖTô2„8&:ëÈeA¥«x$%JÖ*Û^iì®æ¾KsR•FªKÓêSpŒ 3ÓbX)fJ’HØÀ¬c£+×Î(t×Tæ—•™Ú½­½JþZ”â—]Ø!¤‹Mëši°U ²A1‹w|H@ܸWNÅ]¶”í¹Ú›!0h;}dÕ®÷ê0*QÓ!b—Xqå¡.–¥ ’¦š'>­3›w¶T*6MñhíìŠ^ä§±ñÚ{ŽÊ’Ü…Ä@Di¹fCN8—¤”´²µ!LŽŠÂõ7êÙ¿-ýͼڼÊûˆiö¢JøHŒÓšB|‘)qn--©+–y«—N£OÇxxÝO[Á±µïU©\‚ÅXÕ6•r:õj€Ã‹KÏ¥Úc©`¸×îð¢Êœ-%J)è“—EäºõíÒ½…è[赫‰/HERWÄ`ª Î`‚ÛÖTŽpÐéÔî¤ëËlõ3].Ú…K„ŧ Rû:œ•Zei²@–PdÌ¿µß÷NúîÅ×`T`=iÏDk_p)mµVåR DÉJeÄ<†ã¥§0øQâB†07—ó¶íŒŠ\›~¥K¼j˸‘˂ҋÅÔ Ù”²‚ZZd-ÈÊ$”6éXçÖfÍÓÝKÚöðë}@Fô¶ÕB©¹g]š¤Â{í¦Âæ3! âZÏ¢ç1ý/¼¯ž?Ä͹vÕ62äz©J¹mùm·Jª¶ú‹r–ÚËÝÜ_œ2 x¨Ã%˜i,£>´J6µ)¡¢Æ­BÍT3‡RU˜¨]ÐNз™ 8•ý$:7˜\jšõ®--íR¥z—"¢½`µQš¨­#{ÒÜI¤Õ„SŠ‹¹”+Å¡o>ãìDm½±vî©eRh—Ý_2¯›6²jH`S–ëÞbÔ†ÚZâäºÈôzÐJR$„Õ¹â/k/M˜ÞÙS RÙ·ãɲ¡ÕäÛôß9r]UPùŠúÖ•%HYæ–Ô â0RI¨#iîeÇ»UK¯Rr…>Œô4]ÍÕ ®¨¸Œ¼¤Hä®h ¬9”¨§ˆìIή:רöïötxΰ-*a߻ΛpZuª=É·”X•´Öž}N>·#¥ÒâmPÔÛenñ}'ʬ‹/M雬ƒN-“×kÊU<2Tîj`;‡’òv€d¼º+3Èœt‡%Ïj)˯³#zÉÀF]Ô™V„S ÀH, -ŽÏ.cÀ‘6…÷> ¶.“RÛ-Ëkrw#쮢ÛÖôãr 9ê£JLYÁn–šj!l-RÜýÊO u ÷ªð¦Ó Y÷íZ}R‹^ª\Riöƒt†Û‡(N§#âgÿ/)L‡Ò•½I¬9hT‚Ý: Í TxïQfDQY~ž…¼¦Ðë…-,->jØéÛý¡ño]°Þ³b¿i»3o)NÌÝéAUN­nL>Ô§YBŠXóR›S+Iød“߬_Qtº­~ Ñ¯HIÕÉ&‚‚gp$¯õö®é±1î²tZ¾³Ô¹~¦¡MQ©¯Ã^ òÄÓ¦‹ùËã¬#’w0Ý&wÑfÅÞKm»™ºc4ö™bUf*3ão)¼•¤,4†J¯ZWŒ©*I {cí-®¢´õFò¤"Ö·.šm@ÊÝÈŒT+ Ò~†,+ÍàÒ'-ÂßD8ÜdžÖÛ!¨ð‘Set yôJj=”.iz–¾\aÓÝ´Ð)Rœ$Ëô$,烉8â®Åë¶Ôý¹ÕHf§U´.Z%Å1¸r|)϶ÑòÝ•l )¾Š?t êTA˜Ëm©.ìEf¥f„3»•9i;yièßJœ’iA,Ä-¹¼žWBa„ðù°—Õ“H…^¹œ¤Ué™’ë7bË‘!ß<2ónÍS¯­´su-͵)M¬ŒzÄй•wX÷µ½^²í¶nÚ¸Ìǽ•K¸>Òœu„Fšˆ¤¬› mE´‘đӕ¤æÌ܆ö¦çn¹I[/ZíÒ©u(¬ÓVÔ_4ÌZl!¤–Õ øŽa §Ë|Aû½:í2éÛI;Ñ&ƒkÔnJ<»z¯+o¨´¹Ê…FL„ÄIm€§VãO¢S‹*Š]AçÓ«¨ó|ÛQjÚâóÃj’ÔÂp sMHÂw£‚%¡AÄCUçyö­×w)|)=YjKO²U’!Á¾*TR;- Äbñc`ß·{{5X¶)&Rg1K~… ¤r¦U$a×âBAB’’¥(ðIAWåYWFÜÜ‹^ð¤H WؤÓÜzîã+ó •$©*—\(€SƒÔ«µ¤m.çø‘ÚJ}Ѷ6<{ªÿ°érk4»j±&D6ª”)pndHŽri!×Õ!iiÅÙ[*HPQN`œ-ˆ½üN½yÜ׬*ŽÒÜoU¤.4{þ4¶CE±ä9_ñMåKR•'£C$«$c]ô{ÖZ–Ó,·Én©R[:2³r*n5]À&V†ò£q[rù»'¡YS²Œ‚Ε헇` Â+•`Ìé]ˆŽyQ¹ƒ;*î€fD´²êÒ¨µ¦«4¹ÿ 2™YbD),*mh)â°=!ßéÓûÙ=˧înnR“qWdoO‡¹ÔíÚ³¬vRT¸e t¼Ož+Z½Ö”Ë AÉøÿ¯Ù2ì{–¯l¹"‰T—F¬®4ší. dÀ['Ëq‡8‚ãn%+ÀÏ N:éàµî[¢;Ty”Zìø,E V§Ç¨*;4sÈ4êG¡\”Œ‚‘ºGMv^e¦+]Y ÆÑQ$ Ô`‚ ‚~Xè<óê¼ËÇ¥æïÊAÿ¿¸ÅÀm*G… 7îíÞ;g|Sgmëî¿sUlýÃb#ÐZ•)ØTö¾Í›²²ÚåA`¨¥ò0;„a ÷·îÈðÏpFG‰ËæeSw¯*¦ÓÒNÒË~)ÓæËE1ê1¢3ö8¾|¤)‡Zä¤2ÛœRP ¨©ã£Å…Wvöæ—cZ÷ezê ÓX¢CÞ å"˜ˆ”ZE† ™% Kä9ò’㥶†t¯ÛÚi2m»úÚk*£o¢—Nh½N”ü#Q˜,-ÔEøy!®iŽÚ2F Ž7ÈóY_*ê×KP­h•(QJN²»ˆ¦ÈÚâ “·qçž8狵MÝ ¸¹¬õÁ‚|…¦H…À…Žø{íB÷Þë:âJ÷bÀª®\ðú5ÅLr\žN²…"Jœ”ÒÇûaM‚˜IÐm¦ÄÝ~n:߉[nøÜˆ×5DZË·7L˜ž\‰òSE*}æPÛÉeæå—[ 8(lq{Ì£ÆÏˆ]¥¬N™µ»Eœš%pš©»»µ{ Ÿ-†˜u–âÂZ’§¾´9<°ìT¨¶ž¥R‹Ä&òËÜÛ#ik6ýÛs]ô›²Æ„þé]Õ9=ÊeÇE”ÄÂTÔxÎÌ,¤$¹ÿª¤¨±ÖùÌòjH‹R£UòKJ’>ð‚ òyÚ{r=&:?SÕ¥¹vD¦’ä(à@3´‚`;nàzb\í]L¤í­©s9¹]㬧xi×ÙT~4N¨éÁðñYW¥Hzªë`ru¶‚Õ9gn_–nÍoTͧ¼í}¼Þ¬ÜKŠEBߺïûlT*¶ìz‚ñ""ᇎ´IC+JHZZm^¤ùmê¼l ÷—±ñnÙö¥šNåmŠu>[a¦[W›ñ3Å8ŽKQÀJýÑñÈ)¿—Ï_Ò¶:ìÚUZl ­ŸFÿÒªÕEÌ™àj|ÔKiÇT}A ””úx”à““­N›è<ßLë+ºí-eXBn€Ò6·*¼.Ó¹TÊÈýq—_k,»Pèûtbö“ÁIe†Ü8bé]…¼¼Y}8Õj¶ƒB“~Ýu×ÑAº w¬êÅOQ†×”XT9íFW—Ë ¯Š–ž¸P PèÒoÅݶ®lñ1oÞ6Œ¹ °ª®3MQ‚’ä—RT¢Ò’VyûD„ü†˜¿ÙQ¾VårÀ©í5Ý~Ciºk.?*—zTPÃHh¹ÉO”¬@RÜiyàHXPB””ÎÛÖÍÙjÕrMsÃÚÛ–Zê V4úåä  ,§8'бÛ:¸jÒ¡mtQÕ¥{Gb=8#ø÷ÅWop÷vªêÂ߸<Ï3ü0€ðäÌþ•¹Ÿ‰ˆÈÜ›˜°e­„gÌi%\ 2rN~€õÀÃê`BqÏ5Ö]}丅s‘9×}iZV‚2¬d)¶Î}¸5‡r6vÌ¢\Ó«T(Ô6eMÌRòÙqR›i-$‡$„t©#Õéž$y+!vª‰.· UqÇ$P-Ã9䯀H}ara²¥…Éå @(þ$`á¦ÎέeHõ?¼“ÿTaÆâòƒ¸bð°ü0´Ü[Ÿ¸¶\ë:k¢œÑ¥3›RDä.cœÇ¥C‚dö«æuæN½[¾X·/sL¢nÊégЪò¦­Ûê›ÁMˆ¬•Ž0¦†ÊÒIó¬yJu'x°Úèj]©6éfÞje1LTäüÅ? ¥ú !%Y(ޤô1»u¼iød¼µöòó§U+°ïxL†¢Ö#.U.¶ç‘å2VLÿ¸ÈO&ø€sÑúÉ R4]7Siô$rGiù_Äa®½Ý*–µ:›j,AŸcÇá±hÄ ¾7º-_ÂææÑ+{cwåYöä¦.[sŽ×îÐËb+/E%nIpJu¦Û[i­•$£TOû1hû»D¿¯kÎÂÚfnuΡªAº®Öå.®âìÙIqå%’óiK+P+lbÁn äÙ·*.Ðï›éÛŽBaLÛ;›P¥Ò¹£³‡$Æ|ÍJã…b‡PNSÍ^¤©­±ÖÅÝ{íÚÄ™¶m"|©~q¦ÒãêUcÖê”ÛHm¶Ýà\ CmòmÔ¤ýó:bß)þÖhÕa °mäå·$È#îž92LÃWÝj*ÔZ°­% °‰cºdú€#žã¹EÙêS·Ãuû"Gˆûj Ó§23m@¡Åp‚¶c'!¨QòÉ)%Ç8åŸzêJL²¥R­;ŠèºfƬ׭ûZ¥6‘ 5=¦Sf#‹oÈ`Œ,¤¡8[™ûcO»mRmšsTºD`Âhä´ÖIqÎâ©k=Ê”s¦Ë|w Ç´,‹ª‡pݶõ±rYÕH”ˆUš²c•®De²…‘ÕAN§*‘×K ŽÌ´m©“è©f?€POÎ~'¹ÃEÝÝ*4Í[ŠWݘ*i,@ŸÄþÙ³Hnæßý±»î‰_j\µ‹æ"³qÔV•ÈûsZ–â½D‚xŒ%)ÀH©µ¾¾>³n…›¶Vú+Sé2b»^­8äf[“ÅM°„ú•ƒœ¨”—ÏUOû^ÓÜ7*¸™†SyËr­cÄ%ï<)·XóJxŽe$Œç0s­àÈ}Ç$ÊyÙ2_Z—"D‡ –âÔI*R”rI$äž¾ç]kÓ.†¶¢ºkÍClËAT t˜•,O%˜)(Ê’ÆO1È}Eë]\¢ßàòJàU,KÔXnTD–’ °’NÍÔÝë‡xj¬Tî*]µq:Er‘IJ À”¬¸è'' QöMh@HÂ@íÛ('*ÁÃ磀¡íÐàë°ò,‡)Ó¹m;;*B•ª;ò’OïÇ+gYÖk¨s'»¼¨jVs,Æ$ŸÈû†0r®§9öƃ (©8ì4/—«ïÛ¡ÑT¡Œ$õÏqòÓØXÃP2qŠ9`¨ôÇ}Ch%A¦P²®á¡’sóÇá­Õ'$uö÷Ö¼œòì®úPP 1q¨»¿»Vâ#1oîžäP™†¶×ºMù::RR’„%à€¥Ð(üôãÒ|^ø¥¢ºÓÔßûÂÒ™yKd½}É’œ©$¥å(„à@öë¨ä~YãXÁPÇAß9Ó=Ö›Ó·³ãÚÒyýjTÛñäÓ'÷áÞÛ>Ï,€ðnj$vÛQ×ðà8»½ïþ0$4ÃOøŒÝ%5hS- ․ö%!°>¹ÒFwŠïUG¤ÈŸâyrcÜßá¸sZJ•€:%%)D€3×ÝO¬+©Æƒ…£ßZ´tn·3N‚Ÿ•_ù~üãj¶­ÕW*^Ö?ZŸù˜ëVn*ýÅ=úÁ^«×ê2•ÊEF·Vvcë9'ÔãŠ$÷÷:ä¥Å¶ Rµ$üÒH=;`$ú:g=Iת4W&¾Û- “÷ÕìîNŸÖ•4¶¨G ùÃZÎÌ]Ìžä’OæIÄáðQº»ÖÆ÷m…©GÞÝÉ´l®Æ$]´ø—Œ‡!9NŽ’ì¦ÄWT¶Š–Ã*lªÓôÕÄÞÕ¦ï ¶à»¤«Ë~»TyôCJÂÑ¥¨”2“òBx§òÕ{ø^ÙdY”6®šÄ1þ!¬ÄOÃÇ{Ò¸pÕ…ýs¢•òSüÚ˜É<€ rÊ=XëØû÷Öwä~èI**Éö{h¤tùõ#^”öÇüã9Ð{kêpsØvÑÈsÎRq‚zèq‘œñ ùh8q¬§*ìpúk­G­V(Ù©ÐjÕ*-F:‡‘>“9qÞA% ƒ®JRA% ý:è~¤~=õ†µ½ªMNª†FA‚pA}A|°a™ZAƒ‰5ox«Üxëv6á³DÞ›~C(I n|LKA=£ºÍ¥û3œvÏ]:ö—‹z  d-ÉÛ‰‘äR-«…»–Ý^pÿo©’ã œ4òF~Z¥8±„çÜhÿûyuéªWýú­ªµ[¼¥)Ôh–¢Z‰ãú´âŸÈý”ž$È MUŸY²±ãߟÞyÿš>X·Ë_Çd‹wìÊJ qݦ;çL·9>{jKí¾ÓO!!%#ÎRQâ zýÛ~%6êâ Á¸Q êƒM–—Äé0¨Ÿj·´R3)PVñi (YO¬”‘P($u%@ÜÿM{`ÎL”™”ÉÒéµbU:R㼜ä8‚ç®qÕ_û;:q˜RfÊ3 öÕ *ª¹ oÏyg¸$ ]—TsÚ UW_ßóéÿ¯'éNÚºm‹Î¦ZW åˆ:8å ¤‰>X÷!$©‚€#ß]ÔôÎOñæœÓ:ùĵ·¯oU˜©Ô#³r–Rx¦£:Dy“ülÏŽãr[Xö!ŸšN¥fÛxؽ(Uh‘®ŠÍvm¦|Ä=­ªô–PRCjD•©‡Ïp$-nrŽ„‚9[^}zÉ¥êT|¬%ý 6 P÷àRráìƒ<Mr¾¨å7 •4Øûr?xý¸ž{ÛᢻN7T…2 ½Z ÿîEêZÞ‹9#îùÉmÖÔ’’2œçø’¡ÐÇ _ìô³­ëºÙÜ:lÚÄË’Œ"92Ôj ‘F‘(¼KÈKIK \|–Ö”-i_¡@••ÇŽ›uø°r¿g»5¹SÙªIb%Rœ•²†¡Èi•0ÿ5Ô­ Ap”‚’£É!hÏ‹‹÷‰Gµéëf%rù[T©b—^qÙ©3[KI}Žßž–žx¥H$ ‘‚×>jŒuÃ-±zwÙMâP¦y4j,Y¶ºì Ðïè%™æ•Ïsº4-ª)­]Ò˜9geQå`T’Z<ÀƒëïŽ|)lX›_¶t‡nªV}gr‘u}š"ÇV]6ŸVdSL—JÝåÅ’ekW)CH­ÖðzV<[îôÔ/‹mVíÕ¸m¿:Á…e9M\ªKO#"cnaÀe+L€ÚüÅ$…c‘!ÉßÿÙ·š¯íEZm½\«ÚT ôÔ]ÛŠÛTêÔ©!ä2à%Kš‡òÊ–—ÈúT¤§‹íõ¯[›Á"ã·ïÊÌYôÚ2$­¾2â½c& RšwáÜuIR] y--žhÜÞ¤F‡B´wž€šu.‡,g§±L‘•6àŽµ0R·Ê–¤¨¬Rßh-JËW.±¢]­È™*?HìÛw^á†!zO*«Ó½#_2ËR›f*ô¬…?*ŠªÔ¹UfBH¤¦ȪGè’éx³ñQ‰â o(TºžéR®–|6íÝM›’Ü‘)j?-¯‰˜ÛHi*C¯8‰@©n…¬s¥®ÌÝq¼VÑ–ø—j[û›S·ÞƒmÜ•[E1EÊÛ˜uE¿,Û,ºÚØÒއЖ†Š3Äß„-Ø}ý‡ßt×=”ÎÛÙÔ+øQ.ȵjªk“#Ó‚\„¨É†¿ˆŽàKjñ”ä·4ÊEárÓ/ª-‘N“TMvê Ïv¡D:SQ!¶„¾ê©Ÿh2÷ç¹!®m©·ž¾A-Dum]C”]6UJÚ°SPT ¡Ù%¡jMú@)–ÙÛwÞÝZbJcÉ«»}Y´6–•&+†2 ±¸¡A*ZP¤qP ÈÅ¡>þÆî »ºý¦.øÛ}²—TbÓ£µPš„35qœ‰Í %¸¤>âµ)9ò‚ºcK͵ÞFîŠ\{wc?\´ìØÓ&[{·jT •û EâØ~JdŸˆÊRT‰hW£ÓÍä¶·¿³ôí´Úÿ×Õù2‘»¾k›¶¨2ík*.L\ÆžŒðø.,¨ª[‹wÏŽÊ<²…ÔI/z{"Êì­iZÕ©²­#×cUÙK¶ð[Íë± À! X‰NºK§²ëSšiK¡õ…tˆÕ7‹‹W©IŽ×©,Ê7j'Ùº„kBb9Ñ,ÛBï^ÙÚµÅ6½ åJ¢ZRïúÃmCZxºÓMÒªqØ’Ô—Ÿd4•EqÄ„ºSŒ¡÷Ù{{<1ÞVJÛ“OÝ_uYOQélÈq]})™Õ²C•9Ñ¥6ëœZPi¦Î Ï«Z¶§p­šl•màßýÉûaÛ®›P“hî´W+¥¸iŒó²þÎm¾‡Ub\`U ÈRGF‘¾÷¾ÑîÜKòí¬À¼ê;gRbßÝTR*”Ôˆr™KlUi’Uˆux¦sƒÊJ‡8H²39©òû´w2%JgÜBA¡×ìÈ>ê}g´æ]©2Ìõ­sË¥­ksºÚ£xÈ$š´ÜÜÍN¤TV$’ ¦âa1 6ópìÝ»Ø[ºvâÚû…Eµ©3ƒiMbÓYûFcU#j AOš[’è.rIKNúÁTûø,•WÝÊÍ}2®†%5l®ç¼àÖD¨*9“QˆûЙZ̪Sð²Û>Ž|ϤäjÊ÷‚âØ’·î;›íºGø;xìÊ€¤ª›CvlZÄGCô'h´âTÒŸ9•>B¸©'‚–ŸoÈÂ)öÉhF#I¢¼¥ÅˆØs´>¨l­HAIJ*XóÌúš…ÕÖË:ÀWy.ͼ/—ivp7X‚e¹• ƒÏ:˧:$Í.,³4¯âÕ©våZj)T;Ê.M7ñ ÜÅ÷¤ƒŽ›ár¤T·*(ÖöÖUªw¯·5Ú,wç2˜±4ºåM—Üâ”yò㌠ +ˆ ) ꪴ<*ß°·*]N}Ñy^·*j B†ÁUò\B¡.?Å•)ˆª;Šu´eh_­Jˆ²«žâbc6äg†i•*î «‘*nByQây°Ó/çÊ˺ËKCêm-^¥'ž¹;; á¸íZ=F³U­À5^¤dÒkÓˈ¡Té‹T8ªD|09BB–^wËqÔ´Úq–ü—,MDµ)ܪìÚùIr=eVI¦ ó ƒ,eé®—tÿ_\%–ioN…¤•+Ô]ãbÁ^·œÂ½Bü ä!]tM½ÞÈS)T[j½NÛýºsogSêõʪyÖÓTò£"5J ü­ˆM)¥¶–œ#’UÇ*QGǧ…Ê…Np¨Pk—ìü† ×çÐã ³_Œ"%ÃX~œÖUÔÈG”R ùpåƒé:—›ÓÊÛMÑØš•ûDªÚÕý΢ԭ¨6MÎëb§*FdäŠ|¸î¸×ÅB”ãc.”ç÷Ü -Ù{î’¨7}ïPP¯¦•CÚ]·=óYÓN`ƒžeT¸¦ÓÌ)Ô­öÒàS®¤$¬uÿÒY+\j+k{{f¢Œ¿úÃ,i°ò¬:±+ D)©'ƒÞß"Ës^š\ÙÖ»ñ†ÚÊ!i€¢lž‚¢I,„Š›‰-˜¿–S”Ê­:°ÂT×Ú½¡„¨¡¹,’Q’z…pWc×)ý+=7L‚äºrf+íV݈ˌŠOê‰ÀJyrÇR{àj_ø¤ÝšNëׯ*¥n£îº*µbå.}›tú$5!Ä‚îV”·ZAAJZB[$¨:ï#˜–ŹåÒàÎ¥Õf&¤˜o?*“=E(RÔêR”0ØRB¹ sæáãË#çÓ-7Ÿå*Ëß4¦Ô«Ñz”8†j$ïBVIÌÈp cŠ4Å#n¦Ô¾ð³qÄ'“=$þ>Ç·wrûÛ:­N›nIz”Ýn«ñGaJòW3Ê@(´6 V ¡È‚GA®ëUê•܆kó Æ†^eÔÔ©n4„ÖŰߒ8%:'ëFMLJ*ݸ%Évë…^ª±öD¸ •°Ú“‚TN¯R’p2žØ:xé5…S¢RÿÄö¥vÛ¨Sèh_Á×G“,‚ÑJü¨Ë S~•òW|ŽÀj¶²®”ëTCÇ$þÿx?²qi][µJÑÀõööãöŽŒ U½_¨¸Õf¯6*3äA”Ý<;Ü«)I<Ò G #¹q«ØÍæ¬lÎ×ßÛmdÔ­éh½ïJ}z=q»¦Uø¯°Â™1‹Kâ•°ã%KPZ•‚„ÓR©³XUB4zriÔǒím-Aõ)ÁÉÐ‚Æ 2–ôÖ&Aa+¥Wª”õ¯÷-Í>Z’;¶r1Å)8Àüõ¨‹gKê›”{‘Øñþ}q½k˜f%دnûðD{â}Ý•{þøšã2­kf%iØ )Ü: ™ Zž–";!/·2-ùŽ(Gm<µå’¥Cš£Oӭͽz¶Ìèµ –¸ô™H•l-¥5)ô 9æa^µÔà³ÜvôÙ»™wÙM*¹&Ti­Fž—%©Ø€<R‡5’½Èñ' $'ƒ×O~ôÙßâÙT[¦NTªeElH£<ä—&’†IY޵«°IZ–“‘é)ÀÈÓîW•Ѧ­Ø…ãìÌG> Ï¯Ë™ñ§›ç•³jŠnQMOþ`Hèd÷õ0õ?Z‡¢ü9NSåS ;!žhqQÒVrp´åHìBˆê5e±j»±vPhÛ>ýK5‹ŽÒ‹YZY¤¤¨ÀPò|Äá\ÜœÒH ¡¹)Æ 6:Ý]÷Z–5N‡á]Wš€a²ãªmââH<ø¨ã¦O_–uh鱨Ö duy,QlcŽxäÍ*ciÏN„rØÏŸ¡Kju'‚vüûOì߈ÖVÊÙ…Kx;¶‡õˆ’½ýçÓ¼sŽ}ß·ÎM¸'Ñ«·MÓVƒ@©ª<ŠƒšÖ— Ô´¢‰-¨¼Ð¶Ê›/ô \«b—fÛ›E¾/õê 픵I“9N<·Ÿ’…­IeÒ©5 )-Áȯa!:Ùf\IûûÿéÞ=çYp4Ic÷ŸÇ÷aóµv¾„«Îчܤə.ò£1*\S=>„¤ÓÔµË'¯wÝÉõ¬¢ }9Ú“ {h€º}*$yÊÇ—å²”«'èRMRm™\£Ù[‹g^µzżºU™}Òêó¡"¿:¶ NL‡P“•®© d–;€ ûÇ¿ˆ}̯îUwk¥Yö…!ˆŠ——1eÚš¤°‰ /¿Å<Ò‚ñkƒyl”ÉyÓ–™Ñúƒ©:†_e´SÚíQØýÅv•^îI1=É z³WäÝ7Ò•¯®Uš¡dZh£ï±Ý!›²€¢gòžÏgˆô[QSmž0n{™´©©·k§Ì¦BWey#ÿ߸ËÐ=É9©ZýÁp^UÉwÕX¨W«Õ¦Tê¸~IÉHöJpö׸üBJ{ã #·Ó^”Ž üóøÿ}uèOOzU¦:g¶Õ7VaæªÑ½¿ú+?¢°=ËqÀ:ï©Z“^^ø—u"˜û´ÖB/åê}Ù¤ŸãKIíé%9ì?Û[’œd`ý5œ½;£à) ûq«I)€1]³3p c9t@NO uútÐ($g‰êUÔ‘¢úˆæ@zg\7N\åž¹Q÷Ðç®xóêsí¢©IN 2᣶I'ïíÛJì0; )ª”:ãX{•(P5Š)û‰ë’÷Ö(9+9'۹Ƌ¾r柮µ“ŽÝ2z))þ4\œuWCßJ&0”ÅDÿ~zTRì[Þ»J5Ú%›wÖhi˜äuVhöÄ™qD„€¥´^mµ (%I$q¤ìw~Dw¾™^D”+áå5æ¶àIŠÓüI8Áà‘«3¶¿iæãS­ª=™[Û‹»LœëŽÄÚ˜êµXSNõpüÇ.òʹ€’®@à(@:…žkÌ‹&ñ´þZ·ÕÇtjëG‘e;°•ÈÄOÙi˶©õ…ËQåÚ›÷;™@õà“é‚v¾ËnÍéRv‘míåÛPžÁOÄ4ª+‘ƒ|”9­Ð”Q¿¿ç«vÛ/–ŽÑm]­WÞ*|©Ûýw=­"ÖvAmZZUÎ4y §ÿRcØJœJò„' –TlKe¬ïþ›Ðê»é|ÝwãF¼é™ûSaÝ5HSâ±=l…¡Ø®2ß4!()K¨.-!iQ#Ÿ]3×]v©pÕj5ª¬§&ÔjrÖüÙ.÷[ŠïìØ5ç†qô¡êRèÔ³6Ë—QV‡Ú§ŠÅw+Óg`°›¦B€HX©ç³úUÐ=?“Û.k™¯Žî>Λ¨Ú Á“$ˆ)2îÀCxˆ¢7¡#!?ÜŽÝIýt!<ŽTÙYäUî5ìs¨oÏ“Ûç­ Bµ$ôèFz:ý5  t2Ò#8¹HÉ@úöë¬8Á=³ØkGepzŒë# ÁÆzdô:õþ1äG‚äãõ'åþÚØH*è;e¶ˆ ÎF3ž™Ð¿s Ó¦‡l`G|ž™ùwЧ³îï¬I$3èORFtRF3Ôã°:<8:pKƒðÑ2@'8öÏÓG@+û¡DÖ§aïGd€_u)ê=†O}1…,Ð98Ù…‘’ ìOË@¢OSó'Û\‡.*jવ<¯— ÈJÔWî0œžŸ†¸ë­0¬*ŸQ­Jæñeu>Ú\áE#§×–‘½q»K-¼©ÉRÌý°0­8$Œc§@4aß©WQœûýt‚b»x¸òJí4®(R‡žä‚ÒÔep$à}5¾EÓ* X5kL¤üKªyäþC«]è¼EÆÉÉ/wmXü™O÷-AëíøãS7Ári–õ÷wn½zµpÑi;G·µJ´…Q(?&6´|*Ù¨'ÌmRØy äŒÎ d+ùÌ¡ÒÌÆ–ö?àjÌ;ÁÌ®£†§ËuÉKà‚rã=¹+Ûû¹4ª T”³4jSñHRù¥Jf[#W?,äñÕ ô†¨Ù¾‘¶Ó´¿Öf×4mL|"µËv=¨Qq1ÆàD‘åèN_W%Õ·9í`6åvõ®#ýnÓJ€ûÊy­Y}@;H<Ò-ÝlV¹äî}¿t×®Iò%¿yÑî¥D©&K —Vãn!l=Éd¨å)=O¨{M/[;F¹¤ì¦êÀÜ›> wzv¢ß|Ù×DßR 7šÜ’ xs Â]-õIÁW«Œ'Úk>ØÜzÛ”‹—qè[RÂKIb¥yRäùo¸¼Ÿ-*m* y,„þ=F­v󨍖 ©³¾!·‹Ræ¡ì†ÀBˆý¶Õb$Ö'ˈô§)usRTüt­èJJš!EI)ÁS}lÕO¢ú‡—×Ó·lo)Óº¢híZÔ÷TÞ ¸ 4¢*TUTû ƒjBµ¹Ñí*un¾¡¨mZ=Kj¢¨cJ¦Ô7- ¨ÕJS,d¤Ô.eˆ–,ï]>¯áçbl¢µá…˾Jk±¸¶êŸI–àZ„jDzŠ#§Ìe²ñiÅ+qA¨íùrͯÀû-êköÅËÚQ­'xA“4ÉI~TæÝuE „ù!#ÍP8H*Ìž^ú\jbúñ‡N¦n ^bê¡3!(§8—e&Ae +!´‡’œaA#ˆ8$ßs×,;ƒvíYõê rßÛÓV†nI4uŠ»ôø¶‰Ž4·2RÔ•¬e)#ºÒœ×ýmÒ_Mº[FŽiAjf5®cržjµ‹ã{…ƒá¥5ñ)øTÐS4÷&=¾«ÔN¯TÌìfµ½¡ ´j ‹E`R¢¨ ŸŸ—{»}îÌÁˆ nç°¶w[ÁM‹ž±9ÝÖv]{oíJÕ2é4û1\˜Ì˜¨²”¢B•-yƒ‚BBye¦³î„©ç`\wÍ…wZ×>½'ÄNØ6ûÆ))kíÚš—R—l‚·ÙRT€ N‹û,îZm§pø˜†i÷ßD¹""uˆÅŠ·äÕ~ÌCËy˜ÁÀ$*4Æ–„º¤sôõåˆï½»Gxøt܉6­B ¸Ò$CMBÞ«Ñg)H¦:¥†V°[kËjJ¾¡I=ƹo ÝÉ:ŸÔ,ë+lÌ[ß&Ú¶êô’ªÕFÅ”y?fE2aƒ.é bÌúWç¿NèÜŸ2³¦ÆÊt$50ÊA¢XFæÔô5áar£ºãDŒ €’0µzÍôq«Ðì ýeZÝÍØvFMè«á•$> »D— Š#ÊÌßDüò†¸Ô7WÉKÀ4‚Se@¢™Z›Œxab!y,\–&6ùvÛ^÷lŒæ‘S¯mëTj>ú훈”ÞÓ»WbttJ§Ëu3§Í .I‡!/9Ö•ÇŠ ¦ÙtÅFVü:x€ª"¿¸–ýœEû%êÒ-ÚŒVi‹¦´ .F’ÛÎ$0ëM!†ÃAË(8åÈêuø›¾îm²ßé×t[Ž™p2Õ2åb»²7Stº…µ=”¹5([¬–g1Í €]e+u Ht«íüÙ›Vä´ê¶í£â© n;•nH¦Sî—Ye¼|{0äS!Ï9Iià¥+’kHH,ùLº™£ôm†nÀœ¦ñUÍV¦î”)¸jøf§Ø°H“ ÕÃ.¬É2[©¯l2Ëšù­ ®µ-Ñ€K‚®DÑWÝ+´š+)Qå¨8$6ßeâx¸ðëe¯ wE»¹[! sl;»I’ýçq&© YKÍÆYdÇež sÆB”¾ÿfMÛí´ZÜ;ùÑ¥PëQE±€"Dy”ÜKsPËÁNJQ›¬Ë"ǵ¨4:EjÇ¢Q*ö½¾Ý)šãÐMA3b¸†Q-ļBÝm$0Þ”J”^xçQÏ`7VÝÛ}Ÿ¿®­Õu›rÍ·|MßßiÜ•8L±Owëid)eJeàôe!L…ŸHã’@×ËÕÇx”¸ô;3~eÛÔ+yp)Ö•:CJqô¼²S*s‘q-žŽ„ë˜=n‡ˆ+ž ªÖáÝ7ÍñQ 5ö¥ÏU~¢¶XFo2R€qî][zoè1{k]NcuN AŠ*YˆæG*ˆ ¿š y¤nŸú¹¨ätsÊÓ"$/˜Áôõí8½þ/ö§ÆFüxv¯Â»¨[qnì†ô*¡B§ßªqæT~rTµ&K)v7%ùlùlØ9ÕÈ•ŽÏ ¶šöss·grw6ñ´i޵d¢åaš{· :iΘíý› kL¢Û‹š¥+ÌqK*W2{ê”mýß;mâÛ.à“`×fG©·6M‘)ÁOCÉ ®KA®,0·£¯ƒªV‚UI7bÍR÷¹#÷^ÆŸ)càvÚRæÒ[©)Ø*–ÔØ¡/pIZ‚$•‘œ;gVÍãé¨Ð|1oíØEJ|Ûk*Sc³Bš¥2”¬!•' é‘ÇMWêžk¦5{Ð¥Y‚¬£tðg‚AIùO®,-¨´Ö¥Ñ)Zµ²µj‡ÌâÀ †ÝPzöÇÊ%ïáj÷¬H—W£Ý¹Ká-Ø)u$¸ nÅ[É ÈÁÊR3Èt#«z½¯Üjd8åTÓ©o.ƒQn@è:úç€>iG¶ÛsÅîÙVqºŒ‰6íZT´¹P“_£%‰aÒH_ìy.¶8’óG×O‚wFÚE³R½ž¨ZÕëJŒÛYÿWQSµ«‰qæ¾)dŒ´÷†š¬5FgNè%BT™ûÈO¹ý&&=û@“¿›i ?yhj[T?UÖ==´žÜþò®š°™¾Ì¸ra©µãSSjJÀÊ“ÅIúŽã±==õ2<4Å­îd»XŠEJ¬™HI¥Ï…¼˜oú‹)+$$/ œ¯*J”¡†œî呼2^1©uzYh¥¨>'´ùFB äÃ@(­IÏ%’2N_ [µVðݼ°*hlÍ·¦ÌBkPÏ$΃Ì+Ê àe'‰A$qu-(œ$ƒbd:¡êÞ=Úk(‘ío— Æyùñ"¼­cK9k7c b OD¯¬íê1ΪÂÜm†Ü‰Ï¹K©Ú7ͱI‘P§"»Ku±æ°×ð•ñ9ÀIJÇp: Xý&ðÜJÅ©E»$Õ­ÖdÖ,ØŠ„Ö[%—zRd©GÔ…)‡Ðz ¢l„àrOõ+z¼ø¿G¥ÍfÖjt{RdtÒ¯æå.žÇ®Cžw,2 Êlu¸Js‘Ÿ9>©ÛZŸ…OfÛ–™PT·é2`Sà15.—’ꇖ<ªdÔ :RÎp NLã1¸ÌÂiÁ"?/^@žq.Ëml­·P0>£åÇîŸßˆy½[\*÷åbÌÜÖ»æZQ£ŠËÆK¿¼fÜSÎ[’ÜóÖã‹ÎyºáôåX@Ù[=i\µå[”zD7.øtF*5(Õ*¸iá-ÃXyÀêÁ<œeA ¥8’0T¢ ü¾¼UÙ¶òÍyÚJšbuZ|xÔš—)•™ÏFul8ïˆ B\`´+÷æÚO8sŠ×7‰ªeæ›y½›¢_²)juS•QÛT:ÜùŽ%h‚c¼áYm"DŠN1Ë)”ÚùacQg°ÎêØµ*«T ’ ñ<³ëØ÷#˜ÃÕ<Ç#¡xµ+ÔÉä ‰·Ì¯ä@Ø)q\q¼C®Äd²ûôªg2´2Ž ZÛ#ÈHN@ÉÓ%¿7.ë¦B­Ò6ªö¬ÕVdÈ48Œ?.;÷WêpߘRŠ}@@9R .w¨ÔÖ­{&¬RÕf¡%Ù.PaÃ9Ôû‘~) HW”Ÿµi/…(‡ÉõýæÚóñ£½ö-v§I¬·»Ûâàµ"º×œ§ä¸ò™‡)-%)[ ²O1Ê9ë‡RëéýGNšxõ)µ_]¡€=ûIöõùÀ0Ûj=8Õ[ÁGZ^› ‘ï$??33‰`l-Àåûn=+ož Q»šr£\rˆÊ[b!•0—Br €C­, u®÷^Ú]´+~ï·7šMç|íÝâj³cn –«uHÛuâÝ:¡N}Ì®;H”êB›)ÊR¢BÆ¢áþÑŸÖÕZòº-ëº]:ŽûŽLrß©¸Š¬V_y°ZRúIÏR£Á A>£©ÍYñÉ»\I³á[5Û7%’Üd0‰±ÄùÆzPé%q”¢Aȧ2ÖeÙ~CŸä’\ÒªÇb¤©æy‚ü~èŒ_gúw<ËÞÞµ"ÔÏp@e=ˆ‘Ú8SØÞZûðüë E~ÐR«4êå)u;V½ –ôhUšzÜZ°°Dw[äÓ!+X(”€•§×œ l©¥¥IRRâTœpsùçRNVðo-zЉxÈaŽÄÛÔztÊš¤ºÂÑS ¦CJ…9´©# CÀá#ШÐãÎ>㺥)ÇV¥8µ’¥“úŸë®ìèvs«37R¦cTU¦­6™y|7¤€§¿qÙAÇu»(ÒyF£¦™e#IŠu'1°¯$‚À÷÷cHÈè3Ô–‘ŽI?މŸQQ à~?Þ49è¯cËÜç§ýuwŽø¥cÑðs÷†G·]»üý^úÂ3Ñ$Ÿ–³ '€8êO¾²ŒíÁÀNzÓ§ÏA÷IÏa’q£pI'Ü禊R y« ?]Àã8HN=ˆFWPTޏ?tÿ†J)àƒœ˜Ì’œ¤‚õc©:‘ƒ8ÂI8P#§¤|´SÉC‘ï˦F³ÇN‡ÛB2:û‘ýôÑ÷À탓ǰ2}ô«³my—uÃH ÃZõR¦ÄVž}E-¥n¬%9W°ÉùtœÙo¡–GWŽ3ìÏé«2ð§³ R¢D¿ë‘T&HiI¶â¼×Üei¤c¢~HëüCP¤kk= ¦*Ý;}©iŽ$¹o¡~ó|‡Ìb[ ôþ¸Õ4l($†¨ß«L¸ÈìXJ§©fôN- ¯wR¢YÖ¶Ó°,½¹´ ÐìªZÑÇÉ…¤¶\PÀË®©ÅŸ™°Ò-׋¥D‚yTû누”¤CžÇ·ož½ =BûŽ˜'=\ëËJv4è³4’ÌIb{’Ä–'æKz™N¬QTUÚŠ¨€ðËŠÔUNxq¢Œ‚¢H #¦>Ÿ?ÏDèz+¦@8韟ÏXT~òHO„•Ó[!@Â÷cçgzgëÓXzw?,tÐäÓ§S®Q¦Hk’¡TçE%D”>àÙÏùUÔ~G^À1äE$¦ÿy£ò?Ãùtû{œÄßB3œô8ì@þºäk±Ïï"D¨£®]†ùiÏù‘ŸÏ\Ù…žQ}Út¸èäì)mçÓrOÐé;€ÆÍ<¾ê³E!¿ýÞpç÷cUÁ&½ꉙ>#®9û–cÍä_ò„¯þšN±ÿ­"=Aº³ØËäY‚â|µ¬{§ßëúk›HI¾ëë©Nu¿³)ªÿƒ§yƒ+ÇÍ:x’”§Ò[ צ>ºÆÄ$úaþî°Èé­"¡ë÷bÀ0Y(‘Þ;ž}Ãnã ?]¤V¤.)É}ç$0²®ê=AIüF5è¡Î°ê CQ£ÓcMA€gȃ­™‘šnC¡2¢Ñ%()C‰-)*H$$0;lw/Ä•nÜØ«iûbß¾ètURmëºæ3>àçSêu¶ùR–†D )m Qt¶àh¨•«§éUÕ|ÃPdÙ%zöôÔøì2T5)0«á`Y„ò“›¼¬ 橾Œ2ÊtõîsNÖ½V1¶`è)ºš^ a Ì y¢U¶Ã){KoÙk¸4[Ä®çmÌÕT[•¹4â[ôØLƒ¹t²ë¯r8m—ЮÓ=%7í!”‹(XÛ‹}Slºý ³sͤEµëÔÅ<© ÃD†‹®§³52W(ù±ÝJTß–’œ¤“<#Ø[ÛIñq*ó­Q­›v÷´ïšdšîßÝŸˆ¹r.7Éa‡C‰gœ}ÏÞ KH8R‰@Û—fªF©ÝV)— –å¹'ü#g\-ÆM)Úªy©‡·Ð|·dòDU(<·0:úµÊÚ›Ué>™ý$-sõ&êˆ.ÕÒ•]£y{…+NªÒuefR¾§…•éI®º'_&h·ªB-'za‰@”3Ó`ðÆ*«PAö™ÇÎ *áãw¤Ì…m+u¶®¤üb™•’¥]¼ðR›rHZˆí(§ŠHqÒIHG=¥£]våã·—\ºÜz5B—ºlÔ(o]Ò[8Ÿ‚ò%¿ KB¼¿Ý°ÑZŠA JAÎ59m_ÿ¨=~•»µª=¯RÞû«Åz£Ýt 4Ÿ†·-ºdf‘òçòSJd³ÄyM¤+Î*) Jƒ÷bÝÖ¾ê7qÑ7n­Õ»{Ä íjânU‚ñUz=KD8ôú„d6¡!"+Š*ʃœ­Yšç®ª—†­ÝZ”Òz ŽËp=E5w,ÐÊHÚij1=ÑÌë¦6B½5«¾¢ÖvU4 ¦ÛG‡½‘B©“Nåí.÷—ÂͿЬÊ»ïÓiTk‹‹.¯pÍn+Kvøì®%!¢²„þåÕ¬2Vá R/N"í¿àƧ²—ÝCs+W ··6#lT¨Uç* MŒò^GüQ! OÄÅG™%…ëÌ6ÑI))²ÚE¿éÿ MŸnŠeŸh4ÂöÂÒ­ÃtTâ6ˆÉe.Ôе©)}¤òBJ°rJÔxT×íßÉ5ÛµA}Á@³Ë3¯wÐûn¦mUHæËE)Iøt)]2“Í } &ôlÖsê^oO§vù‰ú—c-`Ȭ(Û-Pìø}Õ8¢¹]µ6VÆN¾énŽôë/}wq`>·­H†eñ.™EÜ¢R}©`¡· }ňÄZñ½.xÜÉ·“ÔŠu.LzLk ”ňŽÄ¦.BÞOž¦‡­÷uÇ\Q'+Z½´Æ•¥¥ ¨ÓO}“á›u¯:fÔ\´š ™6víW…>™t†즩îƒjTöRŸ1”ehRIZT TF@°=·ð‘lY›o»;q¸Q-M÷¯¦ïeÉìk…1êÔB–ó÷Êm²Â–êÜkÎÂÛJ=ÁPõ³5ê·Múg’ѱ³+PR ‹J‘SµT²OÜJÀ°rI…äcÌL¯¥ÝBê>oVòóu2åœÔªnb@{ÌBí€9àÅ{ì–Ç\ûïS¿mÛfLJ%Éh[-N¦Sîdˆ¬Tä<¯øxÉuKrRáCœŒ£ ãœêļ?x7³v–è´w"£.¯_½÷mçÒn+:Uªš¥¥rDöåÎiI@eM6üZ*IJ5*wvî‹·á¶®ˆ3ê”)ûn˜­Z±mxíRꕟ><8l¹TuAÁ.KîYŽêŠJT¥)Hà`Æöx²´£Ú’öªÊ¡ÜtïjélÒíÛª‡0µn.¢¸ª‡<µÈZŸ âY<ÀTèRA(kœs~¤õC¬WUrü®‘&švU ´ªB’»ÆïÐIc 2½ÓNÛ%õýQã(>v&XŽ|”ä‰Úb<߈<á!û@o ÎÇø@ÚzŃߊ—ïÉŠ|Kb¦B¢%Á•:”­øí8Æ•…¸¥‚qÅFœö£w>ö»é”;ûqk{W·WEELÝwe;÷îÇŽ´­{±š ¡XPVO« Àë)·&¦Þé×$Õ®L„j™Ù!÷iôØKQãECÎ,¡ Jï•)JQêtÈ×6îÌùßQ‚Ûih£-n,Þþ˜Õ¹¤þK'#9®^£É!8Ú[Ÿ¾A,Tžâyç־̺û’ÞfÅlè:¬…V<È}ÐÂ7CÌï0|wW ÌÚˆ¹¬íòÚÝà§Y7GiQÙL¸Î"%ÙM­Ç°ña¢°êG'š©…TDØÔ¨)ƒM†¸ªy¡Pm.Ëó\%ò¥qôçŠp9ÏC¥=fkH¤Ò®Š„W@ËÕ!à?ʲƒžã?w¦º6m‚fE‘:“X²®›Ž…¡63“_DÊ„a­oFh% yIÁ[dºèΫ½QÓ»ÞŽèë“—Ó{‹zAêArÍæ!€“÷¢Z#h3´v|ͦypn)Óo‰ÚÛÉ$wî=”’ íû3-+¯oüG\µ+ê*éLÕ6f´âê/UÚ’ÐDiP\sÍy Pl¥ mxYB‚†GkŽÝŠí—{ì¶ì1»»GU=ª³”)‰p¥ ŽV8 ’ž£¡ÏnýÏm»u_— Ôµö…5H÷lfj°n[!‹­T‹ŽLi["K  n8•+Ë$%I Á/dž测• ¯N¼mäÔîúeó·êε1O)1ÐI% xÓHZz:’}Ƽ¨Õ}pÖ_K2Í,ŠŒV¨I]ª®V›…v%A‰mÛínpÝg×M_ 4µ¾Ê· ©Yk(UK§P+7•GÞ¨0( FäGŠç†k2û¨¥ªm‹\¼æÔžX‰J·­Œž´åEM±Ý(÷W·Ìg^*ìľ*ÎI¶í]¤¿íú-b«ú¾Ún—OCÌò %å©#©Ê2¢‘‚5yÛgáº×¸6ÿgnb—mÑ*®H”¹q|÷_AiHK>sz˜ àSyÇOñ{øÕÙÚ>õÉÙ[aP/ùt9Ô¨÷ËeÖ:++–‡$†Æ~³åº ¢²!‘©õ> é½A—Ï0¾é‚ ª à ˜Þd'pæ¹6ª²µÈ_8Î36£KvؤACM»4 b’ NÊ¢K.>|³ÖæÜÞk²*j ˆ<ŠmJè¶­)ž SjZyM‡IZ8,•Œ’3Œ”žåØtZMB˜(7-Fìn•9S¨ÚbŠ òqæ$2sÒ°zgî”ã'ÕÌx ¼¼:Ó·zM¥@Ù½¿¿·ò¡&¡pßÊT)ha3b)Èo0Ú_Ì…8€ARJRÚÕ…®@Cº–ÃYµÚ\Ú‘YjmFÂvm­ñ·[µñ‰GÜr>“å’ÐIm|²¡…`’Øu[Hh=cBƽi,Ãí1Dˆ¦ZC ÚŒ9™‰"¶ÔýIÒË®îAÞÛ`ŽÊ€‘µKø„°*ÂJ£(’I* #gè“Xßë*‰§VƒOº·2·$²Ê$ÒæSÙ\†T3€•+ éÕ+ÂÆ3«¡mÝm:%JSõ™’çÓcI}RjN…—Ý SŠ(¯ÈæÓ÷®º²“¶z‡|DíKèN7ÆŠ§PB’“HiE*ë‚qŽÁdêÊmªj »M‹æ%Õ}KCÅÃÈñ4ª`èHè=cðù÷×Hæ—JµÄïÇWåYqˆ#Ûû±®ê¡Réw…%.*`Si Ò"SiÑØà„4ŠÅ<¡)øR–“Óæ=ÎN‘”V¦­„:•£÷–ú@9K€ªÓwúÛ{¯«~¸·ÓöYê ¨²gÕÓNuqŒÔØêRÔèR„’3•2;j'Ro‹q&Þ2j1MÍ_%' ¥VºœYÈ)LYŸ“.ôô«Nz[+Ìsªe­©5H0J«4cÁõæ8ôÆ-M™åÙ3…¸¨¨[‘¹•x÷Gœzàôµ”©.Qé>[ŠlB ÛÀôOAÕâ>˜ööåÕ A¯ÒÞMB< ‹+†“*l!QIO®Ëÿˆè{€r5Ã…vRbçLÊ£3G›n:°Øm»kÍw¡Ÿ<×%•âN[×ok•µBf q›ˆÕ:3d-¾jæ#BJÁ$õ™”ÇòpF­‹m ¬Z˜jv5‰ùSoã·]æºÒ”IwN=·©þéÄEÞö)ôÛq©zZcÒÑheè‰mã”)\)#)P ‰ÆGMN«-ž²-(6‚¤ÙT¦ËiQ%T¨‰9ùJ®}õ7ÑÝ:ÕJòŸ—²ÍÀ¥¹˜³šeࢢzòÆ;ž€ÿ]K;~ç—›nGû¢µÀ§Ò‘)…¾Ú<¿*=.’£œ• Ž£-ã>¤æK}¤uI·¥M¬«o·†ÇŸÅwßëˆýž­ÓhïSâ©bLvi{vô句vZ‰ …#ã¯$²V®éué«QH <‰ÏõÆ5›W$0 ·Ë¾•Õ»ÚeÇiYÖãÐQP©ˆøà·BÖey­XRF âü£òI6Ù@£'úꎎ䙞C¢iÑ»¦iÔ/Qà÷˜#Ð&#Ö1ÌXÎòìûW½kgL*(#±Ú°cÜI<ö=ÇÚg=°uµ*Ó„ã=Æ{è¼<•’zq?ßÏ[x$uÁãׯ^ú¶мp *ÀJIûŸ÷Ñ”QË9$ôÊ´P@IÇsA)èz‘Øë,ÎÜà¥(9éê'ßXAÈG¸ùà‘€úÿ~Ú>õàޏÿMƒ€xÆ¿A ôÆ4e( ¤Ž^ú.xŽkO~ߎŒ8r‰>çGƒÀrdç¡Ï^ºÀ9¨Žä÷÷íÿMb9góùéÍÛ; ­|\tÚM-‚©s>K®6TÛ ýGÜé÷R?SÜifÖ™e“ÜW`´Ð$örIüù&2R£^æºÑ¢…ê9 ª9,ÄÀ|Ïñ=†$‡õ+Ãìû²¼ËLZ‰ª©/´úÊ]š[Á- û.D%J÷<’œHµh0ÚˆÒPÃl¤%¤ŒèÓ§aòÒVô¡Ù–½"Û§8û‘(ÑB#ªB}jQ%N)_U-JQ Î4¸ÉARR¤ŠO·~ÿ×^iõ_fúó?©^³}Š3 J§»‚D’]€‰üéKúw”è,…)ÓCñ5Z³ j›yÀ„RHEG˜Ë1#JH‰È®;ŒwéõÑ€JHÁ' ú’qÓÛ:ÃÕYI'Ê€=ûëB‰(èQŒ$Žÿ-WDƒ‹H1„õÂANTØã¾OéòÖræNTR2;ôÈ>Ý-+@蜬‚G^¾ß×2x+]?3¤ákœ`¬~G°O¶³çJú­&çy,H¤V`­öPŸ&AóRÑì9+ôÒº|•ldÈaÄam“þýþZo‹U›Å)”¿Y¶ %Ö‚¹?‡Nçs¬vþ•QÌjf{J+ÊÀo}³÷IýRvŸH펋WÁOPf¿Ayc5ýÐ_ùðNÔ~šÜÕíLaôBª)ˆn:@nDiÉ“Ÿ$õIú( ))uXx¢e:BiI¸¨ ‘÷WŽÇ^Å¿O«Fy.GŠÄµ¤ùS›Š•8ÙùƒùipÑ á¼VËZà¥ÍLö;I}ö™ˆõgÓæÛÝßýž½J»)®¥èÒÖ…0 ¶ÔSÜd|ÓþšwcÉD¦#Éi@µ%€¶ž˜:bjv Ó.ˆR>׊û¼ÖËðZˆì¢Ù韨ןrT¨ŠD¨C‘Ñç2ùKƒƒŒ¹”)??]a 7"'«Œ’Žs—Òõ–£ÓO®ß@DƒÇl?u*ª ¨Ó¢HY/-ž.Î:é PÚÊD€WM™:žçRïï[ü=•íó׆—ºLsòkQT×N“¡µ‘ø©²IüpOá§ _¤Ü¢ÒèU*uzƒÈj2)&D‡V@Cm¶FT¢H98VÜ!f É'ˆ’I$"{ñÁ˜pЖڿ%¨žøô‰e? û {bZí ¿^د>#w¦÷D^;” ÙÖÕJ—$Ħµ BÌ–gÇqiJÔ¨òYp6¥òæp­AM…±7ywzÓÛû]ÇÛŸ_©6ÜðŽpã„rʃÎ!‡Ò–B\q¾<Êrug>%hó­m±ðÕ²VýqXí•\87ø Të'?‚P€^bC2‰ nrN•vµ§pxQðãzï$êÖ·;pbÈ¡Û5ªlTš 5i"låÔâÉ-%¥ ¶¦”àOØPÎF¸?,ꕦE /s[+ªC<Ô7•~¢N™-ooZ /)J…µ®Å *‰r7v寕¿Íu ²þÅß*É­iøõ“õ­jÔiÅ=¯RµÅe¤¡{yœÂŽW MÍ×ñy´~öA¸v_ÃÂC7 ËpqZóKq®¼—ØC~`Ö– pJÖ…ž>¾ŒÏ„kÆCñ³ è·#\5¯"󯸪…¡n½5¤À¹qÛx% ô4KÍ«§OðàGùNÚ?Ï:åy\[:ß§1v\•ç’še>«Vj<Ç#€Ožó­º’9+Žž¹9²;J=•á»ÅæáQöî‰9V¡@³k³(4‰k}èÐãÉuš‹ÁO¸ Z>ÐqJõÅKÇAƒæ•–ªM&Ù¾Yp¯Z­ÍªÒ6Ô +%j®Ò[Ä5jÓd?¤7IhÇ|^itÔg/¼¤V;zŠÛ@ ¡V¤ÔÑVíÑÕ‡¡€ƒŽíXÚŠÜ+r¹âN²Úmê}Rì¥ÙÓíiÒRóêX}qàÔYy¢R¦¤6×?,€âr3×Kfü_ÖõU»öÆÜkzéÜÚ–_¢Q蔯 Ñd2ñÛª§¿Âau*CCªzB‚޾™÷×iéûÑh?h]Ð-ê­‹3ÓdÛ÷¾"«¥tù-@!,©/d«»Žµ=pø—]ñuCÝ(UŠÛ[a2³&§uÓá >Ì&C-§à–í¾á 4ò ÖÚÔ‚¬õ:Á¦:Ès<®…žKâ©ÚÐð)È­rRš…»rü´žÂbF˜t–_s^ç&¨-êW­ãT‰!ª¼v,aG ÂÀï"q\1ë!6/Ä5±½[™tM¯Þ”»Þ4™õ+º¢¨ŒÕ…GaÈe!×ÔÒB®)h“ƒï¯« î¹cR-ùî è2(æõU«rl1%éq <ã­B@S²”ÉòV|´«ŠŠN§U‹º_³þ«â}­–{x®ê¥¸ÆÙm{´TÔéU¹UzkU¡&,¦’´”ÈI„Ÿ)Eàç!ž#6QK°í Z¢k>D8µº´÷åC­]‰ÎKv+ > ‡I —Y§±É¦p“ä“Ä`VýJÏô®ª¸·|®ƒÓà p&PH…P OâxÄÓGe9þGoUsÊ刂=x†>¥‰$DhBÜ;cM¾« ‘qPisáS.Q:‹U¬¡J)’‡ƒ¼ÂSëRÒ´ äzIs¥¿²›sA«H»¡ÙöÚëò&%ÉWÚ[*âT’€ëLÁñK˜.' 'w{v«v¾×Ü·vÊZoî¥ëáƒC§Ò>Îyóöƒ’ã·)Ây¶Ë,¾·9‡[( åÓ\ ´#]óé-î…uW´hTÊÛ] ´â`´–óO•$ ¸ÔgÜ|%Ƶem á'—"ɺgÔ<ý©m¥²‰à±m VðIX`LÉÚÉ Íz‡¤2ªn­Z]y é2AH¤G'ÒfñÞ»ì‰4ŠÙúǺsdݯ[”«¢Ð¡šÍ%Š«mžoÌòžJ„Hî6êA J’€{˜ÝCð¯²U_;—wW%+q^®ÚÒf\;ktRÊdQëS”‡\|) J_R$–QJ[X$,$—¾™j9iì­mºU’Ë÷A«#ovV· ”ZyéÈHŒÜöø4óHòV뀕$­ a#Q§qüp¢Àjå¹lJm“{M­].Ñ,z:ªidB‡MZ‘6£=)kâ\£%†Z --¶[u HqDö¯E:ušè구´ÿˆ÷w -FIxˆ!ÒO,Í1ŽDêæ¼É5*wy熶Öäµ0ð@$-´“½ˆ #mXœ>TZ¶ÜÛTí©¢H©Qöî‘Jv ô«Bͽ‘S¶X§P”âVôéR\Áj#îDRŠu© m<} ÄeßOÛ~ÕZ–õ£x5¹ûu¸hsêô+ZxoŧÓ[Xd¼ã|ä&|Ä¥.¢B}’¯('(+‚Û—½wñ^½¡¶l‹&î¤E¦H°) A„)Ñßr@m`! ©É¼ëŠHIZ”Š’„á™ñÉëГ®ÕÐßFSp«s¨j™<øTÏDüNàÄÎÙÕÏ|q¶¸úJ23[ä4¸íâ¸ö1* ¬FîGêƒÆëç{7t ÔiûÖ®Ê}JäûUÊlàÒ#1(6ÚYBP<¶Ðx¶=!EK9RŠ´×qJ@ Žº7¤òqË®s›g·†½åV«Pú³0;} Æµ€NXÉÿ]Ye98ÀPÿ®¶Ž‡¯btPÇn¸ëóÓ©ÐSLTí;v®V©ôx¸±ê}-psñ朮M»£P«VíÉn¦E"à¶+‘çS§Ç’µã+ s'îœc=À=4â¤` `tI$è„®ŒÐƒ­;« KÚ-Nª¬#ÜAýÄáó/Ô™æYQZ…v]¦G˜Ç"Hü»bmlE°{ÊŠí&£öEƒ|ÖeM©Ô¨—]ÊÛpÊÕÄöú´Ÿ'‹™à°ÑÂý'ªýGQúÚmÿð—vÁ¨3AÜÂÛI¬Ô‡QTòâµ/Éq0\2[óSç/Ìá)9O¬e‰¾m*õKâ%SfNª1%E2(ŽHÃhFÜáCŸõÒƒfüSøˆð©‘,ŠÃÌP')£h^”1P¦:R‡pYûêÏ’´g=sÓ\/Ö¡V—Ö–UVÀ€¬ S¨ Lµ²ƒÜ ù¹œtÕ¦ºÉú™§~QS§^£7¨†zr$ˆr•‘Èö.5¯ãCzöKdh[Wj™4ËÒ%qê¥Bå­EÄ©Jqoñ©À¦Ôñyi'©:€ð7ìƒtN¸­ÜÈ©K›1Š…5X eáûÁñD•´æO„õÈÆ5aÛâ—¿ˆ±­;~ìã;oâŸc>h7µ¬ßÁR$ÔÒ OÓ½*$†ßB|+8ÕyíÞÞ[…6m*©yVér¢ÄDÊØ¦ÒQ)242²ÓþbHQT€ ž#¹é¯:ú›ÒǤ·3kp´êHò£0Û À+ÄDÇ îa“eY>P×5ZÇ•íºøpv*fè½–¹­—äÔ¾&Ïmê… ìzƒ5&êr#Ô£0Û…£ÁE2p¯-A+ Çœéͺq-ëÿt­j;ݦmÍe:†¦/'Ùÿ†¡ËIŒÛ¥E!E~`RÐT—W-Cj¦ÙX»G_Ý{>åÞ:•ÑzÚ”º{¶"è1VˆõU¡yv:ä!Âó*G©¢Ty Sb~ïw,Ëm5«sgö]¦ý»V©Ó!³Njµt¸œCÿÉtù+aYqC›¨ÂêhW“iЇ25­*ÁB) ƒ¹|B ܰ@% ¬b»ÖzSEÚeŸ\×¹jÔ.•4Ú㿆ûÀªT€ë»qz>ê<°¬@ÈPþ“†Éß}Ç™nS¥[÷û“,ªÅ¿°cý‰NGiIOÄÀŸ3TU‚N€h¥ –†_yUª-*Jó¼ÀÜ v1É#‘Î/.‹õK!É4®SZ°®h[ÓÚÀ}£(•Á'¹ ˜+‘Ø}Sjì;ŠÎ‘·Õ»6Ý­X³#dZs) ®œ¦äG…e@€Pä#:ù®ñ·û/®ý‹’ýû²Ñ«wöÒË——)ŠQ—_¦N’ò–>–ù?‘l%Ð9@/'ÔmêÚ¿¯ŠÇDUVä¼*‘Y`ʉS®­h.Žœ€I#¢OáôÕ‘E”ÌÖ“**ÝKdrÁml¸I¤¨'¶Fº³¡=wÏ´neV¾\§áäo¤çÉRg‘u‡mãž`†¨r '×<­Ö½#F½( W‚âyô2{«Ï#i™øe—áÃ~iÔ7îyû%»0-¸üõrVÜÏDv²R¥(µÑ'‰êztÓ>"·Œàž™9ûο@-Å)CÌ}Ì…KÅDç¡ÏmW¶ë~Ì µt›Â¡h׬z“ò‚ª±vâ¶šL ¸G¥6Ò²BŠ™ •(¬òQ=»¤~˜95Õ˦ubh§èµj~L­µ¿¤qëŠ+T}s‹{tlžôUoÒZ SüÕ—püCO¡ôÇÈOàž¾Œ–p^„Ž™Ô—ñSáÂç𻼗ÖÜ2˜«GŒ„͵k±ÝN'Ò^'áÞRËk!%*I…%XÈÁÔqârÛ8$¦»')Ì2Üó,¥yjáèÕPÊñR$óØ‚;ƒŽJÍ,s ›1©ir¥*Ób¬§¸ Áç¸ ŽøÖ”€¬pœdïé­„º À=@?MaRŽ‚xöÈ:9ÊH+N=ë§UA†ÒIÆ…òÆ;œã:2º²yuêа€ŸQ?§ö4HÇSŽ€ài`„q±=2@ùè €ô¬då:À‘Ô “ùë^ºv$÷Ε¥G>Yä{ïé¢pôÎz}5˜$r$ç–1ïúèù©d ã´Œ(PJŠ’ N=þzÑ)?3ÑY×={㮽ã»%æ˜k©{ !=¾º€$à1Uqï¤Ó©KCiK‹@u!H@%J9ÂP‘î¢ztÕ¾xzÙäXûu´t7sÖ™mu2¦úÆhõDdÿíî£î¯¢F£÷…m™nK‘wµ¦Ÿò›j3íß¾œ…JüA ÿ0'²F¬ZgóÐÀ˜¢ßŸ²ÝM&UŰu%*R–»¸çLc 0éè¯|$ñ=‹UžºÆíì]eÛní¤Ôiÿï­ûŽ:Ã@|›YHúc§ÐëëÑlŽ%I_ GuÁ‡é¦kuöCm7†õpmZmu•# M}®˜=z´ö20=ŽSß§]]Ú/­ú“N:Óº&µ!ë0à|füWz›§&}nɰsú$Jþ^ª~`ãçªÏÝ«VíòãþÄ«¯¥ÔÞHæ¯ÿ¿u_NÇé§=y’ ¼àw|B~Ì«ÆÏ.—šíãDh¹mJO‹)ÎO>ø¯£ä}#PB¸Û¶Õ°.H“d5—h×ZoÊtú†0z§è5×ú;ªš{UÐ@[Ôvaø¯ñYäÝgÐûü®±k)üØÿºýàß·G8@GAƒÐã¯m„-òq«:jUéîC#]ö]}•ÜšWQÇ¡î>`‘ó ©lL§Évµj¸˜“–¢eS\Wî]ÏÞ8' 8:k¥@ºâÖ3Cj§ÕXNd@’HÇ\e* g¶p4ªÎ@ÎcóÒ^àµàVÊ$‚aÕšPTz”qÅÎiû¼Ž§ú芕2¸q¥}o|‚•ßqÙÇÞÁ¿Yæ‡Ó bT¡ž‡—lüýôÌî}+Ê\;¤4µ%A©AÄä/Q‘îP~šíE»'Ûî}™x´òx`F­°ÂÔÛÿU+ 8û£H‹ÎÿEa‡i”¶?û{©Ä‡¥Fë äpôŽŸ,ëjˆÔùɳ‹LéšÍ?VÊTûá=ã ÔÚ–enªÛmRD–@/ÆšH_ñ$…’3œê@ø_°,;žø²vþò•Q“i\;‰m2ò¶—,¸sÚ(it¥!D´ÉA´ýç8ç:¯ô72sñ)ñ“2L™Ij-õ­Åô i¡’T¢@ “Žš° ½ýàÅ‹zmÚ©—zXn»O¸!·»NfC-–¥²]mKbSm…:Šz- ¨‘®]úVætÿ÷`lh\x7µª'ƒµ¡Ë(¨Ip%a™X•j`47qQÐ=q–ëo»-^ƈcP:Ê*’eˆc¹NÒ 0bG¾>€w…³þ!gÀ‘fî-¹YÝ=¯K›i0êU!ÄSËG—*LVV¬–’„,zÐV@Ç#§‚A² À©mLim˜|f«Ðk‘<æ$A˜ü…%¥­Ä«ÏO›ñ_ºêR’ž@ ÀŠ(^<`Tf[Vý^ì².ÝŸE"urݤ0ÔÉÕ¨qć†#„¥ùĈÅL6¬Ëæu2,{âœ.m—†‹.TˆhÙÉïÛ·]rìLÙs*«n2¦ÇjP<e–<éNß+d/‚μWOÞÆ’R»¶¥jü3RÆå Rš’È̵‘âE=¨N^•Z¥ ŠÕªf ä@”™€P7È û²Û›Úçý–¾wp¦_H°-û!ôÑ#"—]³ »¤ŠƒN)¨¡Ã 6RÀ UÍ$€+ßu<ø¥kußjÈ¿é;®‡íˆ¬1~Û×Ó"§oÉB¸Ây¥¼¦Æ<²âÝSn‚¢žŸ@³åV.fžP”ا:Ê•L+ §N.:póà’N€‚4ÕZ ŠÈ»gÙñ( ÉÛZîL·ë4ê“lŠ[Å /Av>SN«ŒfØÊB猧-Öº¸å¶¦Û/»p—kµqVà¤N.ÄmR“MÇ&©aç„–ž i¾M„áK¯MÕ¥;½—|»ÿu&O¼o™ñÐÓ×]JYRÊòÙG†“’iHJzàu:g$l= O‰T¥WnZ]FŸ5™KISJH錶F~½õè.†ú åºo*ñsK‹Í¤Q¶Šî@Ü¥‰ˆŽXíŽ*ÕMMGXÒ³ñ-©ns ÎÛf'c$‘IŒ}MÏNÙSj6eƒG¬Ó­Ä1¸S Iµ­KœUâU)11,»Siõ•²Û_™/ö[*S*Á ~#¼NYÔj^æÛ=Ö£^¿jF•l=lZ“ØEUO¶j5=ÎAŠÏž–”Ñò‹Î žj¢®"ïVæ-vS«Ò*]²éW Mëb(“)•‰rJ‚0™RXS1ß} -Ö£²IIQkYa¸èBB[C`q Ht³ôwÑ~êµ@ùåP”ÔñN‘rÇ ¼ ¼Ç`Z;‘ØTÚËé3A)”É©—¨Ãš•L÷ 'wä =¬¿@LJz•gºF:üõ€}c8O\ Çñ%]{`öùhù õ#ßR%pÇ8 HVGcž¹:žøþŽº:åöŒý48ãÐŒddà÷Ѩ ‚œà÷!Du΄¨¤ž9'8Æ?Ú(WLŽÙ>úØsß¡ê ®À8'H'Øã êë QÏ /‰é×–„éîG¹þÿ¿˜ñî1ü8´ àÇ"¾DŽøè:juÀRã~éWP?]l9%XÆF:h¯¼Ôv]~K¨‹–‹Ž¼êð„¤ ’£òé¬UêÑ·¢ÏQ‚ª‚I$I$€’H98ÉL6áÿÏç„=oom Ïœ¹Ô( qÐ|×YO”¾ØëÇþºhQfAÙúÍB³¡O¶*¡èØsåÍi×£º”ZZ¼Ô€ç–ŸJO$“‚PqÑóU7=n=*ˆ'Ôi Ïa‹¢Eºª ±!9C±Ðzá%I*P€T‚ ––µ5Á úEßé¹mj5¡-ŠŸøž‡ÈŽ=N”°ÒÒÀÏ)²´†ÕÙhld¾\}%þž](ÒZŒä4r‘›[)Šïâ"$H·ËQ¹ìQ û„€XKiu#RôÖ¥*Þ#7f4÷b@£y,6«ÄÇË o{SÂfãY¯ œ†þ×î…ˆÔYÎ[‹%¤7RŠ×!! )¢¤ËV}xâÙÉ!D$Œ.vCqé¶lxH®³@¦ÔªÆd›jcK”i.E[KyK \Ä„”œ«îƒØ¶º6*‡tN¨]ûUkF·îJlVÝ~Þ¼­Þ¢ÕáÉ…æ£Åu%,¿…yjXãåºOÝ>¡ 7bи6¢á]jÝ´™—c]Ô˜ò¥@ªYÉà [eÕDBœʚõó,¸žØg\KÕÝ륺Z³#=2jZVÿâ)2•Ü7±†Öšn¥÷ë°eæz«Jõó+•*Šwdh´+’0¬¦í¬JmÜ©;AR¡íÜ fâöç6ü=ÄpÝp’º½…!êkÔ§%Å@¦Fu·Rë ièÊÀ$qÊ– €P¾?;SyîÆÚÝ-¦ÞÛh7Bï°åAÚË2ñ<ô Ë•ùŽÂaeQ[a–^l ¶\_™É È?:–Gˆ«‚ením­5jE×jܵ:¼ŠU•^”ü™cEiƘm6ñàã§ÿI\ÒÓéj@íñI·÷Õ³»ÔÍÊ…kÝTË¢eÉH¤ÜS •µU¦4µy ˆÉ)óBT÷—ÁG-ž) *×<ÜdË’_ÚWÎ6«[3*£3!z`…e9e8Ïé˜Ü ­…®‹Ï2ûìõPU²wT¤îÔÅJ1±A§JD„Ó(ÎÓQ¥H?A›_TßO›ÅWOï;;ZÛKŠ…:m±·›5·5g.Yó$)åÊe¿‚‹ÌBc¸¥¯Î)B=,ÅoµG®ÍѸ_Ø«Ù·ÛØpZ¦PäZ´”üeV.—1éqüÀòˆÁBR„ ¤s *UXÑwï6ý½¼wKº¥×hT$CrKêûNmE‰‰R'<4ùq^JTr9q)ÏPÖÕcÅ…T©Ãƒ$Î…{­G–¦ü²â¢¢Ÿlã¶½fú WèTiÞ¥;lÆÄéP ¶ÂGu§R‰Øsudmî»I‚Jíë¤f¦Ô•êdùi[KZ&WÀg󤺉«å&YX•X¸—ÚbD×|fø±¹|ÄV|Fo „-!*i‹ÕøÈ)â±Ù¢Žœ]Xúäg8=?Æw‹Jc*j‰ ãi¿² ‚ïgÞÿ‡JŠ’‘Ì’•£ëž:rÆ£&zþì¨ôõ=ôr †A8Œ®½$?HøBŸÀÑÚ=<Qÿñü†+é^¨5KüemÇ×Å©?þü-¯ÍÈ¿÷Fµþ$ÜkÎä¾+áµ6šµÏT\¹ mK+( QÈ@R”BFœà:i…g—·¿O}l ÇBAÎÐÈ€’1Ô?е¡iEiÑP¨¼`À 2Ü\Wº¬jUbÌÜ’I$ŸrI$ŸÄœ’ÕØŒçÛ¶±9HÁ>ÿw§=2N·÷þú M‚x«Ü~ºÏã ñȃ}È裠V;£$çÛEû¤ð$“ò?ÓB¬rÂ21Øï£(ç è T1ü'[BÂÎN; Ž˜ïÓ§\`‡ä~z2'PÊyŒá¬)V±ß®Š”ö99ÎŒ¨ð ç¾>z<ØÂ…UÑ]{œþ’;´37âj#Èyª\B‡n)íSl“éeþG#è9m4ö5§R¹«TèØnJ¨T¦©±P:)gøÏÉ)‰>Àí«šÚ­·¦í峉 !Ù?úµZ€O"I›Ÿûz¤ÀÓ$êŽëWRÓEä¿ lßé• ýEì\þ—ݹì¦m^tâ§Põêëþƒ@ƒPþ»wZCä{¿²ñݰ¿¡QàQ C§ÁŠÜ8pØ ÇˆËa(BR0‘ìëó×}=:`##÷¾˜Î‹ÅI W¿– W`GË#BÙ]À8§çÜç·MyñV£ÕbÌdž}ù<óFmméФDÀ€ìù|±±8âž9$¤ù™8ïØã@qËŽI)#’{bŠ‚BrONÜp0t*ä2JNˆRznßž°'@q‰äœ#¿" ä:öÑ—•êûù*ÇN§A•'’ˆ>’z{|ÿÓZʉâ z’¥cǶ‹JœmWÝÎBGS˿߷úk1€µôäIWcõ'ßDQ¤ñHJPpH?랺À PÉm_Íóú{w€<êÎSŒ8…ô÷*› ‚ò¢?.äg[û•®ÇÐ@:vÑr”¤Œz‡^|zž4;`ûcƦ¬§¡Àéó?—ûçQ¯{¼,múÓ䎭Ö~Ó[ 1sR–g¶±÷ Pèà‹äï©>rH9N:«Ëè´©¼€Ä ž‰ôýu³kwue\U¢å\v Áž5ëÛP¸¦R¢†_cšMüý›³´hŸpÙ+{pm|œ`°S62N\GU1ÕC)ÿ6£­¼—m«!4{‰‡«1ã•Æ¨¨¢k)Êáú+?޾»ŸŽ•¡DñRŽxŸ|œuùa¨]¿þ¶{|b½&M)«Vï Ÿ†¸­ø©o/u9}”„…{ñ)Q÷' ×@hž½æÙK­,Ä_×_½ÿì߸â­Õ}.ÊsëRªÞŸî·pÏ8§ûVü¶oÐhõ¡$¿LšR[?û3êT’4­ÊpQOA¦O}üo6ÁË‘Wn—=©Þqn›|©j@I=T¬ à€~Y零Óß*å#…:çŒõn#D!OåOhƒÙDà/ðV×]o¦:ƒ‘êKQR@ÃÜz¼½×öŽOÕ½ÍršÌÖr@ýá¿á<ùLž%|ê| “)b¡4¦‚½(’È^?Ü~Za/kE-j¨QÛ2…ky 0–ì‘üqÓ秚ݻ­ë²8•B©µ,ñ̈¤p}£þvÏQøöù¥@VIPÈ9Ê~GSR)ÜSܦG¾+|·5ÍtÍñWR#º4Ü{|ˆïóƒŸh=K—£å"L) z;ÉR‚‚ÛVAÈ ƒ;«ðåâêÇÜ]ÀÛí¬ñ>›zàÛy•èñ&Uw":¥?Iad–ר‚%²Øq-…6T¦ÊTA:hêö=³YYv£FŠë¥aN>ÊKK^?›‰Ï×I×¶®Ð[­ÈnÞ¤¢C æÌƒM«=ùw©Áïíª3¬½É:µ“ŠuÆËªa…*ÂwÓ-Þ ‰ç˜‘Ï3ÜéÏÒ–…¸Ü”ØÒrú#ô_@ºVKqp¿ö•¾ÐÌ~©ãŽ)ñûñÍz÷éYÕÝn¯Kã ú¾ÌGûÃÎ7ƧÑ"£:MV­:m^¯5©µZ¬ÅÈ’úÈî㮥Äèél „€>Xí]zóÐyø#ô×KÛXÛZQé¨UQvÒÇ8Ü]ÜÞUj•³$’I'Ô’I'ó8 žŸxëNœUÛ¡ÑðpJÆz© 篨÷ÖØEàSßȶ4¢3ŽG ÿ¦³ÔF=]P¡Û>Ú1äÈŽŸC¥í3Øà¾°z’0{cXT“÷ãýtudá@ǧmg° 9Iùi[Dà qê Fs€ûè¥!# 1“‘Ø{ë=±î=óý4#=ÀëÓ9:Pƒí€)ÈǤcA•uí•w#[TJIâNH9 vÖ¾#°$ŒàgBà8=ú–kê¢éÔœ£¥y‰Jˆ*rúê+W¡×`Êuº¨¨ä/Ðôµ­HXIèBLã¶‘R¡AÛ,ƒ#Lò«)ªˆâ$™öävüñ&…RŸæù"£¼A>Pš‚¬„÷ùzG9¥y íÇ·äu ÕŒ—â GT““õ×®-b«LqNÓj¡ŒŸý'ÊzýGnùÖ¹¸1Èĺ¯Oe>Ê¿?5þGã9G©¯ã¦Ks.¸2#³N¤ËD¹qä/ãc¥%QÜmh)RJ‚€QOûüô“…¹—4¡ÊShuS5àœïNë­i Ñ®(˨ÑkQáTÝó ÖõNBJ’ç,ñC‡“œŒq¨Ž»Ó^¾Ñ÷y-ÙaBå 1S *|¤È™QÞAìDldú[ê<ÀW¼2ª|¥d¬ó÷¸=iý! „&ªQ+²•G‡5ÄËu5 /ÄS²\ŠÇ}ko+mÉÂQ«¦Ü׿Yè Q*ŒÓmäݬÉõø5 éŽÃ¬· ³ ¥Å²´²Ûë ñtrçe®M&ì¶-÷è´ú}í6áiŠeËQ’ò¢š{èqB˜ÛDù¼ëŒñ(‘̨ãwP¨¶MNÕ¨¶Ý5rñ­Z°¥¶¥¸‡éq㟆– ‘ÄrIÊ’¤‘×_:ýpÉ2í7ÔŒä=­g§N¥E·„\*8²£§$@;„€Y÷]^åY¥Ýµ:ª·“*´9VćTdŸÕ}Ë*7>¬Ü÷>Âm¤=Ô¨Ç~ï/Qè´ Ž’Í@Èr3Œ¹%+u·’µ%× ªe Ï”ç**:g6ÚüVoØŒÚúe6U¹IVÖÔêUçi²åURû¼™Qå’S-àŒ’”q_"¿K¹~í­ÏX°öjѰ÷]“xϬ*ø~Eê­)´Uã-ÇçNf#ei[ÈBUœ4\APR’uÅñázÂð³JÛêï„U}Ó“$%Wu–*§.(‰éN˜î€Rãÿ»K.2•„¯<ϵµÊªg¶uÅ ß§‡Xx”ãÃf¦’ ¨ –Qå`ôê2´HÐн/¯¨:ky©÷Ó§Pר©T½J öNÔ逈4ÞP2nÜ• Ÿ0,«_”;BvììÝVØ Zû- W8«¾‘•ȪT’”95rä$¶äf”C¡! [`/©\RÕß;Ñ i.úâî4ÏÜ5ê³°eÓ(õÏÆô9γÅFHZ™“Í­ J’¥–Ô‰ÒktéÔö­-*©l[Û©gÒn|uIàó $¦§biŽZVž„û'MÞZ|o¶”ïoA¨]TÉK¦ÛnÙ ,°eá.7R}Ô¥-Éø–œ $‚¢Øê °Fõ5u¼Ô7ï)Sª+Q «J E@›€ aYIH–›j_Òûw©î|Këz5–âÜ(JΰM? ” ÔêRì ÈÌ‘ºOÝ'öV5B¨i4û–©\UZ Ü ŸôY¬5.IãJuŽÓœ&Á?¼êè¤EµD­E¦¹fTê3Þœ#˜B¾Ò"}¢ÛÑþ!*‚NžS|ƒ©(#®›ÿtÚŒý®£ø†´™¦Afér)Œ-æm·ü¦ÓÆŠÜ…"R\p)A?»^m6¸vuùO¤D»èô»Zu­Srè³î N޶ôhéó'7ðä91Á*HJTÀ‘›¡Ýlê'C2/¬4VëTüM½Bµ‘ê-3L-@HYR<*©\)+ç…[i,¾ãEŒË*Z«à»S¬¦ ¬ÊêØSjì>B<®ï¨,÷ÕèÕç)õRÛí¥ …‡NR´¬t#ýú ë–µ’  1íÔvÓûS·-cd¨p›™öÁƒLe»B|¸\&JwâÝã÷–áè}>ØÉƘ$žœ{BñíÜ{—ôSëÕÏÒ'¤ÉŸW³kj©Qè<ˆ§UémVˆ$°¦ÄÆ×%‘á-´1‡eªf´]”Gd’ îÚcp‘^ݵï YJúàóÿNúóGUjLÇUç•ožÞŠ £ä£ù“É8ô¿Eé,³Eéú9}¢ùw=Ù,íócÉöàÆÁ÷’ïHAæœvÐp@Î¥ds“Ÿnº7\„qè{+åßôöÑI ž ò=ý‡MF bd nNxœà=¾Gßþº×“Ðç겞‡é¬ $„z( H÷ÿ_m`Î9UÇÝC®4^¸XŽaD€z‚tS€VA%±Ý qüônŠ8sÕž‡8þÿ]aQ \@å÷’SÓ=?éòÐÁˆœû© H*ÎOLgÜûöÑ€RT’zÿ A$ {~xÑBNR=A'¸ÿSÿ¦ƒ ææBŒ¨Ž½úõЈŒkXIâ¢8ãÈŒçëï¬PÈä •ƒÛ¡?^¾Ùζ(#Ò• ¯>’Uޏë×DÂGBžärèqóéøh°¼ œ¡8HÇéúëZBFqÐó%#ãóýFŽ쬓ƒË™ÈÏÏBA<ÀF:¥#¯÷Œ kRTVPNºrJFAúôÖž * VrIã®zÿ®½ GŠJ±Œ‚œgX°AÈ邿}Άßi°#MeørYeèòZSnÆ} ãkAÈ ¤ôRpqס÷Õwx†ýÛSºÂmnÑe»ìt8¶ä@kŸpã¢ÐSc9û™OSéÕ“-=S÷Ò”‘˰è:tÖ•2ØäIô*@œþ:sÊóŒÏ%º­jšn=AÚ;ÌcN÷/³¿¥²²†¼~¾>L7Ã>õxx­%Úå¤!0á4›¦‹È´âsÝ.#¿Aœœ}äxm üŸ5íŠj±{}­ )ÿ½¼}8ŸÇ_W•ËjqA—L­S)µjd¡ÆL ”4<ÊÀ?Ä…nýþDº«O³:ѽU>áÚ›´î…¸ít‚a¼áë„8A-õ#¢óßI×Ih¤[vZ9˜Ú]{÷—øŒSúä¹nuDùAé<:ÿºÃüûŒBZÁC¹a ôJœj‹ ½ä8Ù=pâ©'èF»AdœŒôΡ†àí&ðx¹sÑë¶äèD–kZZ[~Êæ:)\”ýt²³÷ýyð‰ç$'·Mg ü]gßñGüºêœ“WåݲԦá”úƒ#óõž9GTô“:Ê]šÒj(ý!ÇåÙ¿(?#‰@’ŽIÏCӹщWÜë“Øí®u"¯J®ÄEF“P‹S„âz? à@?%é?C×]?ÿVOLJ×k‰ŒT5©U¡T£© ;‚ ƒøŒ I!I÷ès¬Hå•àŽ½t9äQ=3€GMJ ꯟQ,¬cÁ‡ ‘HÏLaë„}î¹ÑRJ†NpUÐöƶ)IO¤g©ê1¡´‚õÆ,`‚€=ÁWmòä¬ã“Û§ËAÜþÁ8ѽƒœw'ßJÛŒäGD£ û¤} JÉê¢Iî1¬ÉRºe$û{h§‰NJqü^ú(uÉÆ9~ZêOÐ’s   {uБÄ{õ÷000PžX$t÷:):ã®NsÓ§n½t$xñû×J"F×ÁPÁ9ïÄ—ö5ŠÁ9*.XöМô$„ô$㦰 ù?C¤Æ’AÀ„äh”¸•%i’•I?–4p@äž½³ßEHêé×®Oïß@%LŒqÜ¡PÔ“ÎL9)èÔzŽÚh*›S9õ:¦ÌÃÔÇ‚ô,¨•våœv÷:}pF1Ôç Î´e®{ãæu‰é+úaÿ,Ô¦XäÓ©3˜~òcò#ú¯lש£”ê]B:$:YæÿÉ9¾ºH¹GªNxGb3ÊyÐåºÂûdœ„œRzŸž§ZT;ýäüúcÛ^U³”ƒ%#éôÖ[0ã¾'v}K¹¢žj·¼˜ý‘üq¶÷o÷jfçØ´ = ùÕ ,uÒËè\¦ë ó€!¢UÇ÷y(N ±Žúµ;+ÁµÍ»[gw1º?cÔ¶þz¯·T–ADê«(ò ë/´ò]m"R™xùi*k‹m‘ÝF+3ز™L¨Rã”­©0ä)—[P줭$)'ê?-?Tß{ýI],Ê»!n[%´Ò72˜jKyžÁ¿JÑ)¼u‹ŠèqŒt×ý þŠÔz¡Ÿ¦u`)¥êª‚LJ;[ÐÔÉ)4Ée ±ˆÜg‹Eõ+A¶hµ³«A⪲«¨•]Â72C `gÊîäœ /ý¥ñ'°Vm6t+úé´öþ„ê)´H•Ϊ{Ó‹žc*œëd-×”@B”¢§INÄ Ü›ª×6õmåYõ÷Òjs]Öå]+—P/+—œÿ$©OÊ.—=ÒOÝÀÔÝÝ?÷vãmɶ›Á¶†*¡•E¼¶î òÛÌ/› ~#Ëq·’•%9!ÆÔ¤Ž½zêS6ËpÛN£Þóf°êœ§@ymÔâ°”åé „ê9§ÊH%Eµ(‚Bmp×R¾Ž]@Ñw4ê ð´Îæj|¬îfi)Îù˜‡XÜÄ÷ ™ëXd™ÅõÊjîµV )Š…a‹3¿Ã,ĈmÄÏ,pìøq©M¨Ü–EÊváÉ”j©v“*L˜®Jj*O[Ë àè!\“Ë )ÈN§•qûЧ²4‚ݦҬë½ÄÑLjl¨Hn=,™ˆcÊCn£ï””£¸ôÚa­ß1öY[arÝ‘—\UÈH\‹"Uu‚KÉ(.Ëi‚Ï–¶ÓÔ2c •#áS&¾i1O&+ ¡q*ã®ꆈÍ)ê* H2#‚@ñȬà†Rb<Àp²F*ÍyÐ ožëK,Á-X¥z~#nxƒ38!¤}Æî)dL€TÔ'ˆç7 »Z¡±—%µPµê´;•È×µÓ…±Mªªµ6Rà háÈãÌ´¬ RA²ƒÛ¹Þ:Å:zYÝßöµgreZ´è¯Š{bTfä*3¬´´;+¡×P•8’Ï,':¶íµð‰ãº¸6MáKr‰¼öõn)ñ/{ï©H©!–ÖÓ›rckjD‚¥ùÈ+â¾Máy&YþÒnØìËZFÌ·6~Ì߻𧠿ŵ\ñZm®2'C\F’Ûn!@7ñ€Œ ^ n.‘ôz¯Q*[äuª¢ÖrKÍB 4ï$WUUPÄö µTó8°íº9£4޼{³³(¦^¬S%™š£*»øEœyiò %xãu{îâµ-kjÝŒü$Fe—«±Ê‡–Û­£Ën2^Io ƒŒ÷9ÃdH¤tÏõƹé錔€s€p€{kª‘ÓŽ{{{×Ñ>é^‡túßNäÊÂÚ‘v—mÎïQË»»@’Iöà·ÅàI$rOêI1Æm¡Û:­óqâE•½‡jóBL8`Žg¯uàuí\m§mS-ºE:‹GŒ˜têTPÔXáy)JI9Q÷Q'‘=É$é°Ù=¨‹·–ÓQ] ¿\©;pKhç/õÃIW»hçÕ^úÛl' VJ9áDâï¯;úÇÔŠšã=ðè7ú%B{1ìjDzû/ÍŽ;ë¢0þ„d†æíÓ®/ýEî´Çû½ÛÝþKÎ@©QÎJHõÓGBA9äp V3øèG1ÄàäŽß]á@”¤,-^žG§ÐçðÕ0æ/å]£œ…¤… d¤àþŽ˜Ià Q éÿާBRy$sžG#G õaX@R Pþ˜÷:Aç¥8ûªQ=G§8þûèÙ8 (qô_}g×÷’pOœk±… ¤ô|v΋gôþó+F×'®?-)<‡ 2@W|ûãE$àåDž½ÇO™öü-%-à§%JÎTG@öÎ] Œ*QÁ)É®Ô ví èLƒËé#Ë$§ß#8üÉÐwEeIr:`` ˜ YRÁP  ?/žtTá}I뀅|» ÑòU‘Œ+'ßçßEã•R¥$'#ÕÐ|ÿÓBF `T•c OX?ÏERV•9€P‡?ß]bz„£ÄtÇ.çæ?¿mläHVO¨ðË™#§¿Ó¾†{cYIzá:ÿgAÝ>ïbâQÈÿoHRI蔤§Ð@Ïã­ ’¥É™éî?§Ï@ñ¬zrr³ƒi+Z%§tëõ÷í£òè啨•{û‘úèrzrWdõIP'={~º#ۘƅ´’ˆ(_.™H_÷×”²Ù8C—^à’Gûu÷ñà0G.Mœ(ŽX÷úkÎR”äzqê?¯Ï®ˆ4`ˆ Õë·v…ýI~ß¼-ú}ÅJ”‚‰>0YЮŠB†{¤Œj ¼C~Ë¶ÜøºöÈNøy+qv¥MСžÍ9éJýÆv꣜Ýém*HÊ⮃—Còéýy^Ž’@Ç$Ž$öÆsÛûêCjŒóLÜø¶uJûŽàþ#¶ó,šÃ3§WŸ~Ä~ÎF>9«þælÍÇ"-j[´+)jem œý׆1þU޹éÜ<ö†ÿD’¦aÞQÓ ÂšseL“ÿägº?ä}¾•·?dvïvèÎQ¯»fŸ[Œ¶J—åË`wô;Œ¤d‡)8íª]ñ û2î›XιvaõÜ´„­N;AyC S¡T¢µ>.,øŒ¦DG‚ÛWæôï¯OÞQÁ$g¾=½µ_ŒË¿6¶°ã¢«mÔ›{„º|¶”âêÚ½*#õMH[G~èµ?*ÓQ%¬ö”~NCYù¨}æÿ<¨×Måz“/Ìi+†ö ÊŸÀÿ8Ç+j^–g™33Û}µ1ì<ãñ__ÅgðÃþ¢sßï§ç£‡Uôõª<†e²Ô˜²•Ö˜~;Éqµ˜PèGç£ãŽ1‚{÷Ƥ@ÈÅ`ÊPÁF$ñåœ`œcAÇ¿ÌvÀï¡_Þ>çÜ‘<‰#*ìm*Á`0ÈÀù=ô¬óH#¡Y’•pë?-Žy=°zg:#a8ë‚Èщ{ T¢Hꮀ{h¤’0¿cÓ¯]F’poR‰ê>½p3¢œ(Žÿ¦‡‘ Rz½UÈÁNqïýt'€À0AÆ0F³8#'¿Mñ%A8íÐçD+äyrOLïå¡À¹À€Nzûã?é¡'$’ IžºÀýtP# õŒjPä!€£×D(–ëì‘×:ÚAñÐŒŽý}ô)NRV<ép­ÄcH´õõw#9üµ`¤§¡ÖÞ%Y$ä3ÓFÆr 0qÙG餸Ž5–ÁH|õéßJ͹¼ë[UzÑïËJ=ÖèRã Õ©I“ þh)[rÈó z‚}î%±”©*:Žº( RqПÓZ—™}¦ajô+ zn`yìGÏew—Ü-jUÔ‚$AA Ž1ôs±_´·Â=.‰⻤n]‰sÓ錵^±o9T¤Ì”âRÛ² yn8„-Jp6âÒ¤¤¾¬r[Õ¿lo†z•‹kZÛ»rÆ¢GŠLVèñ©ì¨·#‹@ºô‚®.¡Jt,¤©# ZBO˜âž‡ ädç¡?í­Iþ>£9QH×5Öú!ôzç4kš©Y¤Îß…^f&èö–&8“¿J>©ÑËÖ…6¤ Fï>’e¢}à<Ç8ú6©þÚý«ÿ]¯PönüU×å&ǧ×*ñ~Μ’¼%É®´®qˆI*ShK™8JW×:§/ž)k^-7E‡W´­ë&>ŽÔ ŒÚ_˜Íõ*—8¡.Ip¬«XKi!(J}EQ_!@ŒÖ(d…%DsljÉÑ=éÇOs3y–[®A™ÝÈ@’$ðL“L ÿXuƒ_k¬¼Zf7¨‚ÕEPH$‚`"`A#ƒÜæqƒü'îôÑÀ »22u¯Á2Hë­„ñO×äs«iUqX=1¬¯#¹HùŽº:—ü„zœtÖ³…+Óßw8ÖžÙÁþúèÄ  ˜WqŒ` Ú(¤ž£® HÖ”‘‚žq¡ÀãH'Ø+ÀÁp'·/s¬' 8϶±J'§L`Ööu÷ša¡•¸Nnº)`ÉDz›ÎQ‚@Bì=‡âudÞ¶y1™fü­Ã-Ê’ÑM«`‚é{)i8OÉ9?Ä4Áx}Ùá|ÖÒìöŠ­ZÈ]aÂŽ?ùê˜ã¯cÝXì‘óPÕ°Sb3´6Ûl§ƒ8m-·€”Žƒ·¾1ì5É¿H¦šÎGbþvjÃÑOd‘êÝßÙaHã¤>3lîôj ôûgì¼ÃƒTƒè¼„þ´ŸÑȬ$e)ℜ€1Ü÷úôþýõì§ErQpq)Wq¯Lè™ÊpH)J€ùž¸:1 IÊJ’äc޽uÇ ÓŽâ¥L*àxú0ÇÛ9ÆGë#=Ô¬'¶t%%*9ÈJºŒž¤ãñÖqo*BÖ äx=½¿-b&N3` ^Hdð8ü48OÞõžÜP~Z&r”‚OÔ‘>Xüô …)Á l÷Ña@F3¨,}ÓÓ'Éì~z1ãÍJR:¥^ŸÀû~§AË9!$+Ÿåßÿ:a\R%`$‡l+ÓŽØ'!]rO~½4%>žœH8Æ4=ÕYÎ;ô={hÀœ‘„ž@p$ü´x"xÀéFNsž9è?¿ë¬Æ!ê$g ð?¯·ËBP$‚Ï@ÿ§é ÎF0ǯÔ1Œvüô^˜1'¹Æ°œ«—4Çï2:èÄ”©c‘#'ý4r•zR‘”œ¬ýt ' NNCô?Om (À8Xêr—\,ŒËFPÊp”„Ž gׯÓEä@„q @_`N³ #‘rz|Ïúh`ýcP”’’ °”®ÿÓ·×A‚IHâ;rÏo®?¦Œ:¸“÷IYŸoÓÛB“÷yqê@$€1í—]| ?s©ÈÎ|~9þºÂBŠ0'–=³úhä}좢pžç§·Ï@UÀX Œ(‘ŒÃçí¤÷À탔œ‚¥$ ‘êϸÖ¤ðJ‚I@ÉÁAõ{}lÀW 9¨-Iú}B°¬à'<»òùh8Ãxéæ·Õhöëê@÷PúLRÕ•uI=³ŸÃýN¼ÅiyQÞ-«‰í×®¦:_]ê-'Xj„§ª7*/OË ¶œË3U%Ä7ëÿŸ¡ÿ<ããv‰uÞ[{P\V•Ku*] ß&üQØçù“×ë©3hï}·]áºØ¶êŽt¾²¨n+·G;¶~‹éõ:¼-öðS´[ÓT‰”Vm{‘ÀK5š$p”¼á9RÞd®‡Ö’•`ž§T‰¿¾÷wdÞ•T‹Nrä´ÊêÔõsO})'¸QÇÝXI8î­un…ë®Sší£]¼¾Ì|‡ð>Ÿž(=oÑû,À5J”äÿó†ï{ÿÄûÃ*VÛÈK­-.6è¡YAOÍ'ÜvÑÉ䜌œ{Wå­¸·mŠúâD“!1㿉t*»JS@žøIÁlÿíÇç©Kho%¯s–bMp[µWH%AßÜ8¬ݺü•ƒøë¢,3Ë+ÕÁ?°þ¶9RôÛ?ȉt_õQÈÖ^ÿ˜‘øaÜ QÁÉööÖtíÅYùƒÛAÓȸ?ˆÐRþ„ã©ÇM<÷Å{ë€ÁÁþ"NŽ¥•c¨ý4@sÈœg >úÃÑYYëŸa£À18Žàõ¶5˜'–GOsœ“¢½pzõÖÀ} '¹þcÐhŽÓ•(ã©öíaQÊB=±×òÖ”õIì¶³ QÁ9ކ רêœhx㪇XsNB±„çßþúÔÓ èÑ÷ÀÆצ îu„ü”ðqœg\qÎFzãB¤ƒŽ$ž‡8í¢î08/áÁùŸ÷ÐÄ”…ôÇsí¡{(1×=4=R SÔçåï Áà¤ǯ˜: üôÔp„¨a)X9»õï * ƒžÄdƒôÑm8,`ORŸÇ9Ö‚pòê´èx¤ƒÏ c±tSŽŸM¸2^}€>ã1Ó©ÿûhUË8 ä0Ш•ÿ/mÁ`@êB;~ãÛD ’9à…½t!D$÷º‚:ÿç@rTR®€+ß¾•ƒùäôéÔ fz•çí£“ÍDz‚=õ¯§Áöùè¸ÁwÀ…r3Ôv'¾ƒÛñ÷ÇoÃG›' ëõÐd‚ºzºŸm®3 Áî@ë÷t$” }†…Gª9u#ïc@}Óò>¬ Àïçéöÿ–½¹°ê×]rŸC¥1ΩVX uc-Æ`}÷>ÉHê!Üé B¦.K­È[kXóŽÈO"·3ì=úôǹƭ›ÃþҢšš…R?+žºÚU*Á1›”0?êÇu}5Tu_¨vúO—R ÍIZkýoV#õRdúµ}LN:o îú‘ª˜‘kN³ÕžÖr { oN]Ý¿²)–-™oÒYH‹ ¯Så·œ=\uæQëúÀ 9)HJ=Ð¥ç˜Æ?økS-%HtÀ(ëŒuNºôJ’œŒ%G‘öþûyÏywq}tõª±grI'’I2IüOùô•ey}®[h”((Zh¨P ùó3Œ £8õ•uâ?¬Ïfý>•tNz{žýúèÊJ¿‹’x¨òPN@öÑ@#$î=ÿ¿®´ 胫ªÎqéQÁÆ}¿¿m‘'ÐA$`ûrütn¼ I†;£?Søh ¤{ñ@öÙÒp°ÆÂJJR*èQøãóÑV@õu%^ý½¿=”Ž@ò'Üç·]aBrR¥Ü`ߦ¾ºž å©G‘õséžøï£ ¤­]:œ õý?¾Ú”¨n)í×·ú÷Ö'%HãÈŒõ??Ï¿¶†™œ „žŠ8ëíøþÀN03€G±÷Ï·}aGB¡È‚NGM`ô«©ãÃ8ÈùŒ¸ÐÁƒÌ%9 èN R:ãñÖ,ž9]F÷õЂH€BHI=Æt¹‘’ž õÉ~ž† ±ÿÙtinyobjloader-2.0.0~rc5+dfsg1/images/sanmugel.png000066400000000000000000005700321364105447200217710ustar00rootroot00000000000000‰PNG  IHDR.ªÒ´õsRGB®ÎégAMA± üa pHYs%%IR$ðÿ¥IDATx^ìý{Ì6ßzß…ýœÆ!®‹K¨Z!U¨BhWBjÿꈓâ:àp ÄH0ihBj\ööÞûwØ{ûˆÉÉvÎÇ vHkUÆ´RI©n¹U¨j¢¶"Hql'>ÅöÏ~º®5óû;ßû»N3sž÷‘>šµ®ÓºÖš¹gÖõÞÏó¼ï|÷w÷Ëkâ[¿õ[3Nwròù¢/ú¢—¿çïù{^þÞ¿÷ï}ùÕ¿úWg>ÿó??ók~ͯ¹â×þÚ_{rrrrrrr²›\œÇyœÇyœÇyœÇyœÇyœÇÛsœ…ÀyœÇyœÇyœÇyœÇyœÇ[xœ…ÀyœÇyœÇyœÇyœÇyœÇ[xœ…ÀyœÇyœÇyœÇyœÇyœÇ[xœ…ÀyœÇyœÇyœÇyœÇyœÇ[xœ…ÀyœÇyœÇyœÇyœÇyœÇ[xœ…ÀyœÇyœÇyœÇyœÇyœÇ[xœ…ÀyœÇyœÇyœÇyœÇyœÇ[xœ…ÀyœÇyœÇyœÇyœÇyœÇ[xœ…ÀyœÇyœÇyœÇyœÇyœÇ[xœ…ÀyœÇyœÇyœÇyœÇyœÇ[xl*þ¯?ð½¼ÿéo8œŸýÙŸG8ó8ó8ó8ó8ó8[› Ø´ÿgá/Î_ø aá<Îã<Îã<Îã<Îã<ÎãSa~Ÿßê÷?úòƒß“â|Ϧ֞ã¨8çqçqçqçqÏylÝÐoõ{mGïæþQE@» ò_üî—ê÷ük/ÿôøÓ/¿íþ©—/ûŽï|ùíô_yùmô¾|ÙŸüÃÍB Š€/ÿÓª¿øÑ|ùž¼ñ×ý¼ùþŽïyùAÙ}Ÿ…ÀyœÇyœÇyœÇyœÇ±ÇY´Ö&ÿ‘E@s!ðms·ïàBàw~ûŸ{ùçÿð¿þò›ïŸxùû¿ñ¼|Ñ·ü¾—_ÿû~ÏËoøÖoyù‡ÿåonQ|ÕÿþO¼ü{þ?é(~øåû¢(üËÓ7ëMÿù£AçqçqçqçqÇg!Ðw”6û.☠ß÷îÜí;¸øè»_¾ðë¾õåïÿ¦ßÿòEÿÒï}ùÿ¿ôò}Û¿øòÅßþM/ÿÈþ†f!EÀÇÿïè*ú6ôS±ð=ôµÀYœÇyœÇyœÇyœÇy{œ…@ÿ¡›þg(âÈ…ÀïùêÿÕÜí;¸øu_ÿ^þoþ}/¿þ÷üž—ßð¾ååþƒßüòÅßñ/ÿÈùú—ßôÇ?Ó,¢øôÿé÷vóÛT¾ À‘¿ ˹øñ!pýcDê«GY¿þq k·üXÓ ékö\ÔØu¨Äc‰ýÃß·èÏã<Îã<Îã<Îã<ö±§Ørlõ{íoþŸ¡ˆ#_þ[¾bîö\èýÆ?ô/ÿèýº—ßô'>ýò›ÿÕ÷›…@_ÿ|sG!pý/ý¥C¿˜ú±I^oü!ç=u«HW>ù˜7ã_ŹÚÔˆ>Çõù­ó™Öa¿79—ˆs•ôyœÇyœÇyœÇyôÓ>boê±unoòš´Žg*âÈ…Àoýß4wû.ôGþ—ì3/ÿØŸüÔËoþÎ÷^þ‰?ý‰ló ¿ðáˇþüËÏÿüϽüÜÏýìËÏþì_ùëýg^~ú§êå'ò'_þÚ_ûkíB@6Úµ£T8_ݰ7 ³ÑŽ#QŒã}Ö›ÿëB'b|ßƼéÇš²ú=q§8çFÇyœÇyœÇyœÇ‘ÇYŒOûÀoýôŸ˜»}ú£@ÿø¿òÁËoùSï¾üæã/ÿÔ÷|,Ûhð3?óÓ/?õS?ùò?ñ/õ¯þÕ—ÿñë.¶#à7ªk.žßÄ/qJEŒÈ³Ïb1c3¿þ`UpŒÄmÌé<Îã<Îã<Îã<Îcä8 þC7ÿÏR L¿,¼ãχê}Éw}òåKÿµTüÙ¾üÖ?÷UÙf]Ä·?‘¿øñÿñ—û±{ùÑý+Ý?Ôóã-ºñ=º¸Ú€¯þ•~:\!7¾ÃƉö챦"cú`)8:ãž…ÀyœÇyœÇyœÇy}Ä^c˱Õïµ¥Mÿ3» ýQ ò»¿öåŸþ³_óòÛþw_ùòeßûÙæRL?ßLÀ¾ü•¿òW^~äG~¤£˜7´… ýå¸þ×ùà t°]nK²ŠSú—{=È.ü—9 (Èzú=‚θ½s:ó8ó8ó8óè=ÎB }´6û.vßõ]ÿFÞè×øÓæßÌÀOüÄTLßühþE@o!¶´Íoò¦W6ýÓfý‹¸ÓQøÅÚžM3~ÿ‡es>ë8…Ÿå¿:ð/þ?8ÿXÄó?xù–`:úâž…ÀyœÇyœÇyœÇy}œ…@ýèÝä?²ØUÔˆß ø™Ÿù™ù[ëo˜¾B ó¿‚_olçM±Ù”O…@èÖ‚+ú7Íó¦ý{Rlc'ú¯÷©°ßœkŠù=+9æ¶þ¦#qÏBà<Îã<Îã<Îã<Ž>¶nè·ú½¦ctsÿ¨b`s!÷£é*æcÚį¹Ú$ÏÇòã?("ÖE@#›fîämœyÓÎ\ùÎ9ê\jcµâž…ÀyœÇyœÇyœÇy}èÞc„7ýˆ9ŽnêÃþÞk³©ø¹Ÿû¹—ÿü?ÿÏóÆýHâÛ‚Gç¦ù<Îã<Îã<Îã<Îã<Þ†cS!ðæ}?sçqçqçqçqçñÚ³à¿|~pçqçqçqçqoøqø ÿÌÚYœÇyœÇyœÇyœÇyœÇÛqœ…ÀyœÇyœÇyœÇyœÇyœÇ[xœ…ÀyœÇyœÇyœÇyœÇyœÇ[xäBàk¿ökçîyœÇyœÇyœÇyœÇyœÇy¼ ÇYœÇyœÇyœÇyœÇyœÇy¼…Çô£Aê[æîyœÇyœÇyœÇyœÇyœÇy¼ ÇYœÇyœÇyœÇyœÇyœÇy¼…ÇYœÇyœÇyœÇyœÇyœÇy¼…ÇYœÇyœÇyœÇyœÇyœÇy¼…ÇYœÇyœÇyœÇyœÇyœÇy¼…ÇYœÇyœÇyœÇyœÇyœÇy¼…ÇYœÇyœÇyœÇyœÇyœÇy¼…ÇR¼ûÞ;C¼óÎ?ûòÞûï\rgdŸt~“Éóÿ Íw&Ï9ƒhýgÞYxÖÃñÚæ¯i:÷Û8³ß³Îyéù(žqÞÏ–SäÃ÷ÉûŸ|gEÎ÷Ýd{'8Ÿa›óKí[ƒ±FÆ»Wn燵qv·âVãñ|g»…ULs?n%â¥vÁ¹òáw¼· º¿øŸöÇþ™?ëm_>Ýãï{§s¼÷Î{EFlïÅ­óáøŽÿÎÿè‹^=¿æ×üšm…@‹pkòÜ …ÀY ¼¾ùæë™Î=ÀVÏh»øyéùHžmîÏ”OäÂ÷Èk*‚°Ï9¦ö­ÁX#ãÝ+·€óÃÚ8»[q‹ñ0¾ÖÀÙoãå³¹/·±RÐCA®£|xPQporap|t Åm´Ÿ]…@ßR d¿Ô~ÓÈóž‹€³¸æµÍ7_Ïtî¶zFÛÅ$ȉs»UžÏ4ÿgÉ%òàûãµAøäb<܏ܿäüÌææ(4Ÿ=D¬œojß 㨱n‘3òä\±Fj{4G޼•3°UÿQ8ÆUÛÜ¿=„o rw0nœ•”ØWþ…óáEB®0@QP+ TÞƒÛ3£ö·äžyðXŠÛØr“B ˆ]!„Îù(9F:¿6òüÒf¿V D_ 7¹xöyåk–Î[€/Çжóp.¥ö½¹çØ÷ ÷ß ®rnfcs.Ÿ­ VÎ9obëùŽÎ;âñz ë5 ŽŠÏ9+¡c`¯1Fá/÷Í}Ü"üR€»ãaL´•”Ø.\ÌQ>ÜY”Š‚ T[‹‚ÀmŠ™Qû[qïJŽ‘Î¯‰<·¹(¥bà5η‡gžW¾^é¼øsm»qçRj?‚{qbŒ×ŸïW€œ›ÙØËgˆ—sNç[€Øq>zœ#ã!?^ôo½FÁQñ9g†çØí-¨ÿUls/ןä|b,}GJîPÜ#|Xø]ƒ¿øŸÕçÁ´¾-P9¸Waàô÷‚ó¸G.:ã6þÊT|ðÅöp‘ˆ+$êüØñã™ÉsJý-…À›Z <ëœòµJç­°­íÆ~œK©ý(î‘íLjø¸îLÈÝæä¼ÌÆæJ9í1sÞé|4ˆ«ç#9*fÄ x=пå#âs¾Jè0·ÑG{ êÛÜÏ5Â'9ß'ú5Rr7ÅÙˇ…¢ - œ¼V(£E‚ÛƒÛ[sïŽ"w…½óSrœt~vò|ÒFÿ,&žu>ù:¥ó8F­íÆ¿7œG©ýHî‘Ç-LjظæLÈÝæŸÉy™Í"f)§½ nÎ;qõ|4Gįú·\£à¨Øœ¯:…ý8Î(êoûæÞ.öÉñfD|ýE÷îûK{‘™Íû­Ð±Gøp. Õ5z ƒ-¿kà6Å`Äö–<"“Y /üÈçÛÀ‘Ä€®¡w~JŽ“ÎÏLžKÚè· ·¥xƹäk”Î{á8µ¶ËáÞp¥ö£¹u.·Šqq½™»?“s2›š=”ò9 ÄϹ§óÑ nœo5Ø9òz Ïë¥~GpD\ÍU ½Â¾kõ·}s—ûäx\lÈâ\#%÷0\>=|X) ‚£ ƒ^F ·!fFíoÅ#òÐ1s!ð‘/¹Íï(y’¦¡w~ ’çÆ3‘ç‘6ù=Å@ÈÎBà¾äë“Î{á8Su.{¢9pÿòcn™Ï-bGL¾ö|ÝÝÆ_É9™MÍVJùâç¼ÓùhWÏ·boüðxMÐç5S¿#ØWót„Âþoõwñ²ÌÜçJØ%‡Ã‰¸.6dÐç¾ù6 ËÍýQ¸üWða£0¸'( \aðÚÿƒGä‘ /ýàø¿T"OÌ ôÎÏ‘c¥ó³‘ç6ù=…À›^ <ãòõIç½p©:—Ç=á4ŸgÈO¹EN·ŠÉׯ¹Ûô+9'³©ÙJ)Ÿ#Á9÷t>ÄÕó-Ù3Fø¼&èóš©ßì«y*<†ýÑÞ‚ú»xYfîu%ì’á”bBçÜ~ÿ“ÓùÊU®æO•ò\ƒPÔþ*Q­0(á6Ą̈ý­¸G¹øöüùÐyB¦¡w~Ž+Ÿ‰œÚàŸ…ÀóÍ!_›t>ŽUj£ïr¹:>÷[£s»E<¾Î|½Ý¦ß‘s2›š-”ò9Œ“sOç#ALŽ}‹q[Ç ¿€×}^3õÛËÞ˜š£ƒçÃhîÐ+ËÌý®„]r8„ˆUŠùt¾l¤µXéhãý¬pîKÞ©(ù§ßÊÏ|WúËDZ¸Âà5cp«r!p‹ÿG Ež„)@èŸcY”Ô~rîiƒ¿·ži^[xºë’ÎG ±¸ït.Ÿ{¡ãsÿѹµ82¿£bEœ€¯1_k·áwä|̆f ¥|nÆÊù§ó‘ ¦žïÁ–±Â磴þœ7¯Ù-Öko<—£Âóa4÷Gp¾E™ÜóJØ$ã]DŒZè¦ó´yNæéün¾Ìhaàt{p…Š‚VaàŠ‚à, X9qS€Ð;¿9^:?9÷´Éï)‚Ð…ÀíÈ×#‚ãil×w9Ý _sytn=•ãq"_[&tnÃïȹ˜ÍÌj9 •çÎGÁñÐ>zŒ£ã…} kÂ2ÕÅžx.?χÑXÜÁùeæÞ¡O†»hÅ`}´s_Š€”ÌE'ígæ’çõ¼Ø-öEAðኂ T[‹‚Àm ™Qû[°5‡§.‚°q¾%rÌt~49ï´Áï-Bî àYæ4ÊS]‹t>Ž©ñ]ßåutìVÿY9"Ͻ1Ÿ¯+:·á/‘s1š"F-§[Àãå9¤óQ Ç=zŒFÆ Û@ׄeª;Š­ñ\n%Âã >Çãþη(3Ÿúd¸‰ðmù³~jÓæ9ümÀJ7·ãüÌ\ò½ž{ øíáÊ„( F¿-jEAð&NZ9AS0aã|K,OíG‘sNü³ðº{‘¯C:‰Æìé»ÜîŽÝê?3{sÝã¾|M™Ð¹Í~‰œ‡ÙÌŒPËç–ð¸yé| í#ã02nغ&,SÝì‰årsð\pû#8ßR¼,7Ÿ… tÉh˜?¶™Úóæž¾ xÍ…À%×빂X9^ç·ʇ}{°çLjT׃Û`3£öGSÿá…@“26ηFŽ›Î ç›6ø½…@:WœËVž!ç|ÒùH4fOßåvktÜVÿ5°'ç­¾áÇ×S ½Ûð—Èy˜ÍL/­|n ç‘ÎGÀ±Ð>2þ(½c‡] kÂ2ÕÁÖX.¯<œÆäþη/Ë Ÿ‡d0Døôø±ÍÔ.ЭìèüŒ ß)ÇëùïcoåÃÂïüÅÿ´?~éÛ‚`Ï·-x£íµ?{w!ðÞ×ýªCøœ¿é_xyÿëU•°q¾5>çóRÜt¾71î{ßrr>éìÝ7|ó¯*ò¨¹låÑùækÎG£q{ú.¿[£ãæ¼â3;“>Ô-lÍ{‹_ø¸ç½Ûì—È9˜ÍL/­|n ÆÏóHç£@<Ž{ô£ôŒ6¯ä1=1{ا”—ƒç‚³Ê€ö{q~µXYg>IÙEØöÚ³ÝÔ¾An¾ pçgyO9^¯Á‘ðX[ø°PGNhQ0R$¸¸²Åç(ž¦z‹Ñ‚ 6@÷ÞŒåMWÚÜ;r.éü&Î5¯:ߎíÆQÙ£ÖBÇÍyÅgv&?l¨ÿšÍ}Ë\ÃÇ=ó@èÝf¿FÎC62½´ò¹5<~žG:Ç*µE-‡Ðñ_ âuaS‹7–8¥œJð\pVÐ~/%¿ªÜ|.’²I¯]À¶Sû²qNäél¾ ¨ŸÈ ðÜï?ʇsQ¨n¤(JEÁ£ß¸Í¸2j¿‡§*‚žb xöoò¦+mî9tv„ÎàžsØÃ#óÌkŸÎ·@c·ú¹IxEÈK:‡³d—sú Og)=K²gÀ缞û³9*£ÿãq ú[A©0à¢à™ ƒ§-‚[Á-7hyC˜6öŽ‚Gå—×öÕï¼|ÍûŸwÈë›Î÷@Çrc—ò¹×š¸qT†¨¾Tß$t~n¾!ÓgYÈÀÇçÿÍ›qýáã6üްÕ|ž Î/Ï+÷À1Jíg%r ž¹¨Ý‚Ç@»tfœ¬F˾GŸÔü&9mšŠ€Þö#Ñœ§óõ:¼6b#sýâ·ñÛío¡U”ŠƒVQŒ¯¦¶Ÿøø;/_ù•Ÿýò еðé_ùòÕ_ùÎËW¿ûy‹ì²yJõ¤ûÊnjÞËÇ?šÚý•Ù†7W%riSïÈcT ûóüb¾ÄפuñöžÏù¼ß=¼N[Èk›Î÷BÇsã—r:îÕq㨠/P}©¾iðµàù…~›W·Ù¯>nÓ¯„?SŸ Í/Ï+·¢þÜßû^Džg!p=¦Êj´ì{ô©1DÉg’Ó†y.‚Üå…@9ßëµxMÄ€Ó÷À1¶òáAß´~„ÈA«(¨ñê `S1ðþgçMíGß¿Ž÷5mzÓÆõ]’‡ïç|îïxùš¤ûXò;º>çó~çsóú\mú“ü,üX½2ÈÝޤ4†ÊñÕ—ê›æÉg<·¢`óÏEl·Ù/önÓ¯„?OŸÍ1Ï-·Âþkoì{9÷.z}jãöÀã ]:3NV£e_Ó‡.5†(ùLrÙ4w‹í@ûÔóº^×@äÎ8›­hìQ>¬#®ßÔ¾1P9- ^]!ŒŸûòÑ´ÑåõñmÁW4Šëo ¢HxçßúòñO§X©?J;mèKQ¥M`s“¿õpú~öåÑÏtMÓÞ 7^¯ r7#qc8^¢úb}SÑЀ‹€’ŸÛð;ÂÖmúÄtÏÔgCóÌóKç-¨o«ÿlD~Ji]XçPû=ö­1{À8<žÊXǔ䎖mMºÔè¦d?ÉeÓÜùmÀbOg•;ݽ)ç{½¯äg 6GÁclåà §ý¶@û¯²F‹_ñË¿ôê_ýQ |ôÝéǃôƒü#EÉçoܸ‘Ëô¡/Ñ*‚ˆá6ÿŒÛðõÃ?þäôýìË£¼¦é|Oܘ½2ÈÝ\Ž¢ßÉãCï^¬o*ü°s›ÀëûŸü_¶´·éw„­ÛüƒÐ»gé³¢ùæù¥óÔ—û{âÞƒÈÏQZÖ9Ô¾E}kÌ<†këY)É=¶µqR£‹ší¤£Mr£àBàÊwn·t÷¤”ÇÔökòÌ ï8µ¹%<î>œ‹‚@uQŒNŒ|[ýW[#ÅÀ{ïMÿºÿµŸ¦ùGb⛀Ï{ùÚù_Å/ñ×ß"Ħ ÅDôcSõɹPˆß3ˆ!ÒŸ«Ïô™ŸHc|mÒ§ÿÄg½üòÏ-ŸLа{ç/}ùøÇÒfåcŸýòiÚüúý$ûä¯|ù:.æ<Ö?ÎÓþÿ<¯ü¬æ7=ó]ÙÍ~ïå¿úì—OšßC˜~쪼žé|Oܘ¥3šsžc:¢~­þ3¹m×M ½«D˾5^<†këY)É=¶µqR£IÍnÒɦ¹Q°O©ÝÒÝ“z¾~]žägn³Í½A.[øŠ‚@õ£ÿëq­0hñª  »øLÚ¼~Õ;/¿ìs.›5ü‹|KÀí¬Ÿ‰˜¿%›w>ëwävlª¦ ôä~Þ>6¸ycEÀ×¥X±ùÿd*4¢ŸùÜ—_–6ù±Ù_Ó/åצ˜©1–ÿÇ>ëåSI–‹¯ûìU?E¿ï°ä3ÿ‹}Ã=+p廦g¾‹Ù,yI±yO1ç—Î÷Æ[Ê¥&ws: ¿4f|èÝ‹õM$æÏ(<ì\ ö¥"àßû¦¿)ŸÝæŸ W¡Óçç³ãrÎsLçQÔ¯Õ"¯=èúйñ=¶µ±záq\[ÏJIîè±u6!K&5»I'æFÐ[pÛõïE=?¿.Ï ræó3Îyò!83£EA ÷mÁ«/‚¾bàóò¿¬å'>wÞ°Mß,¿77´Ÿµ|c0ýñú÷ôG…¦±þKúå_àó8i£þ‰´Aˆý»©})"æ¯|ùR1À…@þ&`. ‹8ßðÍŸ÷ò©¤ûøûŸ;ßü¹/ï§ù¼û©Ï›û¿*cñ±wã_ëã_ßç|æo=–~…ˆ=a ‚Ú|ßùå¿smg ·áW[Çt½b½î»”OMîæu¥Ø%y|èõÅú&¢º VÀÇQô¡w@:÷ü|v4ï<ÇtEýZýg!òªñò‰±ôÖµlÙjì­ð8®­g¥$wôØ:›¥F•šÍ¤“ óŽ"@û5Ý=)å4µýÚ<#È·t~f"GÆý©Rg÷á\ÕYoD!ôŸüDÚt~UÚ§vüE ¯¦ÿòûi³Š"aý£Bëo b£¥?*°¹‚!þåÿ£_ Ž´Ù_™é[K!àÿœhŒý¯ûTÚ„Óåo ¨0øeù›×ßäMxc£­”þ¿´iùÕ7%d7ÅóÅHMÄÜ#Σpã÷Ê@èÜÜŽ ÛÉsŽñ™}ƒá‡[<ŸÐþ’÷~Y>÷G!×çækAsÏsLçQÔ¯Õ"§Q§¯1²ž5;Ä:ǵõì¨é˜;g²Ô(RÓO:Ù,SdÙ@!`cVú÷ Ÿ_Ÿg¹–ÎÏLä´¿È; ƒEÁ¼U…Àû|v*Òæö3É'ÿÎÀ?KÿâÏ›ÿW†ôLJôG…À­ éÇèw¸íONcÆøÓÏíOÿZ?ú'@'æ¢ ýÛV¸±KùÔò ›Û^Jqkr}©¾Iðƒ Ï'ôQÔØS„îM+Í?Ï3Gp>*Û÷–D> æÏl).¦f:¾F{àq\[ÏŽšŽé±s6!K K[wÙYÖQì_j÷ôoM_>~ž äÉùFû5äɳ¼æ°Yl7|[ º­¼1…@Ð.Òæö«ÒÆø½Ï›¾X~Lhò_~H~L¸B~Þp] Ðo¾áR.K‘4f|;?&”7‘lÄó/õêòô£›ôR!Pü%깿µàkóÜø¥œj¹æk’ÎGSŠ[“ëKõMjü|Šþg¾n­·¼ûÕ^žh!w@À¹¼Fty®é<‚ú¸[âÞŠÈù  >žž³*S^ÞO/ÿ„ÓµÐ\ƒ“¡ã볇ûhëÙQÓ1[좖š.˜ô²!¦" Ȳ"`KÿÖ´sõëóL OÎ×ÉžÈ ðº÷¬=ûfÛÿñ8pº^Þ¨B hSðÙ¹ øØ“lÙÄå_þ¬—~­þ£ˆ<€ö1÷žB@yùäøKZóâ>:½F[áqZm–)5³Å.Ú©a7QN&½lÊ:‹€€ým¬þ-éËůÑ3ù!GÎÕÉž äxÝ·¬ÿ*V* F '¯ñÆAÞIâG‚¾2ø!Èó&iþ‘ üóñòûA­€MÄYI>oøW5IH ÷“ükB.Å@l¶õOˆù[‚O~ÖË»«?%ú»—?ÓÙþ± ø ó/òó_bÿ}…@ä³'Û™±§k1­ç£(å0*BÇó;‚RÌÚX9ÇøÌ¾AàA†¶>ŸBæ ½?Òñ¦›Kžo:÷âìU6ó >ss×BàåÓéŸ`Ù‘pNJÈõúìÇiµY¦ÔtÌ»h§ÆÕ†Ie̤7²ÎB@ý¹_Œ]éß’ÖØS߯ӣÑÜÐgù³æy1¼æÊ–9\Åï, ‚; ƒ7²ò†ˆ €…ùψ~åÇÒFUtá“7÷iÓªÿ¹XÐS¼1Λ¯´‘ç&C0ýØÐªÈ|ÞËÇWÿçÀd…™ùǃø¯ã¯ø­yí?Í9ÿ.À×ÿ‚¿¯H~ùÿžµ\µÜZ:žã”b¶äü‚}íà!†¶>›BE(Ž(À›Xn>y¾éÜ‹Ú;ÿјGƒñÝ9À¼Ý·[Š€-ßȹéµÙ Ñj³L©é˜Q»8§ÆÕIe̤7±Î" ௿ҿ­q§¾_§G£¹qígÍ?òbxÍK싎ÙˇR ÿÆAÞüÈf¿Eø¸X£D°| ``»x³_#lu3x zÆ©ý±ÜZ>—K-¿–ÎÍw+µx%äú’}ðƒ }÷l ¹+ÐÎýùg¹_>˜Î{p9¼fÜœB¦×£„³UÙH¼[€ñkgÌ»÷Ç‚ð¢¿5zmö1cÎ<ÿR›eŽ–>è± xÌÔXm†¸¯Lz³(Ž£1‹cTú· ?¿VDóâ~©ý,DNÈëÒ^_‡GÎcoå.‚¼2þá¸x£ ÖŸþùo°rà6þŽ°Õ áÑôŒñÚ Rµüj>n®{¨Å,é ×—ìk#ZÚŽ³{6…\ QQ .—׈Î%úXûœ½ÊFc 6Ÿžû–ßååݱ{¯Ï"ւסÔV{¥¥zl35–Ú%&³ù(4Æh¿$;šþ<üZ= ͉û¥ö³9!¯K{½æ-n5/äÓË_yd6ü-ÂÏÅë%ü»ùÌNgp%ìtCx4=côÇ­á#(å2*zÖg„Z¼¾d_ñÀÒvœÝs)]o!p \N¯—Ȱþ-œm¯ìð¸h»3æEÀÕï|*½tgXþôZ1°¼¥¶Ú+-}ÐcÂ6Hå\c²1›®" à8Ř•~Iv$½cN2¿^@ó©õŸ)÷Èù =õ×ëÝ b˱Ä[Qy#d6û-ÂÏÅk~ÿƒÿøËò¹ *~úýoZë ¸Í¿vº)<’žø­B b¸5|¥|FåAÏúŒP‹×£s/Ù×@<¬´g÷L¡w…À­ÁÓáò{f\Î!Ã5hál{e·†ÇDÛyÞ\üÀ§þÛù¬¼¼ß÷Ò½5|Íz ?¬ ¯C©­öJKôØ€°Må\c²1›-)Z…€ÆiõGdGÒŸ—_¯G ùÔúÏ”»æ…þt^¯ù·š£‹‹¼™·¦òfÈlö[„Ÿ‹W#|¸øéO}SýQ§W\B¯›Â£8"vÄpë÷(JùÔòléܼ·R‹WұܽdŸxPi;ÎîyÄ„(Q .ÏgÄå2\‡%;•÷Æ;í’Œçí¾¸7[¾yàëW#l±¼¥¶Ú+-}ÐcÂ6H*“Íeƒµl²‹€@cµú#²£ËÁ¯Ù½Ñ\Fû‚ó@;ÎS{½Þ£ÜjŽ=qÃæ­*‚¼)2›ýáçâ9Â6ŠWô[p…@:ÞÅÞ¸áïÖï‘”rªåÚÒ¹¹o¡«Wç^²Ï ²Üç¶{1aƒ"à»>ù_ËgÝü/áΟÍÞú_—ï3ár Ö¿†³ë•ÝϵùÌsF€BàÏüøoÌçR@+w¼|mß=¸¾ŽŽ°Ñõp}´ÕFÙ«WÂ>5ªL6…MÖ`p<{ì(ÆrðëvO4Ñþ£à<Ð^Ÿ×ë½…[͵'îY ¾.&6(Pp°µøé¯ÿÆÕ¹Å³áëÖïÑ”òªåÛÒ¹ùo¡«Wç^²ÏH<¼Jýh»g6üm QŒþ¢æ¸ÜM)¯ó5)áìze·‚ÇjµãÌs~†oJ`1_SÌkÀëàúh«£fÓãÏ„}j™ô…Í•=…€Æsñ÷ÈŽ`l|¿n÷"rÐ<\^,{†¼—Óú¼^ï=ÜbÎ=1çBà˯½¸Íϳ“7Ff£ßCøº˜Aè¸ÐB Ú¹Ÿ6óËÆþú6ö[¹U1°7^ø»5|$µœöèÜüGiÅ©éYç^²ÏF<¸Jýh»çv\´ æå“Ó¹‡£Š7‡GQÊ'ä|]Φä×o/1ÓjÇYçÌ…@üOîA´ƒßóÿï.íG±ÞDŒÝîºÖúh«£fÓãÂ65ªL6fSµ¡4^«_“—l÷0>¾_·{àÆï‘=:ï€s@{}^¯õÜbÞ­˜S!ðÁ¯~o±0磊û·óoÿÿ±!ñ7Ë™,;ðÏ–øúÏŒ=x{Ø/|Ýú=šR^­|kú=ëÄÔâlÕ=#š/÷£íÖØ¶®à¿ôò íÅáæsOJ9„œ¯ÃÙôÊŽFÇà~­ÍóEà Ø€g( öàÖCûh«£fÓãÂ65ŠLúiuµ¡ÚPh<¿:f‡l/ã9ùµ»5nìÙ#sœÚײëõ>‚[Ì¿3_ñY~o±0n£ßCøj¬RðL¸í¶Æ ?^·g¢”[+çš~ë:1­5ýãß ÍÕõÝ;¶TÄùVð· /_ioÁÍ븱CÆ×ÂQ²qòžx{Ðøµ>ÚqÖ9׊%äÏÀËÇçD:£= ֆׇÛjã¨Ùôøa¤ŽeÒ6RŠ€@cº1ªãvÈö02öEî×ï–”Æur•=*ç Ææñ]{:_¯õ‘ð¸GP‹— /üÈçÛÛÛ@,ŽÛè÷¾ˆ¡›ÿo|ç«þÈ_(IA­ü(Üw”-qÂG×ÿY¨å¶UlY'¥£¦?bü{ yº¾[ßa @!Pbô›¹£~i¸7Ç[áÆ _‡³)ùõÄÛŠÆ®õµ­s)˜° žâG‡¾fÞTÌç^JkäÚŽš¾å Â.H+&yaeŠ€ ëÌæŸÑ¸nœ^YM¾•ñ±¯×îÖ”Æur•=*ç – ÚÓùz­oÁÑkQŠ— |ÉößxˆÅqý·?ÌFþdaJ*ãtGÂܶø†[ûg¡–ßV]°e­”ZŒVü#Æ¿%‘Ÿæèúnmk ®+ø6bÏ·n®GR#ä|M”’ÞÉ[±ö ±k}m»9o)˜°·* øGM£€£´fh;jú–/»Ô¸b’_6L«“)‚¬3FãVÇéÕä[c’_¯ß-)éä½²{ ãrÿº}½Ö·âÈõ(ÅÊ…À—~°ý¯½)Ĺ~áËØ‡½Á½Ð|[Œú„½[óg¢–ãV]0ºVJ˯þ‘¸ÜT}·®5ÂGÿZÐ{ÿŸ¿+ŸGHÁ¬üpó>‚RìóuQJz'oÅÚŠÆéG[ç»õÛ€áûh^>:o,>š6 Õ÷àÖ¯Dɦ×7H“lÚ$)Y·±4¶«4þ¨|”ZœúØëõ»%¥ñœ¼Wvt\î_·¯×ùÖ¹..V.¾}ÇŸ}“ˆrýá÷þÅ_šÏ_ü·ýOòYÙ[à_1S¢Wº£pcLjmön½Ÿ‰RŽ­Ü{ônMziù×ô{Ǿ%.7•Eß­i‹ð ö÷ Mr>o{&·[)Å 9_¦¤•ïAcº1X¦m7ߣ &âìeï}¼||¾Óít K”lz}ƒÔY1ÉÖ%¬…+‚¬3ÆÅí•ÕäAM×Ë踓|½v·¤4ÞˆüÞ9:f©?¯×ù¹..V.öü?o±Hn³_#|¢àb TWø¿¼†{(3=6 lÝ:?µ[ù÷èݺôÐòÝ«.¯’Ì­i‹ð\ü»óoYénͽ?×n-F)Å ¹^PÒÊ·â⩬ֶ›ï­Š&bÞ’ËFßß‹ºùOIÍçþ{—×U)é[~â§ÎÂÔ_o’–÷¨)‚¬3ÅÅî•ÕäAM×Öؓ|½á»1Ni¬ù½òetÌZj_¯ó½8r}4ÖYb‘܆¿DØ£Ðb UñÐNÿ(Jg'w„­[ßg£–gk=z·6=´|÷êË©$sëÙCø–ø }^g÷.û˃+n]z(ù†\¯(霼g =cÔúÑvs½å·%">Ðþ=HƒÎçm÷¯1¯ïˆ fê,LýËÆˆÉ:SYg6þŠÆ/7*jº¶yY¿[P£¤sò{äÊÄx:f­?µý:ßÍq+ç, ÄB¹M¿#l¹pÅ@^øŽ_|ùÄt±G¸eáÐ*s„[×g¤–kk=z·>-züZ6[Ǿ.Ÿ’Ì­e/áϸͿCýŽæåýöçŸÙú§·>%Jö!×kJºQù\,•õôÝ|ï]€‡)É[”~!žG@uÌêÿº¼oƒÒz·äqR‡6.ëMÈ:SYg6ýŠ‹_sTÔt-¶Æt—ÍÞÑÔâên+Ó3¾ïûu¾7G­Ç9 ±HnÓï[-´È‹ž ý/ŸhÛ8Rò§Û? ùí·¦ÏH-×Ö%™[Ç^0–Ûè·€ï3ÀžÛ{pëÅ”lB®× ”t£ò"†‹Ó#ã~´Kó}D!c”èµc^¾6½ NŒü~À˧/ú—ÏŒ½_xýyíÀ7uæóz3²ÎAÖ™M¿ÃÑ+[u-J¾íñÒu½µø£º[çÊôŽÏ²©í×ùQµfˆsb‘ÜÆ_ ;W¡\ôψ{h3aãÖòY©åÛšKÏ\{ÖÌÑòÛ«¿¥ÂHl•¹¾›«þX³;’ˆ §Îï(.ß\ßg\äþg¶Ý‹¼öh+¡û7>þ+ó9 æóõf(È:SYg6ýŠ‹_³™‹‘5]}ã]6|GR‹½EwË\7NK6µý?š#Ö 1ÎB A,”Ûü3aãŠ&l|åÚóõþís÷?›¾|}Ÿïî„έã³RË·5—ž¹ÖÖªDOËf˸GSÊ¡&wkØCøfÿw§¶Ûè·@Œ%ÖWǸx¸;ø?…j3 æÅóSä¥ëu„¼—‘¸*sýÒ\ïùmçmz=£Í@ÞÃË×öÝ;‚…ÀÈÂ0WÌ[]êÌçõd)‚¬3›~‡£4ôŽšOßx~ó·‡VÜ’~T~4nœÙÔ÷kü ±~ã,:ˆ…r½Ûü3aSÿ«ië¡zÿéåëÆÆÐ¸[¿g¥•ï^} kÔC˧'æ–q¤4~MîÖ¯‡ðGˆËg7Þ­ßãÁƒ½—ÞŸ÷náæÈ„Î]/•’®æÓb$f,ú¥¹ÞëÛ—Ãv8»¶]õFâú¾Ã»èåoE! ß DÑSd`®k[ï(xˆ—H då ÿÂgÏ/ÖpsÓëÅ}¦¤«ùÔçä*‹¾Îó¼Ç·šrÂxzÖ6úªWú=\ýžÀÇÒ&$±ô ß0<_ž?ËÝè0Yo õfÓïpc•ƯåUÓ-½²¬ô 8ˆV¼š~«n/£ãªlêûõ}Vö¬çY ‹Ý[„E [Òû³Ÿ÷À­Ý3Ñʱg½6î…W¢Ç¾e3:æʵqKº»uk‘ýæ ?Ú·.\ß8£àa~%_mòË6|Îí>À|ôšqŸ)éj>%Fc9¹Ê¢¯× „î–…@Ä 8Î ãé™ý¹ïdÑ,gØf+ºéùغ_’ó|yþ,t“²ÎlþAÖ› ¿£4Ψ<¨é‚–žÙkÒ_oöF‰8­X[õGåè¨Åv:•M}¿¶ÏÌž5= Ä‚· [~éj/Ë/+üå’-¸5|4­¼zòîµq/;Bç6ü%r¬y>×Ú5Ôg„ÚÀdàÇ2Jÿ¤…¸´ñç!?HÿŽã(á®gPÒÕ|[â8Ê¢Ïׇ Ý­ ÍCÁXzÖvMÖ’«.ú.ËÀ¤~í:÷!ÅMŽ)@Ö› ¿£:†‘[uAKöÆ™ô×½zb´ljú#rtŒŽY–ùµ}-lYß³ØA,¸ÑfÜÆÿëÿèg­Pý#¸¾‘¦ó-pkyOZ9ôäØ;°ÓžãH»ÞX{iSӇέW‰lO|>—½Ûð—@NzÖ¶ë;J6!? Þ€•þ¡€¿ñ)Zÿq”»¦*«É[bôæ2w=‚С¨ÙâòP0žžµÍÔä-]PʃÛà¨(*…þ£¿ Xƃ½úà¸×½^zü[65ýÞüJlSåS߯ëkctÏB`±Ø\ÄÙ¡ÿÎ÷HâGZÿ]üå&ºÜP=ŒØ2n]oMkÜž¼zs;~á•è±;ÊæZãÔô¡skU"ÛÓæÞµ¡wþÈKÏ«<*}GÉ&ä#௯¸ßŠ€G ç›CþÅÏÑÿ)¶„»ÖAMÇl‰Ñ+¾»Aènñm€æP"ìxLßåãdLɧ—[ |+Œ¯t Çä1 x÷ð;Èmþ™lc6ü%Šãˆ ÔtÁ^}pÌ—ÍÝ(=þ{möæ¨D¼-ã9ù$ókû©­‹r;‰Åv¸~/.^üŸ‰µh ~&¹çç’÷àÖõ–´ÆìÉ©7ï°Ó—žÒck­1júйu*‘íesÏçaã6ü%εvM¦”l²|WIVÞËê[ùÝ(J…ÀÞý-]s'5ß`4®“‡Ì]ƒ tGáhŒÅcêøÚoÉAèK¸<NŸ‚¯ú½p,´Y®63fãÏd³Ù/¡c¬Æ2ò`«´lŽ‹q½Éë¡Çw¯Ížü­x%½“O2¿®¯™Þ5? ÄB÷â6ý5\Œ{ÂEÚ½EÁâ÷Õ}ö[ߣéç(› ìô¥§ôØGÆÚBÄnůéCçÖ¨D¶—=Ÿ{[·éw ?œµíú%SÓg]D¿ý\^éMà~!x]\û”ˆ¿9_ú»ó_s¾”­úyÈÜÚƒÐG:~ ŒÇãjµœœ­¢ã© r'c9úŠþYQüù¬qÿÿù|µ‘1›&Û˜  c5–‘[u e³WL6~£W£Çï›­ù9¶Žåä“̯é›@ϺŸ…Àb~¸9Ô¾ÆAϦÿrꘞX%FŠÀ­õQ´â÷Ž?bçîæ(› ×n”#r ½[#G¶• ½k·[·éw ?œµíú-9¨é³._+’ᕬ—(øŠ-ýŽ€+¶þIb¾æ|05]°Å×ÉCæÖ=ÝQ߸±[`<×åPË+t b»ñTîd«m¥U h¼8¶»ÚÀ˜?“mÌf¿„ޱËȃš.héƒ=ñƒ¾®7x-zýzìj6[ós´b•ôu¹_×7…Öš…ÀFbaü€Ûƒ‹½‡ÖÏ wý+àפ›j†ûjWþGÔnÝ÷ÒŠÛ;¾ ¥=v½±F9bìлõqd[ÙÌ»vaï6ýäˆó*ŸJ¿%šº4~‰Ð·¸<ìû>[¥ŠÜž †(F ¾î|´ä ¦‰2·æ ôGü’°»Wj×díd|.ÉÐoÉÐïö|vqV³ñg²Ùì×à1˜’<¨é‚–>Ø2.è·ñ›¼½>=v-›-ù9öŒãt“̯é›FmmÎB`XLå½yñô“Ý-ᱎDo‡+FŠÐ[ î:l¥¯w¼;w AKzìzcpĸ¡wkãȶ²‘¯õ[„½Ûô;8ÏRÛõ™]º”C°QÜçðí¸á‰"`õ#A…ßâB@u¿ÄÌèµç~IÆÔô%]MîÖ„>Øóm@iìOÇuy”dÀÅf9Ú-ú*sr´!W½Âö, ôÇ‚rÛlþ™lc6û5x ¦$jº ¥¶Œ úm®7xްíµï±kÙŒäVcÏ8N7Éüz¾‰ÔÖç,ˆ…Äæ‚ÑB Ë’ý­Ñ1{I“°rp¹i.7P lìÝ"Ӣ篜¸ë1JOœ£l@غkÔtÌÑv½ôÄkÙ„Þ­‹#ÛÊ&¾Öï%üÜÆ_á\K횬&jº ëS5ÂfúcAúÍÿëíLjjðµç{¡$cjúQ]ÈÜ:3aœ¾ütÜ^0¦Ž]Ê…íâh\•ï‘¡¯:µiáü¢p!ÏfãÏd³Ñ¯øJIöêg³ÕÏ1Ù]oð”^» Çö(›­5}I7Éýz¾©”Öâ,:‰Ħg…Š. ð°»5ïV¤A¼#ŠÊKv½„¿Ûø+œ3·]¿%¶øYŸòéÁن̑ãÒ6…ñ\” Ò·~¸þ|/ íØ£wº¹uUÂ8½Ã·ŒéÆVYôÆp皌û5Ÿµ¾Âúlç(PnãÏd³Ño‘ýŠ¢k9héƒ-6GÅ &»iCçhé™^Û»‘q•#â—ô“ܯåÛ¯ÏYˆEâ„¶ã P§ ~¥ p ]¢¥j6N2·–Jاg`§cm…Çtãc<ÓõKº’¾†Ú¢™¶U…ˆ>ëèÀ#‹€ ¦ öêìFí[LvëÍ.¨é”£mGâ1GÄ.é'¹_Ç·™X—³ bAÞ<”ÚýՆߜ—vçÑDGóò±é†º’ÏŒ`ê§›¯³P–_x,ü|3£×•ûŽ0jëÖ_eŽ^»`Ä–9:—°së²>}'/Ùn!b¹¿ÂùsÛõ[r¦7–’íR^=ô؆Møf ]Ô+]–wþ¿î{ô%]ÈÝ:*a×c[Ëa+<®Ë¹©Ë´íúÊ÷þÔ¶këÔ.ú\   `Ø‘ ²Ùè·È~flÕ›v£ö-&»õ†7(ÉGÛŽÄcŽˆ]ÓO:¿Žo;g!07‰Ûm;÷ D.½¼|rú 9¢@!À?[¼²¡B Ÿé—ãGþbÉ˵Mç=6`ÔVלû5zmGb2GÇ;· ëÓgÀát5ûQ"–Ûø+<n×d59£6=>A¶K¹õP² y4кß(Jð½àä¬WSÓ—t!wë§„pzPg:¦ëë¸èëm–3ßÿcûž©“ÇD›eŠûv€õÁÿñkÿ›ùì6þL¶1›üÙÏl|‚š.h郛 ìFlÜ1Ùº ïZV£×þh;ö=>{l&¹_Ó³ÈÄMâ6µvœlðÈõ¼Ò§qŸ…Èç(¸À)(ö/ŸI> §s¸ëÎôؽv ìu­¹_£×v$föGÇ;7õéÞw8]Í~ Ïmüž·k²šœQ›Ÿ Û¥Üz {‡»fGÃqÝ8èCçØª¹[?%ìZ¶­¶ÂãjÈKÇF_Ïh3I˜Ï®p²ïý©÷2*g0Éí•mºÿ€ê²ž|¢8 kÆìÖ›]•µ±ï±}äø5ý¤óëxrùq›×gy´Þà¯6útÖöÒOã?‘Sñ¿‰ºÿQà„/¿Gpi/6T,2þßN6ù£ï#Wzí@Øës¿F¯í-b#㻹ƒ¬O÷¼£¤«ùl%bºÍ?ÃsávMj: 6=>A¶Kùõ¶Léšá¬àw~ô?kÁ±¹ß’+5›’.änÝÈÃé‚Úø{áqµÍ°=·]?H‚ Ú¬Q(ÎN Œ‡1µ½:§û¯DèÛüƒ¬7›ü²¯Ùø5]ÐÒ=6ÁÑvÁd»¾î#ŒøôÚÞ"fв­é'_Ó‰·¶ˆ›#p›…Rí8r>óæ~µÉo´—~ÊåÙˆ¼záÿ‰t%—B@õLl8À",`ÿò™”OBõ¾øÞ¨1j«ëÊý·°½åø¥ùg]º×%]Íg×mþ™<6åÏóiɃšôŒáȶ)Ç¡WÜõ X‡6ûmãqŸqöªwrPósk¦`lg¹‹<.Ú<.·Ñçv‹d˜AÿþÒØs”á‚ÀåÀ²U;Ý‹¥ôYg6ø=d_³é j: 6Ñ¿+Îí­p,œµSçÔô!wkåÀ¸Nîb‰Ž‹\xlu-’qý(\Aà¾!ÔNÑœ®úéžä@õÁ³È«DšLFûŽš t%\nÁ¤›ü5f‹QŸ^û£í‚ۚͤókxrá­+âÆ(mj2mo)\‘¥Üž•ȯ® àÍüªmþ$èº ¸öéÿÜhÏŸ Üý¢ôÚaËkÈkÚ¢×¾ÇndìQÛÒ¼ñY)Q²éñÝJÄv›Fç¤ý’ŒiéìzíA¶ŸseôÚ¸vIæú¶U¹ê cÚÖ왚>tnSe.îѸqyl´õŒvnä úL2̰ ®0p…€+ çåd5yÐSd¹Ùà÷}͆¨y()ñ*=vÐ÷ر­CóÕ-F}zí¶ zlk6“îrOʼ5…@ÜAiƒÐ’¡çV°^mo–¥<Ÿ‘È×$ᕌI³r°Þ¬ûX£…À׿Ӷ)¡÷Œ£×.[^C^ÓGÚŽÄ zíî4gþÜ8J6=¾{‰1\t^ÚoɃšNíˆOö t}\»$+ÙG8½ö[v*«É™’>än}Ge.î-౑‹êKç ÝÀK»DrX€¬V È-T¦ùr_mXÇ6(ðޏg!:GJp}•+=v¬ë±+Ù„\qv%neßc7šooL'&¿þ'×¼…@ÜnS8ʸížB €Ú–|³<åûlD^¼–=¤ e´½²é,¸Xä…ßM`>9\Dà—œ?üí_³Ø¾gJôÚa‹õÓ5­1b_² ù­ÇuóåÏ£fÓã¿—Ã@ç¥ý–´ôLØöÚÃ6pר¾ÕgÙQ:î·ü´tn‡û.æ-Ðqë¹>Ú½$§Î&ÐB8Û V°\mÔîÏ~ígg`·¼#,ÄV0.H‰¾fǺ’]M]Í&½âì˜fľe{‹±ûƼ¾þ'ž7¾ˆÂm‚’NåÜöh! m×_ÉSÞÏDätµ¦ó¼|*ÝP –9j6ú{‹œŠÜŸ‹†R1ðU¿ä£W² ö—Žž££Ç† {¬Ÿ®i{g;:^0:¦›+f5›ÿ#ˆq\tnÚoÉAK¯„}OÌ×m‡Ó±¬ä[‹[ÒA¦:î—l ªƒ¾$wëTöµ±n…Ž­9h»‡tC{¹lˆ‚úá÷2lç¨úcB@çP“ߣ@\€±””T¶)Ù«ÜÙõب¼d„Nm¶…^e-z}Zv£c÷Ø÷y¹þ'mæBàËWÌ7…¸!Üf (霜eÑ>¢(ÉyÊÿYˆ|®ÖUú ´ÑG¡=·ý…áÂÿ-Ð*@ü˜ˆþk(FlµõFósóäÏ‹£eÓãbWŸö[r¦ÇÀ¶6^À×ÏŠ“;%ä£:ÈTçä%gëúLèÜZ90F-Þ-Ññ5mé†]Ú#¤ + ¯\0¬gûùrÞÚVée—É탊€±ã R è;Sò•mñsz])†¢6-F|j¶£c÷ڷǜ~¦Bàƒ/¶Ï×JÜ Û#:îG;Š€ÞB `;õ)ÅÈò4g!òÑõå>Ë[p! º,Ÿ ýf€7üQp1ù^Üœ˜qÝš–±WÛѱ‚ÑñÜùóâhÙôÄ8’ÏAqŽ"«É™¶jY ×µk2–×ô=8¿’Œuj}'ã³#t¼N-Ü8÷cóøÜwòt£f¸v‹h2\ 0Ðâ Th1€œuè³,Ú(j…@n›Í}/áϤÁ-¬+Ù9¹Êz|·Ú´üJú tŒ³qe;'èµoÙMúõ&÷¤M.¾â >bž¯‘¸ÜËÔôNDzhY”d‹<Íçˆ\ì:‹ „¼|z~ÐÏç•N~G›ûÜ7ß h1 2Ç_ý _šQù'~ÉÿvÕwóPzíb»5-1b϶£ã[rÓ¹ñg¥DÍ®7ƑĘ®r>óy®*«É™&ìáƒvéZŒôèâ|$µqTÆý’¯“ƒÐéÚÕ@¼nŒ£Ð1ÐvgnÔ ÷YßK œÏnÃÏr†õºùׂ€ógX> ½ì¦óŽB€ã4hµq~¥8,/ÙÐmÓ#+ÅBÇ8¥×.(ÙŽÄŽÊmÒ¯7¸'}äBà ?òùöáùÚˆÁ½ø™’“«,ú#E@ ¶­>“ui^&ò°k-2&ô#p D!Pú1¡(P¼|¬ÃÍA±;w-ØôØ*£>aÏóãÏE–íH¬£ˆ1]ð .´0ˆÿy–ÿ÷ÙÈÃå¥2Ö99tníûö´o‰‡ûÐ)ùÕ3Ï‘n`+WRðåŒöÿÐuìÒ†?ø¡~7ãtúMÐy¡­E@<ûùù_+`³Ø~MšSb%›çpßé!W€®fÔb+jôlX§v%?È=P9÷[ìõF|Z¶“þzƒ{ÒG.¾ôƒ×ûWƒâp/{¥fWÒ±<Ú£?ÔÞù×bf]šë#‰ìÚ‹Œ)ù(i/í¹à‚€á Uðí-ض†®™Êj”ì!/¡ö5¶Øóðç£FíH¼£‰±ïU=va`ݹ¯”äû‚÷þ¥_r%‹"€ ÷þƒ¿e¥Z hÐBsã³¶Ñwv軵 Ø}Kg´dGábë8Ч ,@¶—4Àª…`y€M‰‹Ýõ·<ÌIÏ(þ/ûoåsz±e¢ J›lü[pò^Ðøèߟ®dãä=>Œ³)¡ö£þÁˆOËvÒ_onOúÉ…À·¿Ò?7€{É+5»’NåÑT!d}šó£ˆñíú‹L)Ù„¤žÏÓ‡:·¥ÀF~¤`¸ø¯þÇ¿s¥ Z9*nØÝÒ^qv ¥Wžׂ?5zlGâÝ‚ÿ™ мö®]“ÄÊ6©,z ÷/¿\ ôœŸµ>Û©­[7¶άc9d¬Sû­p,ާí Md²#Hƒ,D¿T¨lO!À}´aE€ô#¤ÀUœú–âÀn”¿ôï¹ØôÅ/å¤rèFú âÖl¶ñ[Ç*1Ù¬7¶'cäBà5þ?qñÝ ^iÙ•ô*þ- šd}šû#ˆ±‹×ÁÈ™–Mèk$£kY¡øéôÏþ¿ú] jã¨åÂkÀý°íõ±¶CŸQ{î÷>Xþ,´hÙÆ»‘Co!°¬‘5S‹èÚkŸeª‡,Ëió_*.¢(}# ?¾•UŽsÎi»$«­Ã>lWj+ê7 |5ŽÊÓdª…@2Ψ¼øÂ~-ÐWyà œÑÆÜx~#ñædãìj„®‰~jôØÆ¼‘Ã3! Üú«Œå¬GŒ,3E@À6@¿ @!h‘-´¿õ7•¡Ï°NÞÙ¶ú b´ì¶E[cD;ÝWÀ$ã+ÔFù/ÿ£Ëõs~ºáç"@¢ß ð\yŽ€‹ååSW‹ÍgÕ©M öï€+èW8j9òØŽÏNçà˜Üv°®fWbħÇv²ñÛ“1^U!Þ½Ô=¶%•GEÀ£ Û¤õ¸'1fñš¹Òk„mñ?›_ )©Œêÿ³ÿâ_Xõ{¿ܼ¶µw}e$>ô=vÀéa‹ëÀŸƒ=ö£1oIärÏB `Ûh¥kàäü·ùgÔÞýXPé ß  Ï²Þb@çÃgm£¯2‡Æp>*ë‰ ^Ížõl§òtT‹€tƒfV2Ú¬+áìu“Ïz‡æÊ°à?“\þO™T”Š,£9%™Êkv½¤ný‘B € ÃÅеҼÛ°Ú,cœ¼äý’}I×bÔ§Ç~²™®ÏÉ>^M!ݽÌ=¶%'Ùž" p~¥X=cd›´.÷"Æs×%¨é˜;ååãó_^lS£õÿ ¸9+l×ã£65Ÿ­¶5» ôг¡Ç5ÐÏA^ûѸ·$r9¢Zz&l»AM¬b˜¿ÂöÁ–B ¨,z‹´Œû*Sœ¿óé•Õ{ 2î«.H7em3=¯ô~]Ùt<ÿzl·ñ) jüûÿúߺ}Wh!ßÈßQÒ±Û@ÞCzÁ^]\L²òæßÙ;øAÎ5Ø>ÜVTÎ}磱´?¨_ýds}N¶ñô…n@~ Öè±­Ù8]ÈöúÖbõŒ“mÒ݃Ë]Ÿ ¦SzmÃ$ÁºßQ|û‡_¹àôŠ›³¢v-?§/ùlµ-ـЫ½Êèô3P£×~4î­‰|´(NÆ´ô ì€[ÆÙ,¾´Áç ¿> (¸øÌ¼>Œþ 0Ðb¨+ Vs¢9¢Íz•3ÎÇÉ“×â×? rµI7AØLv×…îÙpe«¨>ú,sÿ"èÆ_a;¶‡œçÎsæ"€á"€‹E?çíèÑ’^ªEœ=(mþ™’>úX+œy= .(Ù”ú5ÆÙ´õ뱟lüu:ÙÆSqÁõAX£×¾fçt!»E!P’ÕäJ¶Kkukbw@KÏôÚ†ÝJ…ÀŸúÙO\ÉÜœgWó±ßc[² BWŠ­ºhë½ß¢×gKì[9=ªàk€õWT·ØÓŸ7ü%àÇè7-0¾û‘®(pð<ÑF2ÕÕdNJºšO 7÷£n€"ðéÍgwÏöµ}Z ha€M>Ãz¶AßÍ=ΫoèÇtã¯DÎ5j6+xïåk­œ}ÒKÕÛŸúÞ÷ xsï`;¶¶®@^-`[óeYK¯”bö0â×k;Ùùët²§-âbëC°F¯}ÍÎéB†"àž…@Ð;V¶KkvKb w@KÏŒÚ2/ŸÊ/Ÿ¾< ˜ïý©ËÿŒÚ æ§sVJ6GÈ{eNÞcW³zï÷Ðë·5þ-‰œŽ*‚–MèyÝÝ5€¬dÛ{Þì×€/@ ¨àPìýv@ÁGÛzV½“9SÒ·ü”°,S}º ŠÀf²K/çÂ¥€+ÛاV0®@ÛÚæo0¯¥/ÿ?rÅ™ S’õâ|Ó Õ:lþµè) XÇgÀëÅùp¿ìàã|Ù†å%䌳)q ûÉÆ_£“ídGó¯Åì/Û¥µ»%1†»^AMçØbZÅÀ(oø!wÀ†Ñ Ðy£ï -²Lrç>dj‹6ëzxùÄœÇgïz£r.â PÖ¹B@‹€`¹O$Ÿ6NǰÚNÆ> &ïñWzíÀXÜëës²¥ˆv/°{9ä<èá×C¯OÍ®¤ ùk(‚l›ÖñVD|wÝ@K¯l±¿:Gî35]Àú£lUçlKþ½c¡îs ôÚ#¶÷&r»u!ò@×›û |²ÙØ«¬Ç®œm yq!àŠ•—ŠèÐæ1ܹ¤w:m—¨Ùôúôõœn‚*ÙfÞäLöÓÆÓÝ«lç=Ã2ظ >oü¶c´ày£ ~ö·ýöU¿VNÆÀo úé4nz™^r·Ñg¹CmK…à\”›‹í”ûZæýJ2ÖÕb€–^鵟쮯ÍÉ~ž¦Èã˃¯‡^¿–]Iò£Š€ £{dÜl›ÖóDlwí@Kïñ Û^4ïl {•Õä€õ-Û6GÄUy«Ï„ŽõÑvŸÐÒ3#¶ ò;ªÔ&ú¯7ÖXeLÖW6öNç€=㊀zýEa—›Û𳌞)ˆ6úh×d,/é•–]M:Ï ÝUØv²/-Òà+X¦¶Lmóïþc¬X]ƒóÊíJjºþÌ»/³ò ÆGQ pA qÓËtEÈÜæž7ýŒÚp¿ÎG©ÙpŒÉfž/éÔºRßézã´èµŸìÖ×ää8ž¢ÈcËC¯‡¿–­Ó‡ìÈo€‹ÓŠ=2v¶Mëz4×]?ÐÒ—õ û.¥fçt=qa3’CË–õ%[•·úLèœ}à>*+1bû("Ç[Ñx]™’.Ëͦ>¨éȸ P;ÆåÇðf_‹†}W p|í^™Ó—hÙ–ôn¼8+éf¨rm?mÞô>M\l¨Í„œa9Ú­•xóϬmÊßðZàÛÌ‹á\•’^c=³èL10µ§ €Ûä—6ÿ-úX+ŒÖ©MI>é¦ÜUû”úªƒ¬£‡^ŸÉn}MNŽã¡…@Œ™Ç¥^/#~-Û’>䯱²}Zã#‰˜î:2=6ʨOØ;8Oî—hÙ¨¾'fÐ;~ÐkÛ²S]«¯r§YÀŸþ|´µ‘çÑ…@œ]SÆé³Ìl胚®ò®ÔŽÑ‘§û9ñÒ¦Ò½›q:EÇÒ¾Ê wí=¶jýÒxÐtCÉúy£3Ù^ÖGïÑ•m’ W`ükÅ€+ÀÅfòÕBÀ­ÿXÐËG×c"¯jþÊ{¦àõDŸÉ²Žb ú?÷õñyãÏ”ìÐÇzal6гq2ÈóYî;è½i»>]ͦD¯Ïdw¹'Çó°B GºF|{lK6!¿W!P“ƒÑñ³}Z룈xîZ2=6ŽÞØ ”_­¯´ôÛô؃°Ý‚‹ôè]›qrÈj>>ú)1bûh"×£ ì·žŒÚ,~• ½Ó•€㊀ÀÙΑó \1`Ó_bm{í¯ãéØ*×¾êZôØó¸µ± Ò Q%ÛÌ›Éþ²6z®ìh£Är¦¦ÓB ôb• I7ù»B€×A?”r Bœ¾E¬£ÃéÙ/ëhÜô"]é¢poü•’­ÊyεgXïlK÷Þ¢ÆÉ˜–ÞÑë3Ù¥ëtrSRä±è!7¨o˾¦Ý3ÁhÙ>­ùD,w=•^;¥äràòN_ókňáìYwt|ú’ʹßÛ}FJŒÚ?’ȵ§jº ô%Üšâ¼²+lê¼†Æ \8[àòPh1 …A«˜lÖß$èxµs­ÝK¯OØ©­ŽÍ¤›¢Êµý´6î]Ù™ S/(J…ýh!€>ƒo8g´ö«ñÞË×\Éb [8û•lÎ!½Dó›WhŸ‹Þðsg^+ž ød?s)zß1+»ÂXN´|ã¶éúœÜ”»¸aô!×˨o}É&ä\Y¥X­1¶ä}Òúï%â¸ëªôÚ9Ô7úÀåÄÔlœ®'&ƒé:ì%â¸ëËôØÔÆåáhÙºx½>Š®-ãæ4ŠÆlÁ¹êëœ]É—ãÆÙ}^@Kÿ¬DÞG¼fh—¥´¡wòÛ@mA+oÞìó¦rº@¿pÅÆrgÀ¶,ã~/=~mÑfH7F‘¬Ÿ7<“íeMôÞ\ÙÑf ”äë¢=Z¨S*ŠëAyNÔ7(A¬ß\Là6ù*G›a[Znþ£hÌ÷Þyoåî^ ½‰[“¡]ògZz0Ù¥ërrîRäØô`e‹OÍ&t·*‚Z¼ž±¶ä“}ÒõØCÄp×Xéµs„/p9”èµg;烱·–ÀÍáx ðý?vyà–ÐùÖ9»’¯Æ¶ûÌ5Ý3yï)Bð¡í€=ÆNÂÉÇlæUÖâ3®œ-¨åÜFŸ ÛQ”¾@}´2îPóÅX $gÒÍQ$ëçë>Ùn+JrÀz´]1PÚüÃöÚ~ÝJëõò±É6rPœœ}•#¿ (¡±ÝÆž7üЩ ò:ÿ- ŽÆæ‚ U,r×õNe¬srÇd›®ÅÉáà1K!€®{Éí!Ǥ‡Ú([ü{}jv¡»e!”böŒµ5Ÿì—®ËVÂß]g¥×Ž ÅåP£×GÇàþ"7k\þ· ÆÒ?±Å`9£óÅ]»G¦ºè»ÏŒÊ^ ‘ûÖB d¯ÖHeç8ó¸ŒÛ̳¬Ž \8[PÊÝÁ|Ýø¶wh1x|ͧÖ¥är 2ÕƒtsÉzÚôLöåB€ß•¿ÈëãìþEZáÍ¿âìXæÖ,@>Ö«¨ýHPëw4_7õºá‡ÞÉÔ‡e¼{pñxœ ·(È}ŠáÚ®Y]‰É6­ÿÉ&°þ%ܚ߬À ü@e«_Í&t\Ü»zÆÛšSöK×h áë®·cÔ`œYÞ¢×.àØ@׉qy߃»ô0µ(ÍYåЕd%~n¸ÿšˆÜ·Ñtm°>%9»Ä0›y•õÂqƒeŽiü# ŠŸþxHà6þZ° ·_û,Sý\ Èt¬é)’õé¬>î wáÇ”ä€õh—~D…7ü%œ=úµuáœèÕ§EZ Uû8>ø…o»Î7û¼Á×¾óa™®Åë8×¹—lƒZQÔ—ãA®2È¡+Ù”˜ìÓµ8±`mK¸5-Ÿ›9Ž<̶°%N¯OÍ.t¯¡¶ä•}ÒuÚBøºkîèµ ;ÍÉåèì”–>@œ%ž¬ p¹ÞÎ%(#ßhŸQ¹ú±ŽåøÌèçèµshôqܺÕg_3)&;ÙÈs”ðg–ù¥Ž(ü¬¸ºéw”l!×ñ].N¿Ác”t -4µÓ˶@ÖÓ‹˜ýJ÷ÚLI®hWhŸ7ÿ ëù”Ö&Æ,oñÞËWeœn½Öi“´«ò(Û¼ñÇ&ŸÛΖe¼6=¬}SžÅR Ð[h' «Ù(“íõœÞ&b j¸uë¡ëðB Ç ÙV¶ÄéõiÙ…þ…@P‹Û3æÖ¼²_º^£„Ÿ»îŽÛ°)åR“úðË6²Àåx xÌQ¸ (ýØË·6ê¸ßò Ügé5s-Üz0l“ý̘I9ÙÉ&ž7ö#ÀŸYæ—ò8ªо½E³a­íšÍJ15~ôK¤›Ä’uòrNhi—î´™’\]€ ¿+Ö• î=kƒœèÞ{ùø|.€×,Ú£h¬’›W¨Œ7ú¼á/É·ÊÚ>å×û(¥ØÀìþNÔü“­ŸË›Ö¥„[›QFãV`0~ˆmekœ^¿š]è´xæB Øš[öK×n„ðq׿DÉ>äÀÔtów>°Ë:š;pùícßý1!ôY¶¥`¹Ú”|ÄTÜç뙉œ{ àÖƒMŽiÆcx#ÏûQ4n°Ì/å²µÀ<Ô&ÎØôëæÅA«(`9Ÿ[ó`9ë÷Â19®¶K¤¥HÖÏ/à‹ýeƒP»Gàwå/r…c`“Ï›}.°cj…Ë^¾~²á|ع" V ðšE»õ/Áv®ˆ6˹ï(n=l&»”×8F 7&@1À¹±}IÎ8e²óóxMèÜ7÷=lƒí)²=¼ö°5Öˆ_Í6t¯­¶æ—ýÒ5ì%ìÝ=PÂÙ‡ ¸1@K4Ú;4§^\¬[óî§ÓØä¥b€å5°^ºnÚv}¦qŸ·g"r-z)xÏ›ú-pÜ€ÇÛS”lâÌ›}ÞôC®@_+´è=EÄÓ˜Üçq•t£Ézy3¥{$?P’;ØÖmîyÓï`[F‹¬Ç¿óßøçò9Šû•¼Þø¯ÛS‘àH UeÄ6˜ì.¹ñ†Ÿe¼ùç>ËŒ®¯IzAï&âüü»·†æátlS’ñÙÙ1“ÞÏáÙÀ|J¸ùÉÖñj~» ìC®=l5âײ ý½ŠP‹ß;öž³oº–=„­»J¨}ôGÇsrb;8‡Î÷–è&¿K‹àl®ŸÎÉk~ lûü=š%·”¯ƒówsTr,3Nºd4Å¢ ¼nìGAÀãQà…YÎ|ÞèC^v ŠW >ËY·ŽSŠëؤ›Å’uóËW}€»?ÐfJrl·¹çMM¯2î×p…€ÚþF€aŸ´@«6yI_c²¿ŒÃ›zÞÜC®z'¯áÖ"½”ƒãGA^ê—Úʤóù?‚ȧ†›Ã­Ø;~_èvÙ~~híeO¬ß–mè_c!ìÉ3û¦kÚCغû¡ìã<2N°Å¸<î‰ÛÀ÷ââ9Üß_߯®)t%ëJþްUÜgòž,y¤üœ«›“ã˜1@è“ákÞÀë¦~”ˆ¡è˜{ Õ£ï6÷¼éWØNÑBð˜hs,+[¥¤/ù–ìƒt³X²Ž^À“íeó¡×je7û]ù‹Ü[†7ò¥¾Âz¶Aÿ?ücký—O¦ñègåSû—þབྷY9¯·ÑßÂä›ò¯SPÚÔ³œõÚwö,é%|ÿÃ?ô^†ÇÜRp}×v:Õ³Îå~+K —ã=8*—ÿ•Mºß7À­=ì‰5âÛ² ½.‚‘ñ÷äš}Óõmvî¾(öÀÅ«1’Ó½qxÆùì%-èêeU+F¿¥õ-ÉXW‹ÑüûœÞ’eÜ”Kë>ÆÙ;7F=ã6ö£¸¸:î…@Iè&¿´ùÿK?ðî Ö9tÌZ2‡ÚÖkÛÙNI7Œ%ëäeœ.ÌÒÖkÅÀïÊ_äŽSú1•€7ýŽ’=ú¥BÀÊ{¿ø§Ó9ðš¡¿‡)FÊq¹Fíû1à >6ùÜFßÉÅEA€kÂgFeìDzXë#Á8%xüGqd^#qz&Ã…@¶¡‡Õ^öÆñoÙ†þm.‚쟮s°q÷†#l³FÍGcÅ›ù÷¾1åH8›˜cZLKèPpAÀí‘b@רŽû5Ý^"ã>·G²Œ“Æv÷1râ³#Ç0ñAè“ácÞÀë¦~ ‡qã]°NyTÑÍ?³¶».t<í+¬oÁö.†“©ÄçÒ‘uòBVôZ1ðU–—€- €­Å€Úñ9à" (ü/ý(JE@ÀsPÒbíbŠ‘ò[]§YŽišÏ5x£Ï~–±ÜÍ9”ÐkÛÂÅ`Ž* tL•©|j§k0Æ,Áã=·Èq$ÖÊÖÜkÁªÀƒM_‚ ëèAµ—½ñFý[ö¡D!´ÆÉao¾Ù?]ï¡w÷‡v û;y‰’ƹº™¯áü7:µÒbV~3ýRAÀvÚ×Ü—k»~Iv—qŸã=DL÷ ÃÑç\›e.66É8Ÿs ³©ßâ7n­Àç?·iN˜WK‡_uÛü3×öc…÷{©Åf9윭‚Ï¥’uæåÌðub;ø9Õ)l[*XYÀEoø¡ãs0Zô<´@K›e[˜|Sn«kt‰Ï¿è¼W¥Zp _{^·´(èAÇØ%9tÓ9­›óÙ¸U¾£1[s)]…ò e/{ãú÷؇͛P{sÎþéÚ;B§÷ˆ6£¶5½ö{qö­¸øJ)O–+¬g´ ìtã¾Ê÷ÍË8?äåÚ®™“ ÆaÜg{„%NŠïîenk?û™˜JØ%‡|ÎþfSß¾5ܸ­o`§s ô…YÍ¿?öýïfÐwE@ýd3ù»B€Û諬çñT_³gø³ÉdÝÕKz=o¾N+»ÙïÊ_äŠÆé)èW¨ŒÁÆ_‹E(\þ¹/kÆúÐ0ù¤üV×h–ÏE9ë£]ãèB Q"=¬œé- bý•’l]LvÉiò5›|Û­¸±[…@Àóã¹Õô­B@ ‚ T p! ÅÎh3רٲ\mœb1úù ²Ü¼°ÓEYÚzç«rFõèóŸ7ú*wÀŒªcJß oÎ?÷iÍržãb?o°[L¶Éou’®RÐ9›1±ùª«år$96­rDQÀ×㨠”|žäÍ8»=l½ø˜ëßCµÈmz8Á1Gcô؇Í#  5Öh.GäžcÌ÷†»G”Ð9PÓ9QÝò¯”fƒ`[‚ÇTzl[úlÿÔYä¹o>¸ üÞìkÀ°û–@sCŸå*%}/.FÇ}þ™Ånöuñœ,û˜xJØ%§ÅçV”ƾe!ÀÅlµ``h!ÀÅä«v®Q³ ëKm–)úÙYg^ÜŒ^'¦äËrÖ;YPÚÔ놟ûŒúi!ðCßñß_ÚZè_BP*7ç¯ÀŽÉrÚd;&›du.÷ nòèkvˆ´ RNGãÒÚè8eùŽ¢àêP2Emž…{æºuŒ•]Ï-,…@Ãà /@~0ÅÞ¸[ü{|ÂæÙ `4Ÿ#òÏ1äÈ›rµUZzG).äQ (¡¾-z|Ù¦fWB}'u]î›.?àþì¢ÛøOòw3,Ó‚€sã|!Wä%Ÿ­pÌ^zãè³€qþNÆ1j„mrZâß 7vº=…€êX¯ß\ä¾`Ø…ãñYÛ û–P}+6b2îódy3|}Ø~ÎßéTyPÚÐófz•AÎ>ÜgÜ•þ(xïåkò™sæÜsÞ0/ýÙV­cÒ%»ùº8ÜÆ^鱇neû~9¿Iž|$Ç\ÖDr1¶‹®£(`®Ö¿ÐG[mEä¡8»£Ø;Öâ'×n«B€áÇQw4F¯}Ø…@™‡^€[ŠÐk”âBp! v½p¼Vœ=¶Š³ME—ûæƒËÀïSóu J‡‡Ú*œ+prÈôübì=¸xNæž)%Â>9.c§„óWÜK:º-…€Ú2µbcº6Ëœ\qvè—üáÔ>ŸÉÁ¼È×sçë³²#ß’¼d  nS¯8yɇå+˜÷~ñŸ_Xdì™I–ôóu©¡›ú5{–Ã.Ë$/fÒ'ŸƒÈñ–õXçÁ8¿E×Y,ãÐ5à>ëî`Ü{Ž¿w¼•¿\§#XýhðËc/GÄÛ£Ç'l\„ÎmŒoEk¼-ù5‡‡^‚[Š€ ×¶f‡1ƒ­…Çpz†mÙ^å#p|Ž•:‹>÷Í— ›(¸F‹k»µ¯æ‹üJ2>—ü rs”ìµ_¢ô¬ ’óʶo .v€ÏxnWæÈ:†m´¨mþQ<\ûø5Ò1]Ûõˆél!+Åa_Pú|&‡«—zºùŒkRº>Ηåjã€Ï/üÁ÷2輡WTÏ>¬ƒŒ€óÕÜ™t³Îçõ<•l#lÄñ/ôøWzðî;ë>oî%;–Á&ËæœJL6Éo'9Îj-Öy”У,ãÍc¯r¨ôù0Îî1æâO×ãØßЇP[9"F°%NOظ" nˆoIÏx[r:j9Î|l)@ͧ'&lþ± g اe Ô§…‹j¶èÇ95Ö}óÁeÂÆ|V9((Zŀʸ_jß›»„Ú¨=ôlWë3g÷Œ:7f€ÏwnûÒÚæŸaµƒŒóÒðøaÕËV?eKœ^Ÿ°sE@:Ý ß’žñ¶ätä<"ƒ{e„’_oLصoØ®¥w8;ö¾.ëRcÝ7bú@ ÀÑf ï-8gä×j£ïüñΨú±NûªÛÆìÁ=ÃFp1ô£¹±þšŒ¼©¯Áöì9ç…6ï`;FmØ–å tLéó™ìKž)]öuþªwÀ¶TàYõZy“¯›}–«®Äjó?ŸÍ™sÏýys<é¶5] -Þôc³Ïr´ù@!L¶)ÖF²ÿ+Ç“ûdõ‰ Û€ –‡ö4–ÆC:à>Ð ìJ…oöUΰ~¤à~©]“þ%œ}‰šŸÓ¹¶ÚÜŒÝCéyWúÒx,WBÍ¿#EÛ°-ä<žŽÏý‹ÛèóÙ¦ôùLæe¿ÞxñµYÙ‰/ëT_¶µB€‹î—¨îÇ‚Ph! ¿€|5÷,£5K/¡ù|ñs°ÍÅ÷Úæ°ù瀋€,,‚É>ÅÚ@öçˆ>¸Èý˜{á5^Æä%]=ãìîÅ‘y¬bÉµÛ ÇV4\|Å|$µÇ€xx9Zú¶Äêõ ;W¡s›à[Ó3îÖÜŽ˜SÄèÁÝ? ÛôúØü£A=¸xÀÙr{ êïâ¡ppv®ÜFŸ Ûµbm–¹>dNÎÀÆáìGhÅa=Û¹6Ëž™Ès”=1j…96ùŒêІ9¹YV‚íà§¾Nư(}>“ÃÂÅvÚláÄï#ÆúR›a[z. Ë}ÙüsŸåÌÈ7Šæ«¹3é%”™Ú?Åé×q®eGÁÅÀJ¾¡&Ÿ”ï ˸Ô^dóÜÝxÚ‚õåuV`´YöHn‘ÏK®×^8OÆåÀäBà ?òùÙXtÜWx<Äøa¦²­lÕëv®Bç6·¦wÜ-ùíSøçó= ÷Û\ûh!àì{€¯ÆâöÔ×ŃLqvv¥Bè_7ÿ Û.@i.« òÎg/½±ÙFíÑïõÌ`Œ~¶[ö%x£Ï~È胭…ä,+¡6è—ä%B¯¸Ïf2^¡>xñûˆq¾Nưžmô›€En6ý*ƒœ©üsÿ#Eòå¶’nÖÌÔ^û2%=ǺîGˆ‚(¶Áä—b °ŒMíܧµpcöÙ‚®;÷™’Ï£¸E>«˜r¶Â17~‰°Ï…ÀG¾äËsGtÜ/}¨íeO¬^ß°sE@:Ý߃Þq·æ·Ç/ûÊõçþˆÇ8;ûÔ~G Äâ¶öÙ¾õC,–£Í:à>ü ì\!€kæþübmã_Ó90¦&/éŽfd,µu~°qº×Ïc™Oåó­°^mxƒÏ}ÈkÀ à" À˜zF»„êÙÇé¸ÏÀ)}6“Ãê…ëÐ÷`_õ¯éÖY¸8Œþ‚ð"ÿ…ß~iÏÿ‘˜ÎƒÛ -Î¥ÝQÔtb6øÊÕ/ï(‚É7Í¡“e\j羬…+`Ÿ¿þg>Xõ{XAc²ÜÙ?‚[å±Ä”k³Γqc—P¿\|é—¿Ä;•ÕàÀü`ÛÃÖX#~a늀 t¼¾'½coÍq‹_ød?síUÖ±gë`Ÿ£ nîCß‹óƒŒåhÇ95Ö}ó `Â&¨þ{«(PÔŽûó`jò’ît µwþ[â>#˜Sú|³êœ¾´±gy ¶¥b >;œŽe¥¶#ôJé³™ìË—áwÛõøjWóé)°éw²Åg.*ZA›†uœ;ræöb7oJÓºÀ¶LIÎ î-(JÌi “ošGѵpãì³¥–1dL–¡¯v·„Ç”v*kÁñf{ {bôú†+@èy#|OzÇÞšã¨_ØgŸÂuwòˆåpöØG°·P_ĆœÛ#8ÄbÚqNuß<@èA©àk·¥œûcÀÉ /ùìeO\çëbmÿl`¾ ž‰%[–«”6ö,gœ ËJh|Vœ\ã”Úø2î³™ŒW\l§ Ö›ßGŒó­É¡ã6úîW·ñ×~–Í›ÿR!€éÏíyã9.yJ_I´…©±‡ÊŽuøÇ™É#î‰&Ÿ»Â%¶Ϭ‹ƒq…ÀÏ}ç'W¨>XâÏg´Wc›ö-Àø·g‰-×bÎs‰iÆë¡Ç?üÿèÏÉK`@¹Q¶úŽø…­+@èy3|OFÆÞšg¯_Øe[sÍAKë3—q>Øï-ܸ*s6-JöˆÅz´ãœë¾yH€ÐƒV!€@‹- x³ï6ýN†y€šLÏ{‰8{b•üU¶wœgsQðL,Ù²:µaxSM¾nôYîôlòR,/É gÇ(ùØ0î³™ŒW¨Ö›ßGLÉ—å Û((ZÅÐb`¥ë,xó¿jS¡ ù·æ’h Sßû«üâ_ÖÝŒ­y¤¡›É>ù¸Ä¼ž'ÆåñKc-´(ŒŽ»ŒMí’ÝVóè¸`_®A/c‰eÆêe$NØVÀ–}¢àA×Ë0â¶®BÇ›áGЛÞ\[¾¡Ï6ó5­Ñ²C¬à™ 'ƒmgW¢f¯:m§Æ"Ë}óС¯Á× -ȹà?÷YŽ9 o×g¹ÚŒ¾ÀéG(ÅPùc=X7÷ž‰%{•;›Àý)oä±±/Á~jY)ns_Qú=~Jé³™V/[ëÍï#¦äËqjŸ}¤@»·0`¸PƒÍ? ÅåÍíÅŽ6¤éf]˜ú×¾Wþ$WØîQ”ò‰y·˜ì’¯c1<“u›i¬ ¾ë¯O¿{ ŠcJ¿dÛ b«Æ߬} Îqãô2çbûîm ôx5zíJŒø‡­+‚Ða#õ(zsØ“kÍ7tYO׳FͱÀ3%ÄÖv/5{§íÔXd¹o" ôAé/éµÔÍ>àBÀÙð†Ÿû=…@­­~-¶ø”@¬R<–×ì”ÛˆQÂùôbãÍ÷ž‰%[•—ìP¸¿(ÛújÏ~óØÚfëÕ»³_Æ}.“ñ õü.b»’/Ë{È>T¸3²ü-@­à"€ žoÐWÒºb’­}/¶—XØÝ›ÒØšŸÚ¥›¤È¤O>î>œÏŒ+˜ì¯c—hJqÌY‹Ö8G±GÖ»û.1Ì#ŒÆZÛ§kˆÅ¸B×EýöAÐãÇÔ|XW³s´l5ž¶Yg÷@°ÝRðfò°\¸bm–õôK„]¯-¿%_×®Q‹§Àv .^/6Ý?5[–—ì°ù×B`¤(P¶…¼•‡R³cÛ ÍÀŽqŸËd¼âb»Þ\ñûˆq¾*ï!ûÐ&ŸÏÚVB§ pEoòKÀÆæ)}%ݨ+œM/¥1nMkŽ€íØ6îǤK¶zÎgFcƒÉ~³ÆHÇ4²’=»Û½,ãÈ×àü{”-ñ.öéÚª…@ÎNΰMÍÉàá§Ôt=Œø‡­+@èy#õ(zóØ›/ûG;÷Í5l¡~ í¸.ìï`Ÿ=…€“o$v­Ú  9ã. ìz \×Òæž7þ%ØE€çŨÌÙ0¯ì”’-Î5[¶SÝ<ÆQ¸qz±ñèþ)Ù²¬d´ ÈY‡M¾nöY‡6äµ\X¦À†íœ rîC¦¸Ïe2^¡>xÖñûˆ)ù²¼‡ì3oêyƒïÚ5Âì)€Í“Ú‹mHÓº‚í^#:oÆÙª<Ö†™dÉŽîC£d½Ä,ÑýMrsc‰ ”ìÕÍj,Z×ì³øšØ[Øïâ“®g…Ý…€ê{ì‚úPܨØ»„^7R`$=9³o´sß\¿à«qÐ/ëûì³¥hÙr¼‘Ø=v[åŒ{ÐèãÌ…ÀêúÍ×S¯k {ÝôƒµÍõ‹¡V 0Næä­µs¨-Úz.é[„Ý‘¼÷)nÂêÌø½¸xû챞û%›€7ù¼ÙW9› ·Jy°\)Ù9¿’,5–¹¯ŸKy«}€õæ÷Sò㘊Ú2º©¯õlƒ˜L©xïÿýwfrûgó"×¼µ¿ØÑf4=ÄV°ƒc–p~·DÇæ~ £Ä:a­ôýÀ¸ØÌäw‰Ub¤àXWcQŸ=ãìnÁ2}®Kp~‹Ÿ‰¹•­q/>—ÏK»‰òƒí-Œø‡­Ûü3a£©G0’Çޜøk¦°}‰{\öq°Ïèï´l96l[>AMPŠ 9ã<ú8îo²×6ÿÌZw`^ä¬sÀ Ð" pãCÆ92%çãlû¹,¼”¬7ÎlWòe¹ÂvJiCß#œ±lü™,/È]ûJz€­È2Zó^xœÒX·„Çå<¶ ±·6.Ž2ù[ Þj “Yùý-X9ßW¶[ìM¼=l½ö[^JÀ~W!PÒÕ|$Äq+£þaï6ÿ ôº‰z$#ùìÉ=|Gp×4(é!×ßÀظ6ê§°ï3l[v°eÖ÷ Ðǹ·`]í?iÒÍ¿²¶½.0'¦&oùn¡åjƒ>üÂmôkÀç*å:ŠÆÊñæ{B?{l8VÉŽ7ô¼±‡\õø€R!hÜG›e«ÞÙ«þŒý\^Ði‘—vÀï#Æùª\ÉúùoÖ—þC«Ò¦~D®±Þäç¾)²üGþî|¶¹K_I7êŠ,£5¿ØyÿgÂÍy¿†óW²]G!àäLÄ`9Æ0ã²ÞÙÍ2}†Ø0.Ööľø]>=ðXÍB ‡¨éaàÁ8ʨoØ»äüÓùYÉgkîáǸëÔCÉŸc?ªÍ8[ÐÒÇ~ÑN•{(¶ÓßXÖ1Ø ðßø\Û·‹'ƒ¼¤ÛJ-žŽçl›wê/C‡nè·Àq®âK®#h¬o¾'ô³Ç6€c•ìJz–³¾$g?î3œŸµíd-[ vŠ~&“áꃵŽ3ÚLÉc:®ì AÀ›{àä9?ÈP`£_*\!àú -Î¥-˜IŸ|hí/¶×±ÞdüÚùùöE¶¥õwüÜw–õáëXô4Ž“ñùhVcÒ=X¿Ø™8{Ùÿâ›Öv7æÃ $ðpaÔ/ì]B¯¨G2šÏ–ü³Ï|=øéüLŒæÔkvÙV®‰¶[húà…€“;86S²uòK}£Ÿ+=?¸èâìXÖ1¡ãoÜ· ôZL²ÉŸ €ç†6÷ù¬6=Œú9[•-1iC~ܘÈeɉòÜ‚ÆË1çû!· ¶,g؆ÁŸ—Ô‚€7ôŒêÔ‡õs®­²’ÎÉØ)WŸIy¹kûésƒÏ'ÎLÑ—ä%Ø~/nãϰ-ÿhAoOþé&Í,}Zwe²_Çâ1ëïÆÔ×µqö! âaY¢¥w„Ûü39Ÿt~&Fsê±›l'ë^ë;`S³ 8ªˆ" UôÄc~ÜV;•µÐ¸ªK•žb tqv,ë˜ÎŽÐv#ß Œ¶{Øbï|T–û²!¿5¥1‘3à“òr Ôkg´™’Çt¨ûî¥U¥ .ç´8¤¿lj&]²/0Ù§öÏļ:÷[”âÔȶó:(ÎÞ±ö¹¬{ ½¥<‚Ò¸NV²W`›íÍØÎçhŽïãzsßÃhK!ðézá~ò¹Æ¨MÉ>äšJMW"|ÜæŸÉù¤ó31šS}Ød;Ysî—d€côØ÷*`çt%à¿’ÿhÜ@c;9tqÖ‡*€.ÎúûÁ²Žé쀌+õáb@áy¢­}ՕИ½”|4‡Ü7›ò[Q¹0œ÷(6Þ|/èçŽmXΨ Àæ_ _ø¶YžÎhØàó†:î³M€4'í+ªç>Ë{¸úLš¬ú`­ãŒ6Sòã˜JÍïH\! ¿(¼…Zîé&Í Ï´îŽÉ6µç˜|v„îh—Ç@»†Æ…ýg¯¬ì—½¿~Þ×pׄYìd\î³¼¤°Qœí-8jÌuœëÍ}[ó¸úF T÷àtÔlUײ ðàdJòaï6þLÎ%Ÿ‘ÑÜjö¡Ëz³Þ*+É]Œš?8²@»dçä5¾.Æ–¸Ævrà ú8üéPZ ¸?XÛ­ýJÅæ¨s®õŽ5JÍ—å‹Ù˜ß‚ÚXÈeɉrÞ‚ÆË1ç{A?wlÃrFm@­Ðb€ ‚@‹È¸`]+'•;ü˜§Æbsõy”+Û2Xk~'š/ëÔ†ÛGQû‹C5Þ{ç½Öæ»ùÒvóaÒMšYú´î%&¿Ô¦¸|Vû(46Ÿ%ßQ²ÿ<ÅÙ;V> F¯ ç§ãrŸq:ÄPÔîV9æ%Îõƾ—½¹Ø ªá’Ž’­“·âbl<<õaÚKø¸Í?“sIçgd4·’}ȳ®°ÖN°®£Ü£è‰ã@<økœ­qíäÀ=@ôqÞS€žB€mö¥b@çÜ#«ÉÏQ²Çy±3ó£iÃùd[É{—cÎ÷‚~îV6ƒaÀ›.r_6ÿÜg¹ÒS8SÒ•ìø3WŸGór]ÛOŸ!¬5ÎŒú¡ 9ãìoE­(Àf¿´é¯¡óq¤›t}¦u¯1ù¤6Åç³ê@I>ŠÆà¸,wº­äXóÜgïXìÓýŠ{Ö×8½£t}¸íP[†íîÁ‘ã^b]Ör”£ò±…Àýðõ‚3îa©”으'&ÆŽ(?LG·ùgr.éüŒlÉÍùd™Yã ¦ BJú’ì)دT8Y/ð…¿ÆÙ7ÐØNø¡©@ç½…@é?jâÍÿÔ_ÀÙ°,à¹òœ[²–¿c‹ ÛºMùÑôŒ›Å–rÞ‚ÆË1ç{A?w+ŠÁ°mZdÙô« ° Z ù0«ÎÙ–ààêóh^®ê`­qfJ~z•A~k¢((ü/ý-j¹§Å!;jÓš÷0ù§6Ág––;ýV4ŽŽq_qöÊÊž Þ­ldSÊת—óPœÏ=9rüu¬ëõáˆ|@õ=Ó—|Z±Æ âA:Jøñ¦ß‘sIçge4?µ~–™õ j:вqzŒë@^¸Fê˰_­àþˆ‡ëȸªK•{±ÐÁn´€>@PúŸ[yÃ_¢æ™›¯ÊXÎ~h+ìç€óÑöÊÆlʤgÎg±ŸóÝŠ9ßü¹c=dµ F løKò^ ç¤yòYå= .³ú<ÊK¨Ö™ßGLÉOåè;Øï–Ô ‚œ#ç ™’nÐõy^ó^&ßÔ–qô̰­CíGpñŽ¢4·[¬|¥ÀÞHí@\#ÆÙ”¨åÁ¨Ý-9zÜK¬õ:máȼ@óh× ÷à T7b[ãâaÚKøðM]"ç’ÎÏÊ–üàçÜ6ë öêgƒ±È ×I}ös…·GA,oOÜÀÅf]j¬lÜ‹-€v{ €B`o1€¶ÊÝ|U¹âìj¨Ú vŠÛ˜EïœO¶§¼· ñrÌù^ÐÏÛ°\Q»`´œnåWˆYËEu­v ÄeVŸGy©õÁZó; ¨kæ|ž Îóe¹’nÒõy^ó&ÿÔ–±Êc®mëÙžå5{ÕMcž/³èÄÞ±ø¾ P»²Ìo\{ALÄåó-)å°‡K¼õšláèܘ¥¨=ôP Œ*s6 ¦s`L2f°Ž»ÞÌoåèKØB€€?üCë þп»ÀrFcp\GM;>ñ`mv|c;rÜt~vFóÄ:e?ZOGÉFå­XξrÄub?…ý¸hùõÀ±¹¯v#pL²ÔYt¹o^htðcøZóõgØ>àM>oöY§@Í>oø¹Ïrž/Úè³ê{p>}Ö³|±5›ò#‰Íù—÷6æ|/ègŽmJ”ìøoÌs»†+]£hµYV“×[eõY”*P~áÌ”üŽ_ÃùÞ›÷Þ)|ÓM:çõÞÊ+µ ëñ.}µczõ5Ý^rìyžr´[,¶?¤¾Ü/ßÉþr”lký-ÔÆÛÃ%îõF~+·ÊµD±à‡àÖb€Û5Fm´àAë=oøKä¸éüìŒä‰õáµÂÚ9œ¾äS‹¥ºè;8O\+öSØ·ôËÂ[áØÜW;ûÖ(ù¥Î¢Ï}y™èàǬ®÷¼® Û¼¹çM>ëJ°-@!ÀE@Àó­µYÖ"lKöNçúŒÛ˜ïe4îUN”ïV4fŽ;ß ú™c–+б-6ÿ\ ÝS(\Œj[“×`°ú,Ê ¨Ö™ßI û ]ŠÅ:ÅÙÞ’Ö†ßÑ›oºI§ó¼Þ{˜â¥¶a=¦· ØŽí¹]£Çf _Ní••ÏÀ±¿ÊZ Vo¼’m ømñmq‰ë7ó[¸U®-ª…@€Ä´z ‚-;Õ»~€‡¬:Þð—ÈqÓùÙÉkÃ놳Cuìï(éXŽûÓ¡È׊ã(ìûˆB€mzP_îC¦¸YÀ:õ¹ZÃy]ö¼±ç >ä-`\!xÞºN^¢eçônLÆmÌ÷°%¦æ”cPΣØxt/ðgŽmFá"€NmØ·D­À™çÉm¶eœ¬b¤Î¥ÍŸEy™ØNöÓ»ëŒ3ãüT×£gí?䂼Zù¥4“ÛóšïeŠ›Úzlgï±ÁåÃí+ß; 7^ill{íG¹Ä¾ÞÈoå–ùöÐ,$Épa Å€þ.‹©”으$ âA«„œ7ü%rÜt~ ôäŠ5á5ÒõBŸåµ¾£dyœÁ‘…pv[ÐxË•tƒfr{^â§v#‡K~³¿Æ,1bÛòQ S{eå³áÛ}ËNaÛ–Ÿê1VËo—ø×ø½Ü:÷º ’.*w¸˜Àé{eLèñàÅC—7û5rìt~ ´r }¶‘µá¾“£íü[¨½Æ Ž*F~,v½°Æêc)=¶î@»ÑB¶ýŸ[ÛäóæŸ)Ù@¦sÇü{e¥LÍrØ0nc¾…=±®r’üAKÏp¼Åo¾ô󶲡N¯¸½»–=Çu…@)'‡ rî·à8`ùš—)P~áÌ8Èg@—X€¼Ç8‡û9Ò :éÙwSüÔîÈù©‰Á1kŒØ¶@^2>×XùX8J~|®Á¶=ö{¸Œq¹ÞGqüG.‚Z1°µ Py¯#løáË›ý9n:¿&j9»ur2]œÚôÀ~.æ- ô{á¸ç’ €Í.Fj¬lÜ ,€vGÀéyc_‚mÕ:7ÿ–ÌÙ80FÉò8¿ÿØ›ù({ãp>9–ä¯ôزÍb;ß úy[ÙP Õ9܆ÞÛ–Û•àÜ4O•«®‡°MÅ/÷ñ9¤—(³¶^úXgœçÇòjbLàô`$æV8.ÃrGºA§3=ûŽd#µ+9”ˆÜÀÔŸâ ÷KôÚµÈqæù€ENç‹Ý3¼'º²#ßš2Ö©Laÿš½ÚÅzŒËu>Š[翇¡ ¸Íh1Ð*\|×Vj:€1ðàå ‰7_¥œ1·.*càײkÁþ3p…@œãZéÆÄ?.Z¸8%؇Ï-8Ó² Yj¬lôÅ c[À눾ÂöÙv›ÿR!Àú5?ÈÜük2§‡\Q¹óa›Ô¹ØšùGÅ`8WôK°]/üySÝhlÝÈ×€}ÍOu'p¹¹¾³urâ¤Î¥ÍŸÃùªÀv²Ÿ^þXgœöcÈ{€Oöë,œ´ôŽÒÚ!Ú ì˜ô Êäö¼Þ·`k|žÈoÉÑÌIeŽ^»ȉa¹Ú++?ºgxOte'1Xïtû«êgDz£¸Ä¾\Û#¹eîG1TpÛ±§@_åJK0FÀþ9n:¿&\ΘsiMœœ©ù€ˆQ‰Ë©ìkþ!K•MñÅEm…×}…í³í<¾®¼¹WÔŽí!×¹s_å|Vب^ûé†ÌmÊG8*†¢s`9úü[ë›À^\ü—÷Óý—`»àÝw.2Þ¼×`ÿ’^ûæ¥gµëi;‡Y>‡òeÔ‡ŸkzßÎò¿ŽB¸8³UÜšؤÎrvÀŽIªéËg〭óáxº!só^Žˆp>9žÉ›aýüÝ——øŸóo¯¯Ãñ¹ JEÃù5[–ùpn|V;µQy Äa–Ï¡¼DõáçšÞwó|„ì3Á*Vá™Á¸˜6¥uª‡/â0lǤÕtžŸu·DÇ‘(é§sŠS ¥zlJd_™Ã"§sÅîÞ]Ù‘o®|kþ¬kÙör‰s¹ÎGsT®÷¢YÄdœ<ÀdµP0j8–Ž¡ô؈ð†¿DŽ›Î¯ ÎóuëÔtAËw„^?äÍ/L—a¿žB€íK8;–q¼Ø±4d©³èr_^Xxàs[áuD_aûlK9”6üÜG›õØè놟û,ç¹£ÍÀ®¤¯ŸVlݹy{ýÎ'Ç”œkD!°µ(±‘G-—½AÉŽe°á\4/•s_å%²|å%Ê\l§ëÁÏ5½ïØgå;ËGÈ~ó†.XbÍÏ º3÷ɧg‚ð¸Í¨ýd7å­ùÞ ·lÈݼ˜–MOŒÈ…œÏ%V~t¿ð~èÊNb°Þéz©ÅÖþÖ±à;ùûk}{r|$ÕB“rºú ôÍ€Â6ŠC±ƒmœyÓïȶéüÚà¼1ß%›÷ø÷‚x-7¿0]¼€ýP¨¼„Æ%[n¢~ˆU“CçÒK‹Û _ÿe gÃ>Ù6Ç?Ä~Ø@Î:•¥B€eÏm•9ûl_ò 9ßg‹Ù˜·Øãëà|r\Êù`läÑ›ËÖ¢Àé¹½æ¹Ó©Ê¡s² u.m|åÊÀv²Ÿ6¸×ôž Ô‡å£d?)&YÒW`[ÅÙñú8ðœYr’<û€äXÖp–1ì“mS{ { …˜»®Ë] µs~!Ó ™Û”÷°ÇWá|ç| þܯø´•3¼vGçÂ~ÝìsŸÛœ‡æät,cœ^ûAê\Úø Ê ”-ƒûMï» ä£q[,~ À>ê}—¿Ï䥹BîHÎÓ™Æ> GéѱÍtN±;¨ÙŽÄÙçjN—X8×XüäžÁ^èÊŽ|{t#¸%YïxÛëëy4½9=3ÅB &§²aëŠn»Brî»øLˆõÚ´À¯›¦×憹Öpv#þ[@|ò ^6.FÀ~üÀVØŸcsú^œb©Žå@_`€uêÃ÷Á²†³ŒuÊh!Àúð ´`x tMT®6JèKq¸è†ÆmÌ[lõs Ÿÿ§./c—÷#¸WØìcÃÏ2¶C./m;ÛÔì—Ï y‰õágÎlç| añÛQ%¿èëç&(=_8/Γå%xÜ#Xâš œ£d‹8—x)þ5ŸÑxœ€œÏ%V~R`?te'1Xït#hŒ=ã]l®¯áÑôäóˆ9Ì…À—§þôä!ËZ„½ûF d® `ÅÅ5½ê\Ÿ ¾ñù¡öÌD®%x®%œ]¯ïV8Gsâ—¦‹°pv=¨«ßCɱTÏrPz™q;ÐÿC€×‘e¬S\! ›yÕA¯2 ¾+€®‡k»>ÓŠ…¾Ý̘Íy->Œÿs_2½Pž±.‘ÜZ?.\1Àú€×9h›í{èõOÊ*‹Ý¼¹âgšÞ{ê£ò^¿¹.²d3üÔ—åAéÙ‚6òÒ\ì™äßcI8Ù˜Mz‰Qû |”’hÞ½üûŸ÷nÆéö0šG WðŸmÁk³7¯÷¾û—Og/u.m|éªÀv²Ÿ®ßoŠú°¼¶Ïg)&Y²ÀùF›ç Ï~¶ ½äDù2°W8—­,±dó¶…þ$Kãm äÛ3ÛÑ<Ùm–9?¹_x?ÄTcÝ(ˆÓЧc^ú××îèø¯^»\|Å|$É/B~0޾ºágÃzÐócBNÞ+ƒƒôU`Ëà~s÷]ÉGã:ØnñÛY°ûF›ó×çŠ{¶œ/ãlç3ʃ6nG¸cê§q7âü{crr>—XùÑýÂ{¡+»Z Ñ2‹m'{½Žæ2žÏë5¢ë— /üÈç'ÝtðCq Ãmö¹`Ø&h*s65yº{ßár+á|XVөܵo rqÿ™Ö'^6xá¸ûgW£äÇò’M‰š-biLôSg¥/½ä¸­Ø5Lg†í³mÊÁ€my3¯¨žýJ:^^ZŸa]OÌ8óÚ,>fóî±ex¬ó­ø¥ÿÜ{§{¥‚À¼ÉïÙø×à{@—:+Ûè×`Û€ï7œÙÎù@^ÂÙ,² •óçFŸ+úlANœ#ö ™Î4n/ã–`œËxiü”ü{ârr>—XùuêßÒ cõâ®Ï­˜Æóù¿VÜæBà#_òåË"»‡ãˆðF_ vîw4¾k+-]pd!€˜—C/µªsv%•ß ŒUìýÏÄJrèFc×lKc¢Ÿ:+}éeÇmÅ®a:3lŸmS½…àM=oîµÏö¬‡œ×kÑ#c ¯Ù± ¯ p›w¥×NáqFAÎ-Þ}çzƒòš‰‚ öû[7ü¾O€³É Êb7o®ø~ÓûŽí¹Ïñ¶µr)ð¼è>ΗåúLáç ÚÈIó°WxÌ?ÙÐܚ˸)¸­¸›aŸK,~R4ò^ˆ©Æ0ºÔ¿'|.¾þúÅeŸÏk¥´v¹øÒ¾%¸‡ã(X@G­øK?°¾1]1€³¶=ú`´€ŸâÆØC+®Ó·ìÝùÖÄ8àÑ…@Olm·hÙ!–ÆD?uVúÒKÛŠ]ÃtfØ>Û¦¸Àæ¿Tü·]dØØó_û±ò@׈û%™âb1м6I9ù™ <ÓcSãnEó?š¿áËÖ×ü÷æçî?ó¡×ß‹ZQà~¼§½?ç’A‘•)õa¹£©“"`’%}'ìÇ¾Ñæ9è3…Ÿ+ÜvyØ(œOÅÞlfŽ„s«áæØ‹ó¯Åäqälƒ¶²ò£û…‹¶SÖ•ô5J~­XÐ/þsîîºíeCrxS(­[.¾½ò? ‚… ~ìûß˰Ì Ûj1` —iéÁs~¨éÃÍáâIï8ή埖ݑð˜,jöÐA_³ezm8®ÊSgiç¾yñiŸ)®á,g=3R ˆs© à¾êц<àu@›qrö¯¡>¼.+;³-} k”‘ù g ‚-›ÿ€ï‡lŸWýl J÷\Pò)ÅU9XôOP0.×ÀÙœK‰ÅÖlböÀy0.&ÛÈœt¾=¨_- çs‰•ßÎBÀéjÔ|zuËØt¿»kº…%6ý¦Q[¯\”þC±-`A+-€Ú9ܸL ÐØ#¾G22vɶÇdœ#ÀxÁ£ 'Kq¶L¯‹©ò øÂ‘>S\ÃYÎzÆ\ °-h»‚í’œu¼h3°cJz–«.àunóZúx¬“Ç£÷ˆÂ¶IpÕ¯Á¶î7¾çØ®ÖÚw,~; öQ¿èóZÏä¤y‚‹]®ì³qcö} ósºj_òçølƒ6Ë‹ŸÜ+\0ÕFç豯¥ý,›ïwÌÃ]ïJã¿I´Öéæ…@à¿ð…@°¶[ûn\¦ÇôƼ[Æ/ùôÄk/ÈÕÁ/~q¶âŒ-;ÄRœ-héA)¦Êƒâ GúLq g9tÊ–B›îCðF}.´ÀYa›#qx]€Û¼5Ý(<Þ#ù[þüúº¼Í¸û$`›$¸ê×Xìæ ßozß)+i·XliS4õ“¾ø8_–óóDŸ+ÜvyØ(<¦Ž‚Áq7Æ^r\3Ï`×èlëüaŸ+?ºW‚[üXP¯]àìJ²,Ÿïw¾ïݽÐb‰'ã¼iô¬Ï] `Ï7úãDn\¦Ç&@¼^û#Ù3nͯ¥Û:æV0¦ƒ_(üòlÅ)zmÎ6héŽÇ>*Š/j+Å5œåÐ)[ lüU93Z@Ç6µ)Ù†k‚uIŠÉ¾²qwº- Þ^~þ]¯íI›÷Þy7curŸ”ˆû¥Åb;oJø~SØžû|î%ÛÓfàyѶÎ7Ú<~žÔž+.ÏÀÙÇÍr³Ya8£ñnIÏÌ•Yåfô Û¨=ÇjÇmeåG÷Ë-~,¨Ç†Qûæøó=ÏL>Ó½Ñb‰cÆxÓè]—›è£àBàǾÿÝ úµB`Ò_|—éÑsnßš½cµü·ênòuð …_ž­8(œÒcDZgÔtJ)¦Êƒâˆڊ®!ËXÇp …€Yg6ü*cØW‹F×¢ÔW ‡MÉ6丯°6I1Ù6í*ßbžÜÒÆ_Ñûàþà~•í¼!áûMaŸ+ŠÛbñ¡ÐE–l:€­ó6Ï¡õL.×ÀÙ<^îË…mø=šœ‹™¯c•¿ÑЩ û²®ÔV?¹Wz,¨¦-} öéŠ?ßóÊä›ÚûM¤µÌÍ ÈjÅ@© ¸È&ŸÞb WWjß‚ˆÄ­5ý­çèÀ¼üRá—gogÇôØí’oI^‚㱯ʃ⋆ڊ®!ËXÇì-°Ùwò@ýW]/>+%½³ßWŒÛ°³ìHxÜ×ÌÿëïXo"^#îa’ðª_ƒmÜo|Ï9»’œc×Xìit‘%›ØGý¢Ïsh=S—'¸ØÐ†Ìä pNÏJÎÓ̹ÆjŽF§g¥d[bñ“{åˆ ªùµà¸­Y?ßï%¦©MôÄ~ÓpëPãi RApéO~­*ÉÕq¿sGÆí‰UÒ•Ã(ÈÙÁ/~yöÆqv ¥g4fÉ—mz€½ú¡Ÿ:+½}ÁH_Ñ5dë-@©p›ý ¤[ùŠ‹€×Š×†ÏN§íR?àû ¸ºÊŽ‚Ç=ŠŸýÓ~=ïMZè«{øÜÿPû1ŸøÞ`Ô. Wí‹í¼ ÁýÆ÷Û± òš¾ÄbG ©ŸôÀ~êËr}žð3…Û.OûÉs0sîeY‡‚ m†íøìXùѽ²÷Ç‚jö½ŒÄÈvóý^cŠ—Ú‰½ù½Vx Z„í] È{‹zW 0<ÆQYI®²’ï"Ö‘ñ‚ÞxÎîè\zÁ:8ø¥Â/ÏÞ8Î.héYò‰p\öE?uVzû‚‘¾¢kÈ2Ö1¥B¸»ÛðN·øÌqP p\^'^×VY)†úãžÂº$Åd#uîï%â=’Ÿý®Ëƒÿò?ºS\¿YÂE|PpA çZ ,rÚü× í«¬Ç„ðš$åä7oêu£¯ ÆÉ?ûòKçú›u!÷é…R‚ýï®?îwŸð·.Ï•XlæuÐñàvM¶…cOý”W°…Ÿú²œŸ%úL ™Úu_ÎÍe ˜ÿ²¢ã³ƒ}™-?ĨÝVj±x¬¥=ßóŽ‹MòŸ¯EîKÜ7‘iži:pkòBà§¾÷r‘@­pß"®àvšM¯ÅÙÐ9[í3jǺ’ìV OE_.¥¶Æ©ý%߈޳5fP‹©ðË„dÚgŠë7Ë¡SôÛ€€‹9ëÙÇqt!àl=€ë5IÊ‹ï7þóÑüÿ®OZù^ҜĚ;œíQÔî¾Gðm@éÇ‚äÎ,ºyt»qzb…M ë'×ωl?õe9?Gܳ$pùgR@ˤóñj¬bÓ|ÅÖy€e.ÒFßµ•ÅO>«îÛôÙwCl!c{ÈØ2ëkvAÖÏ÷üú¾Ÿï™Ò5H…À›Z Lsº|vaÓ3÷¥€C ÷v¨½¶Qh1ÀmÞü3Ыú§DM€x½ö[)Åwc÷æ2’óˆíÈl-àØç­p\×}èôÌØ‡˜ôõe\\¿Y®öÙÎm6öض|— .^ Fmzu tX ¬GR¬|K°_#>a‹"à7þL_>ÏHšÌÂZž®=Ý«5âz8ÔÎ]Ûîž×kÜâ7Žâ⇬—•_eýK°ó6çÏÏ]WàòÖ~Î;,2é}ÌÖã%ÙƒØ3ž`k3ì§ôþXPNmJ}•CÇçÙ†ž;h_úÉέÿZLó™>/%Fæl }oAcq|ÀÅ€Ê[ëø 8¦¦czbí¥¿¤oåÔŠëµïy8ôÃ/ÑV}Ùªý§7&ûµ€=û¥ÎÒÎ}÷“¾R\¿Y] ügMn3_ö=~Ç[KîC_²a=9ÖBï…í¶2'l_û ¥‰,¬åéš ¬w¤ ¶ûâç®o½Â÷»ûñ·ÒW8;€uÐëìÐX:N‹ì3¯OÏú3lÃ~*çüõ9¢Ï—#s±»äмCVc²ñqG¸Œ›ú`ë<7Ã:×fØÙòcAªcØŽmŸÚµS;Ü;é ¦~²3dÝ\¼IÅÀ4ésRbt®Õ߈`·„ Þø£¯rW@ÎgPš““3°©ÅÙËH½r°5ç£çñJèK†_¢=q WÛQzb²M ç«ç u–v˜ô•âúÍrèZ¸M| ø´|ÙNáµÀZé:©œíUB޵¸#c†ík.Ò$ÖòtÍ+°­Cm±V¸¦=,Ÿ…ä³¥è%%u%ãë8•G{„ÅoãúsÛù²ŒŸ!úAßåÈÀ>9\ÚsÞ!«1Ùø¸[ÀøSIv'¶ÌcÉSÚ¬wmfñ“ûdëõ{¥fçüªöó½¿ÜGfÍÁâóÓ.ŸÇ–yV4H_²Œ³WÔ–ý!ÇFŸ7ü\0¡sÅ,×ñ0¦“ìÇçšÏzâÕÆmùïÉw¯‚98ô%Ã/ÒÞ8j·Åñ[pœ°ãs:K;÷åÆ}Șêú‰îåýµÿ»ï¼·ÀrÝÈ×€}ÍOuð:ÈYïd®Ö➌Œ¶¯•4ÌZ–®o'ìçü£¿up¿3G}+ g{wmÕFû°øÉ5àõ+Ávðcÿ8sþü q븳w Úd²óñ÷pÉ%õïÀè<Ã:µå>d%Žü6 Çp±œLu îûå2kÍ,~oH!0åù|8¶Î±ú@€Ålál5ú,çM>Î,W ¯:÷™šmÍo„ˆÓ«e[ÒŒQb¯?@.}Éð‹´'ŽÚlÁÅcÙQ .ÇO¥ûòã>dLuýHD! ®(àÍ{–½ÓÁëÍ@®6,‡¬Ô°÷fdläÊü’o¹¾>ÏFJ>³–¥k;HÉ?úµ5 ôÞg9÷÷~+n*‹Úµ®+P_Ûbñ\µq¾Ñæüuum]~ÌÅî’käÜCÞÃdëÇØ òšrK²22Î °Îµöcz~,}§Û bqÌÞØ‹Ï|ï¬î!³ÎÌâ;¯½˜rOó(°gn‡ý²0tÎVû*×M>ËJ°-pÅ€ŽÇý’¼×o„‘aÛ²/éÈ58"æáÐ ¿H{â¨M £„ó/áüØÕìõÆ}Șêú‘\é) Ð×M¼£e«:Øóòú ¾ÊÑv²hcÁÈøaûÚH‰/¬åéÚRò¾®ßë Û í~4è½Oî[ótƒ­`]ïue?×"ûÌë3ºþlÃ~5¹[cÆåÈ\ì.¹"ï0ùøqŽ9Ny&ÙÁŒÌ¶K>F§mfñ“û¤÷Ç‚Jº½ŒÄf›|žŸ;Ë=dÖXYb¼…À”÷ôypìW±à—m öq1´Ï„¼´¹ç ¶@¿x,[ekßÙõ°Å·Ç§¤«ÆÞX˜‡C_4ü"퉣6Œ³w°=ûA®@ï¨ÙAVŠá`ÚWªëGòG5;•Ö׋קÔîõÃ:Üä7’û/ï~bÕç?7ú ¤¤Öòtm`_õ¾® ßë ÛÄY‹ÄÚ[€t£eX¦×Tõ±ý«óú¤®ä%TÏ~¬cYi—+c}°‰3™“Ÿëh.ù¦þôÌc3ªwm–•¸×9ó=~¯Tì®úôÜqkëX|©xÅÀ”ïô9p1Ÿæõ‰p¨ }:·±ç ¿6ìãŠ˵§«Ù—Øâ„_¯Úôú°'òq苆_¤=qj:ÇS؆Ï%ØW^í¸˜ö•êú‘¼‡RAô%–Á&ÀzñÚhŸåÎu8X‹{qg§8¿Š€Ñbà—þËÓËáÿü«¦óQ¤¤Öòt}(ùF_׆ïs6°‹3Š€¥?ŸµH7L†e[Ñœ]\•aül·øÉúóú9Ô~ìçÒš£à<µÈ;fòóãÝŠuîI¶“ž9ð˜€ujË}È÷þ± Ä ¢¥øEÙ|Ï/÷Y[Ç2Î+.¦\SÞŽšËîB Ñ>PÛ1ì£{Þø§cŸ ôÍ·%]ÍÇ1jZù1j·uÌ{çâà ^¤xÄq¨ ç¯8?Û«IèËûéËë§kÈ:¶ï… .z ‚’2è±^X uΗžáûê–¸qGÇ{-JüôŸ›^£¼|j›H‰fÖ²t)ùGŸ×#àû\ ì´8Q H7K†Û,ùrίc3Îf‘ ®¿Ú8ßh—Ö}èÎËq±»äy#÷oaòõcÞÌcšK’m¤5è—±ŒNÛÌâ'÷É=,Hã8œ=ËX·ºwÌš–XâJ!”Æ{&¦S¾ŽœÃ®B q2 2¶c ÿ¹ï¼¾‰ÜfŸeªƒžûŒŸ)ÙŒø÷Ø•ñg»½ã¶Ø99øE£/Ó‘8GÁãèø½°/bAæÚ@^܇L_ÆÕõ#£?7]£T(nÓ¯rô¡Ãa-¸Y³øÌÿêÄÿòð £8ûaß[ <‚”df-K×xöUÿèóZ¸—jƒvœ9n–í³¼ŒÃ9+—ÇRœ>ËæõI-q /¡zöcʱžXK–ÇYóS`Ÿ.mÞÌɆf„Éß{/.sJý ”怸Œê]›e%îñcAìøyÌÏe¶×8`Ñã¾1kYcñ……À”ßtÏ;ŽÎs!€E.ÉYW²ÐG! ãM=oüب-ËÜØJÍ®£w rÎÆÛŸ­ŒŽ¹8øE£/ÓRœR[m°íí5Nê‡Xs? Ö}yxq2÷R.®é°ÛB©(Ð?ËІœ×mFí ã>ËGàµ: 7N õá8s1ÀÀg¿øû§—ÈR‚™µìrŸöÀ¾ê}^›÷²ƒmØGדI7Í 'cÔßÁc9…¾RÒeù¼>i %ä%TÏ~¬c™®¯®màrj "oäž‚îbŠáÇ¿'ëù%Y'¥ü9P½k³Lù± ’®‡ìSøñÒ.³²5ëØbò›ï—WT LyM÷ºº[佫(ÉÊØŽa-Þð×(ù@æÆfZ6¥8½ñØ*5] qt5›#¹+ú²Ñw-N£eÏ2µmáü ƒœûI°î_=¼.}Èô…\]?Ò\@©m ~¸ë·®(ÀæŸ .¬¯£:öÝ Ïÿ("î/þ®ËCzŽnQ€ÿèx®)Á…µürŸöÀ¾ê}^ÜÇØÀŽÏ¼ž¥ß `Jr…ã0<žÚ9_ÈT§r°èeýyí§‡ûǹ´æèC\Ž@m³½Ü;)è.¦~üG±žo’5ps€l‰ct¥>dYN÷Hp ZüÒ;B ‚Ò{°ÜÅa² -Vþo@!pË|7‘“¡*c;6î[À›{GÉženlÐÒjSóÁ˜Œ³5;Ö±ÞÉnMïXœÛ§¨¯/¼HñBªÅá—V õW`£>ÜA}§D2Z÷¯^—>dLsýHw¥íih³Î­ö½à+ç+ùwÿò…èóZ…ŽùH~ÃOùuØKšèÂZ¾¾Wk°ŸúG[דïs6°C»t]p_¥Æ%¹ƒcKmœdsß±ø ¬½Ó_üæMÉ€®±®µË¹Ø]rñt{™âøÍeÞ©_çFc¶ú%z¾ à¬ë¾ÌÞ¢`Ñ™µëaòïS¥±Å”OÊíÎ÷ûp! N@=—=6ÿ®à>oþ¶a[ÈÝØ ¥`£ñÐg ë…ýZþ°eŸ{Ò3&çw«B@m[°ÆØÓÙ#N‰d´î_=¼.}ȘæúÍç[áŠZhtÍjë¦?cZÚôÝü^§£àø·àÿ7ÓKàѤÉfÖ²õ}Ú‚}Õ?úº¦|Ÿ+°]œK×÷VjiéÇ:£~¥~‰l3¯Ohñƒ¼„êÙu*çõÕu\ŽÌÅî’kä  ;‚)–ÏãÀü§5H2óg[ ±\›eÊ=~,ˆ}8†R+ X¬âšua‰cŠ€ã=S.)¯Üç› '¡èó¹Dèk…€“c“ϰŽm wc5ƒ8гAãŒÄŸgⲩO >£Í¾µ>dY.÷È-,ÈÙj,‡¥‚ Ðõe‰cŠõ2{3åòyÐý=TDRN΄ @ŸÏ5†‹8–ƒèc£¯~èø Jc;¹Òг³gŒ[ä2BiläŽ*T?‚úr¼-±KöˆÕƒ>´¸Ïr¦¹~ó¹Ýh§ ¬ô=¸íi:.ú*_ô²Ñomü^Ÿ£q㽉¤ÉfÖ²ë{µìKþÑ×õäûœQ›8×® >“qo·hÙ…~O! òÙ~Y¿ËúóÚ)N?ö3¯•®±®uàrÎsºo{èŽdŠéóyF°.ÓÚ$]Ö«O«_¢÷Û´YWÂÅa ßÂÑÁâo õf÷b?åòÀ{»»ˆ¤œ\ ;€>Ÿk„ oòqvrî®à>Ëݸ*SàË1¸½«'öQãïÁå€ù€GÎãÆ®Ù"VúÐâ>dJsýæó(n>‚+-xœÚÆd³¯ðšÜ7ökàßù¯¿›q:Gšlf-[ß«5`_ò>¯'ßã l`gwMÜg1 ›”ìBE@LŒ ´ÙOa}žsíKº‹ß¼Á Ð5Öµvù1»K®1€îh¦¸>§gkäP»V_¹ÅõØoG‹)@Ö›y܃iì”ǃïé®B‹ét la¯ça£þ8³œu* xÃÏ}•ë¸ÜgÔ}•¡½•RŒVì#Æ>Í#ú%ô…£/ñVÖ÷PòcyÉÆÑ²…^q:}hq2¥¹~óY¾ÅQ+ JìÝø^‹{àrxSøœëzCÇz½Wk°ŸúG[דïq6°‹séz ÐÔ{:}‹”ô!w…€ƒ}p.[%ëæõé]{§c?Ö«œ×W×9p92»ëûù‡îL±}^Ïr_Ö¬ ×6Ëßy¹¸²1~ªSj:€{ß#ð}îXìLÀd3§[2™Æ‚{¹»prGØôù\~º¹W9tÜg9€+t\î—äè—b¨¬—šo-æž1oç‚Üxáàeƒ—8^äSa}%Ž7»e‡XŠÓéC‹ûéK¹¹~óYþ^pAÀE6ýGmþ¯Ã½py<Š?ñîgYù^ÒD3kÙåmû’ôu=ùg ‡ ÷ý1´R!À¤æN2.¸€^ûì¯6г½¬_ßú;û±žeºÆnm5?Fm³ý|߀,3Ÿ£˜âûüž•e­¤ÍúVŸáûäˆ r~ lîÍ{ï´?“|¾7L²ÞÌí–Lc¦ñŸàn‘˜“—{€>Ÿ[„oêys9ëJÀ…ÇãCV’»6S’×(jcmï– §úÒÑU+ë[Ôì9^oì^‡Ó]?´.}Èô¥\Z?ÖÁÿ‡Û<Goþ˜ë=pãð—ÿ§——ÙüÏÖ/¶-¼ÿ™c®ñ/ýÖËó2M4Ãz½OkÀ¾ä}]K¾ÇµA?~†B€Û Z¤è •E¿§p¾ ìJ°Ýeý.ëÏkÇ”tðc•éëZsþŽ‹ç9Ý7ú[2ás|F°VŒê[}åˆ r2û?ŠZA0õçûÂL¶1s¼ÓXiÜ'¹w«…@$æä5 Ïçaç6ô*‡Ne€ý-ŒÇcsŸQyÉ.¨Åq´ìKº‘1î æäЗŽn¬ZqX_£fÏñg zlŽ×býÀšÚLÈõ¥\Z?ÖÁV ؽ ðœoEŒó×ÓúE ÿ‰_wÑÿµÿ…·=‚(g³…4ÑÌZv}¯–€}É?úXKÀ÷8£6qÖ"ÀQÒ¹o Ò‡xûÑî)ÐoÁö%tÝ s”t¿é² ðúê:.æbw¹OpßèoÉ4†ÏñA¾X3Í¿§¿øÍk<òcAµv/ð¹úí2Árï™Í?“mÌüŽf'I÷ì½Æ.1_žÚéA DrN^“‚¯ž[°¿ÛÔóf:•AÎ>qvß è¹„ê9F‰–ôØ9›Þø·&ò/¼ptcÕŠÍú5[ œ-héÆd’ÁºO/k´™ó‹™×N×Om]ã­Ô~Äâàá_z <÷#qcÕøñ_{Éï¯þ}ë\£h(½h!pT1&›YË®ïUlÙWý£Ïë©÷8€ŽíÐf°éwÅ+j÷4^]P"üzaŸUŒeýúÖÞéÖ~S•×ÖhÎÌÚNsîelÚÝŠiŸë3±¬‘´Õ¦Ô‡àûdË©Í(ˆy/JE¾–{Ïlþ•lgævSü4Ö“Ý«S!ðÁ§vz‘ Êz?€>Ÿk°ï/üAc醛ü’œý¸¯¸|@Ißò zbo‰Óëw4—é±aôÅ£›«R,§/Ѳ㸌³ j:Fã)Éhݧ6ÚLÈùÅÌk§ë§¶ lØv,ôAßBç~n,åg~c;ÇŸþ‡'.~ò‹Ú~éb/íÞÿ»ï|liÑO¶ÇÒd3kÙõ½ê€-û²´u=õÐ;Ü¿ì£pôÜw1zhùÅg¾¶ÍíeýÚk_“«oœKë>t çÊXÛ.¹ƒÜ§MÐ-™Æòù> X+Fõ­¾ÒócA*{ .潨}SxÃ_"Û™¹Á;ó„÷h.¾â >’ÚéA@›î¾ ËÙΛ8G!+ÐÍ>pº’Ë5GÉnÄ¿£'ŽÚôøìy)Ζú1úâÁF/'œÞ{§°QœmPÓ1OIFë>½°ÑfØ6àµÓõƒžíYϨͶlžFÙø3nîGáÆcVû_?µù›þ†àÁý—&{%ï…ã¸ÑÖµÔ{¨ ÷ï 6ÿèÕ'>û-VöËú]Ö릔t¿)˯¯[k‡Ë99^Ú.‚i¼KžÏò‹3púZñ›×wë1°Åź7µb@7ý%²­™ß¦˜)þ“Þ›¹øÂ|~j§mdxs3ü5N+¦Ú®à ½¢zø8_È8Gͦǟqö#1ØvtìKqv-ØOã1xÙà…£›+ œÞÑkã(Ù:¹Cã)Éhݧ6Ú Û͵›Ï ÛÀ.Ð\ö¢›ŸÑøºÑß²ñt¾·ÀÛÅ@ðãÿóK[ÿ—ß¿òw¿›aÙ£H“ͬe×÷©ƒmKþÑ×õä{œQ›¥MðjÛò Tζñ¹h‘ídÝ SJòàâ7]C–^_]çÈuj_î- ¿'Ó˜iže¤­6¥>|F·üXËèzpþÏ„nøKd[3¿­LñRì'¾/s!ð‘/¹üŽ@$É›QŸa9Û1Î6p…àM=£:¶gäç¢Ôô=þ ûŒúoõðSœí(‡ã—þ31¼ttƒUŠãôJKSÛJo<€XŠÓé ›û)͵›Ï ÛÀ.5¦óü `û½¸ÍÏ{ÿÖç¬úY¶ñ_ùKèâ´|Yg†mðùc²|^›žµ¯É/~S•×Öx”ä|i?A!Lã¦õx2°NŒ³)õÙŒüX¶ÈµSœÏ³ÁþÙÖÌq S¬÷‰ïÇ\|éÓ_ Š$yS³…ˆÁ°œíÕE›ÿR!°±ç ¾ö!cäÍÔt ÇÆÑ3¾£×ízì÷àbó¸÷*`çt la_òë4f ~a£Í¨}Ð\»ṵ̀ ìRc:Ëýö¢lüÜü3:Ï#q㺱ƒLa¹Ú?3iò˽r‘]îѰe_ö¶®/ßß ô½Œ¬sëúŒÆ*ÅQØF?ƒ—õk¯}M®¾*ãõݺÖAr¼´Sð,…@0rz–u¢¶æØÓ_üæõÕ€íÔOc°\m¶aœí½)岺ÌÆ_™|®ç8ÊÕØÆæÈ…À·ÿ©oÉIê¦f ‡a9ÛÕä!«¿ðm³n>Øà×6ü%Žj:Ðc0Þ´bò¸·¤4ç²µ€P½RÓ)}g£²³¿°ÑfB®/ææÚÍçÀýéPØ¥F&·Íƒ1ŽâV›Fç¹Ï›<ÞÄ9Y}É–å{ùãŸõI+ï%-ÄrŸ\dÓýYƒíØWåºÎ|3lskp J׈e{@<މÏÞe /kucJòàâ7ÎIx}ÝZ÷> ’ã¥ýd…@0Ÿòz–u’¶Ú”úðX_÷M@ qœ®$‡®×2¶yœ“½Ìæ_á8[à±÷ƺ5¹ˆÿG ÕMÍ"Ãr¶ƒ¬$ç@‹(¸pÚsŸm98¹RóWœmÖÕ€û?ŠÚøœãQ…딚Ρ1Õ4à¸%`Ç/l´™l;¯ h®Ý|ö±žãÓmüxó¦zí«\õÚw¶€mîî¿´ WòØ–ýUÎëðý g›¥=°6µõ,ÉJö5ØžýùÌ6€eµucjò‹ßü9yPZcÐû,HΗöYÁ)ήÔg?pÔ±Žm¸ílØôØÞ×Ý Ábk À±Fá±÷ĹK! š­`ËÙ®$¡)XÆ}Þð—ä_eŽÁ8[½ž{è‰kzr€MpëB $¯¡15Æ–˜ÇmÁ/m´™ë˹¹vó9è)‚Ü71Ÿß"žnÔÜÆ 2Fålï|XÎvÕPû-ÔâàþK‹r%ïmÙ_åXsÀ÷7€œmòYòwó)ÉJs/Éçײ×>dh3°k­ëUÖ~óg\亾¼Æ=$ßž .`óH¦R^dY#jk^ÚWÙÊo^Û‘ b +á|g¹\®õ:ÛÝ w(ÙÎÁãz-xì­1îÍà í+¡çÀØøs²@7û½…€öK”ü[8¿ÞêwozÆFŽàµ[âŽÛ‚_Úh3!ç—sÏÚ9Øv©±»4&°}&t~[‰X¥ ·¶c½ö¶‡ ·k¶ŠÚ;þöÿgŸ’euL²t4P»’ô±îÞß:¶[Úfܺô®Uàb¶èÉ@‡q˜cmZkïd`í·Žt}y]AQ[ð¬…@0å‘r{ËI[mj2øeÙ¼¶­ â¾êz€ÂúÈår­¯c0ãàZ£]#Û˜B ˜üý×c{»gã!…·K„M©È}ÙøsŸåJ©б¹¯°ó¯Qóë‰32ÖÑô޹[NÖƒÆEnoãµà—6¿ÄYÎ/çžµSXÏv©± >Lš”ÅÙÞšÒZ»9Ž’ãÏ1´uƒÆrôU®zg FìÙVqöGæêþp÷©Âvì«r^û@ïo} ] ·6¥õÂZ–ôŽÛ<.â]Ö6óº1%ypñ›73$¼¾­µNÊ+œ]ðÌ…@0å’ò»3XÅÙ•úìŽü± à¯Äu¹o|çôz«LÉú…Æñy^E! E@Ö™M¿Êû¡à" б¹ÏrÖ¡]²WÔWýzâôŽu4#ãbn¼pøÅsµ!3qT=÷{á¸ÜG›mG@œ^ðræ8:~9÷¬Âz¶KõiRV¦¨ÍQ¸5Y?Ï%póq·QƒœíXÞc¯º–=ËK8û=¤…¹º?Ü}ª°ûª\×]ïo\_œµ½‡Öš©®fïä#±•Úºñú© ¬ýæ‰È^ßÞuM†+œ>ŸÏBàŠc£írQ÷W~óºöþXЕÿ¬ÛÃk~V‡q1€³…¯qŒYt‹Kl¯fî^°¬FØØð;yÀ¾®0®Ë¥$çs ¶kÅ,ñÿgï?À­éÊú~œ—Þ‘¢ˆØPÔØ»QbbÍ/ – SŒùÿ~Kì¼çð‚ñŠ5j¬1ö^bï¨DTÄ¢¢;*Jç}ÿsÏìïÌw¾û{¯µföìsöyÞçz®Ï5kÝm­Y³f澟}ÎÙ­cmÉÒ1qn¼tøå£ ™‹“éÐ_|á¯ý5pŒVðræ—8:~A·¬Âz¶é:#lïèNp¤¤wº%¸uuô¶r¾zžKécV’72µá6£z¶ãvͰ-ãìTV{¯[˜=y µcÖEëtãã¸×Þè|õ?4ÞRjëÆz•¹ß.‘¹®/¯k CÓ\ô}J¸NaNÝ/ˆ~¼Ý5@ßÍ¡&ƒ_/Û]ÛcÿXP>Þî]‚9-ÅÅ\Cv­UW³_ZLñ¼þÔ9j!àä,+û¬È’}'Ø7È>À‘ç€>£v¬s¨Mɧ4fËX[²f<ÌÓ—¿|ö2ÇéÐ^ Çuýl_Bm;ÁÔ¦—6Ú ì˜–µ¥_ºÎd5bþgÛ‚®k+½¯œo ]EíKÉ`´Ók¿Õ^õ5{n+lËvNîÀþëgO^CíØŸuÑÖµ×ýkŒ£¶û~rÞî|KkPÒµrH øÖÖ :î+s?ëúêºnÁ)Á0¯nÍ.¬Æä¶Úe2øôýÝu]òcANw(c¼Ý»$ÛoJG)éwg›ùö²Æb`ŠáõW“)ØÏÑR™næk>a<#P]É6pöKâ³¼ä·5kÇÂ<xéðËG“2‡ul³ŽË}µl_BíK¾üÒæ—8Ë•–µ­1(`¿ll¦;±"ÎgKøü×D©%’ÑlÃÔìÕ×éÕ†q¶ Û²Êì·7j¨]æ}^{Þ×|}q¬‘w&síkýgïdX^{^·I?—1“ß.!àõm]ã%tA÷ú§È0·nÝŽH?Æî ¬mÒŸùí®míÇ‚\ý-ècusaf㘽§¸¸ÀÙg¸ë›¡~.F߯“ß¾î*q¡…€ö[¹ås‡w |–ô;ÙÌÏ|Êxžµ©ù-µœ¾æ³%‡Œ…ósàÅÃ/ $dH \MØx¼¥hÇú ¶c_ȹíà—6ÚLÈõݲv`ÉŸn%º,¶¼>Kàc¬îÀ]ÛJ±úvR L¶ó9^E6/,“ÕP8:4éGâ¯ý™Ï®Ðb€Çw8›’ïR{FmZ|¶àÐqp~¼xø¤‰ª‹Ã‰µƒ~‰’¿Â:Ø*üpä‡%Ëõݲv`‹B€a;¥;Ñ£œüx}JÀ>CÏÿÔ’DÕ£¿Æ‡ûh³^mÐg¹ê¸¯òVýÒý¨ û².Úº_ùºòõÅQÛ}?™{ gïâ,‰ÛbË6n¼ ¶nÐq_™ûí’‘ëúêºÝ͸w?B7ÈÉ2Ìo:ß-écÓúCæÆ,ÉàÓ÷w×5Š€–B`ϧ[ Çêã힘×$ïìØÎ‘Yòu×v)..³7šãUæÂ4h)Qp1°¤ `ٞ톅@&/Ù®«ÅçP¶çðŸ ðâá&ª.ŽêÖÂ1ŒåÌ=Û Íò8âÆG¦·Ý3(­ÖGq6]c„mÝ<¶Wº“Žbq±& |[Ñ5zžs-HÖ4s6ÚW;&óazõaÆÙªŒQ=®Y·€=°ãkš¡vðÕÑÖëÃו¯/ŽÚ®¡çÕ‚³_â_ÂÅÕñjë÷•¹ŸOlxmë»sëÖÒ rÒ sœŸ÷ôqw×}`mÙÌow][,HA쥨ÿØß=+t¿éÞÌ`ŸŒ{w]ÁÁðÚ\u*Üâ”p1J„’ÿÖb ¨Hþ—%½Óeöµq¶]â·†­âGpÙ…Ç(á|ƒLϾŽÌ2<ÐøÇô¶»sF»´nXÅÙt¶uóÈ`?FmtìCáóWx¬ÎWáD“5ÅÙ8ãôÜg¹êYçì w¶™}®[·P3=_W‡³aÖG[¯ïm\_ng”Î àÜm‹ÿZZÆãyamxí±f“nê;&¿!Ë@m}»‡TÊ· ðdæ7œûôñèº@–ãäê×÷w×vÉq¬58ß^ÖÍ`¬AÞÙ,„ý³8{úñºÍ¯å!è]‹«Ns!à#öîXþ (øˆ¶£µàbÀÍ ”ôª[b[#ìÓoÁ!±y~JéËÄðÒ$ÍÅd] õk¡Gû­ÔüðPÓÖíÒºa}ÈÔ¦kŒ°½›G ö×Ñ×±[pçª:–«Fæ«r$jœ°9œÍZ¶aÛ³·™Ì6³pÝºÅØ“—p6“ïîe-rÀך¯/Ž Ÿ—;ŸšLu%–ØŠ[¬tÜWæ~Óš³\×7[ãîáÕãt[Ñ ~r óÎýPúX´þ¹1J2øôýÝu­ýXk£¿„Ìo”wó òÎn%¥8£|¼Vóq·€÷3·éæs a >áìÇ@§GÖ—€ ’}rÖÃOáb`”QòßZ”tëkqj±ø,õkåù0uûý›r«Bò–ydd¾™| YL–1x¨éƒ„ëƒviݰv ËYßuF ä~.5²ÑÇx|EÏMq¶, xœJþª H–C¶a;í+™Û0lßâ³Ä×­[ˆ=y µa_ÖE[ט¯5__µíÐóc¹ÊT~ˆÍVÔÖ :î+s¿áú©œ×@‡ëÒ=¸Æ#Ú[‘Í·×™äë¢æ1œ÷¡ô±vç‰>°¶‰læ·»®K~,Hu-ÔìGýî=‚yMòÎnÃÅ™éf×lº†Ç`£›ÃîÜy-®ÆB‹[ÉM ìÃ1ê B‡D_Nm³Æ’B “3lS²/ÃÀŽqvLæãäŠÆÊP¿÷¿ëp“¸"@á—¿„4 sã´âæÊ2ÕAÏýJñX¯r€‡š>è@è°>h—Ö k¸_†.è#s¹ŸK ö×ÑÏæ çSÂù±,ƒÇv”ìU"!5½Úi2Ö© ·•ÌÇ‘Ù:¿nzæ²ùugœž}Ym]_¾Ö¸¶ÜFíVjç©2gsÙðº¡1÷óÏc]_]×î¡5Âò­©Îß$cÅ0þ°kásD<œ›‹_’Íüv×µåǂܱ†ÆÉèmvÏ Ýk|M—RŠÃº^?»^ÓõÛš!~7=‘]eÒB€“œꫨúg„-'ù ôÎcepÀ…@àæ¡2¥äئ†óU™þŸ~›ù͹”,öSïÛ÷#ï°oÇ/~ i†±@113sÌt Ûµàbè=Ë<Øôay€õA»´n¼Fk¿LÌÍ¥ûkŒè»ñ=ŸÎeKqóQ]¦‘4–GèÖ±-Óêƒ>Û¶Sœ­út'ß3õç×\q6ðÕÑÖµåkkËí%è¹´ k±&F+Kâëzrß1ùíßÛ ¶¾ÝC«Gå[ƒùê9€™­IÎŽÍ0n7—•ð¹!Öt>‰½‘1¸¦­?¤}Ž­´Ø€Ñv·Ït¯ñu\ÇpqFùx}¦ã±âwãJº«ÆìGƒâĶÉbs¿…ðÑ_MfrGk! ý õEŸqv­´ø öÿnøßùV8îÓ4¬ÓÝ-ÿÿìt(J?2N¼ ð˜°A›Ï—)é¡SjºVJþN‡‡š>èìøEݺvAk!€þ ós©QŠ27¾žK ø¨Ë·ÆÍ¹»˜3À‰&xÐ)¬W{¶s,õqv¸f݉2ÈK8ög½ÊùšòµåöÌ~7_ž7·Y2›S¢´fÐq_™û ×OåL¶¾±Ï³½~ ô<3{“¬‹a¼n áóB ÌßÅ,Éf~»ëºõ•tŽ1Þî=²ôy‘Á14ÎL>^›éx †ØÝø 5ýUbö‰'7ް©Ávê‡~ Ø.¹W`—Ùs<€B@‹€@çÂýY §Ïl2–Øë8à‰~J¸øñ{øõ[zžlçdK`ÿ%À7‹§ò6~Ð1¡Ó—tëÚ§X°žK çDz‹àq_pƒ•3¥D““R†õlÏr%³ã¶Â¶°QÛèãš-Ù™~òݽPw²–½9Ûž/ú®Í2•·Ê WÙÖèš99Ús¿uÏùî5âôÇÀK‰™¯IÞ¶d£w!|^ˆ9»˜%ÙÌow][? `â2l³„Þ§› @œAÞÙ¬€c¸X3ùxm¦ã–LãtcWhµ;uì/ g “ÙkÛõè2\bï€mɇãj!ÀÏçê€ú:Ô¦fÏ,± 0V‰'PaÐê“ñ¿o7 8Ü ‰"'Œ:–«îÐyÄ^û¹x*x°ñƒŽ &Bºn ÖHeLȺÆÛºyÔ`#d<6às©áüXvD!œžAâ˜%š¶c{n+lËv8:Ô@‡k¶do8ýÜwˆym/°ŒmÐÞ]·V¥µÛ·n*G;cîWgt®§?î|Z˜Å0 Ý ±»ñÑóÿ4Ϲ=tNÆð5=ôÇ‚œ¬•Ñ·›€lwv+à.Î(Ÿ]—é¸C¼n̬ñ95š~YÉN ¶S?î£Íœw ©#t.¡Ï@<§c`§Åày£Íd¶™}Ú”|˜V;%ü˜Ï¿á¬‡eÿe×wö­´ ^îH9aÔyhò°†l=ôK`?/“áÁ¦;ÐÛÊ9ïõM|Å­m×a[7ì¯1¢¯cƒ8—VœË.Š–"@Ѥý öe™=ÚŽÌ×mÉÞpzöe}´k{elƒ6£ç¤çîõS^~Û}|䧯Ú%&¿áÚý§W²ÿ¼;.¥{ÀXù–`®î|–²Û$ykâuã4ÐÛÒœ j½“Íüvk¥¿À¶ê—颽–1F7Ù ïìÂþ.ÎLNׄû[0ÄëÆ\ÈZ¿Sb¯@b³õÓXÜG»—È—hõƒ]Và¨ç rèøè(Ù”ü‚Ð×lj F+¿ù°áƸãGÌ×f ?r÷³§×„Qç«ÉC zþSqö%ÔÇÅËdx¸ñÃŽéméœ5*Ëðºb »ÆÛºyÔ`} Ñ«Á>ì§òSG“L$žl {n;Øv%û@}Ý|M•L_íÚ^`Û7o=ô-@pÑ”æÄÔÖ’™ë÷Ÿ±KŠÚºm ï5w^‡0Ç$}Kât± ðyLcë\ŒÈ ŸùíÖiɧ™ìú8»ë†9ñiý—À1\¬™|¼Óq †XÝx+9Ôÿ²I4¨•X'c9÷ãxËã»Á; κ‡z—Ìg´ø@Û¬ྃu™ä¥X™<(ùµÀ¾ÑþÎ;ÍoàSóš<(8·°S_ ö%œ½‹—Éðpã‡ÓÛf‰éÆ`\"oÀ¶n5Ø_cDß Ñ«Á>ì§ò«‚&XHº2ØöÜv,µBk¶d_dzög•óµÆuå¶‚¹j›\5Zí. ·^+sýþ³}ͧ±n®îüeß$­ þ]ÌÌ¿?Þ´;î䙯“Ã~ô£uZóiú‡2ÆêæfcȺ·¿RœQ>»ÓñP†8ÝX°EŒËä B N>¨É¹6Š%&ó%ÏéÕÁžÁü3Ô&ó¼·ä_ò+¡~ ý¥<õ~ç=N÷ó÷n®_~ÐÙˆÚ”Ðyí%’»¹/~‡QûÎÞÅ+ÉôaÇô¶I2´—ˆÇð­›G öu1¢ïÆìÕ`ø©ì¢¨%F5}7y+¿ξæ«>ÜVBŽk¶d_8ýÜwˆym°ŒíZÀy´Ê™›c¢ëV‚×LºýûZùø›;×ϾåòÖÊûRfñ$!¬1øtq0Ç)¾Ž—øÙÌowM[,(‹Ãº5Œ1’}¦kÝ‚ÆÐ83ùì:LÇCbtcmÀ–±.šƒ Lκ¬ŸAV œÀ—¨Ù«öæZBíœËZbg1j~ŽÄ®ñÝ¿FÇBç…BçÞ ûr\†íKd¶‡ü°SB¿&R\"pÀ¶n%Ø×ň¾‰^ ða?– œH¢ÇCLø3ª/Ùµqö!Ã5kÝ™nî»{Ñîä¼¾Ö¸¶ÜFlæk@×Lúù}Ík-‚-‹zé|¿-Á­Åf±L’èl;óéæÓô'ŸùÐ5]òcA82lãô5F?Ùgƒ¬³Yü8ŽÆe{×`:®aŠÛ³!Ljy¬.â„<À"g}•— ‚`mA›ÌVåˆè\gS“µÄÎb´ø2klyægï=_ð½wöò?ýópI#ëâ¨ónAý8.Ã6%;ŽÃÇ ~Ø1л—xþ²»ÌúnM»NÛ¹yÔ`'ú:v€D¯û°ŸÊA×á3aå¸<ŽC}\³Ö½‘éæ¾C,Èk{elÇð¹”Îñl÷Ç&®%t­±®“~ÿÞJë þû‘þ§ÿ%ѯ¿ŸúÿüoÛ¯Ñc^‘ÏÏ­ËRfñLâÈ 61úvEÀ!?ùèG×sé§h+°eœ3Úíö˜î3·¦5àWŠ3ÊeýU¶„Á·‹Žû˜¬*p!œ.P}f9p'þk èÊ/й2™^å®_‹d~l {'s¨½ê^NH¶cæ¸õãØ€õ%J¶‹úÀló Ÿz‡Y¿Ä'|×÷dnM»NÛ¹yÔ`#d:v€D¯û°ŸÊ¯"7ÿùú_4·œß¸/Û]3ÞzM™L_¡ò@¯·öMöY¦Çk…ÒÚ.Å­ëM…€“vfí'/‹ù¨¿©ÇŒbàØA°·’LŽvRÌt»>S’~»û±ôcALIîXjóágÄ$ïìŸRœ™\Ö^e­ ~]ü#rclÍêBÀÉ.TÖg c´ ÐÄŸ‹È9¡Wà—é¸ Ü\A¦W¹ë×b¶ëÛÝyžÒKójáë ßtÌɪKÑÇZ,Áùql 6Ž’Æâ£ÂAÛÖ ó/»íˆÓ»5í:=lçæQ>YŒè»±NöJ°ûE»kìéOܧٽºU€5ÈÖbÉM×tîÃ×”©é\ •óµÆuåvÒ³ºkáS·vÇâK“ú7¬ãGR^* À#ž·|ýÿùßÎã¾[CÀ`¿mÉ,~w_C»Ówôí]à> (kÔѳz鵫ú¾½[žÓh'ëÕÇÌb²ÝšóÚ;yÁ§‹}\äX[°¸ˆtr*ë;`øOøsŸeœä3™že° ܃V³«ÅV`Û»sdë²á¹n&ŽècœV2Ž œS³ÑX|Tø!è'CŸó9ûq¸`ÔÎ%ã]§‡íÜ%2{ŽË8[PÓ‹*ø§°O E@†úϾ‘ÇíŽ<Ìá“ň~\7ÀvœðeÀNý¸ß fÇë¬gº¦õ}‘Ƀ¹ïîúˆ¸ëÍý }Þ_‹èºf8ß­pA¥bàÞõ¯Î{пÈÏïC_6è>hW|ŸxóþĹ5[ŠÆìãÊ3Gí»‡ýLïµã~Ü?¸‡´mØÞŒ‰1€êµ‡Ïx^4§Ñ‡Î½öá8k”ízɃ]ï9…9´°¨pr.Ú|l1îÓ. G›“~Nø¹ÏòÀÍGe l2Û’\©ýÏb+_s»ù[#›O+Oí’þÀé˜ï¾ó¾KÑ×5Ë(Ùr\ÆÙ%£±ø¨ò€x û.éj[ò`.÷sqÀžý5Fô×lÕý Ìú8W=çëLL×uZ#¾žLMÇdr\O¾®Ü®ñ£É7”_7|þþ9n¯­c²»6ö¶-à“ˆ Š}·fˆ¡t›r^.~.N÷Пõ—À×tͧe¨-ãìb>`f»;ïÔ>‹3“›µwre°éâ]2§2M…@œŒ“gàb¡ÍÇà_ã‚@eè÷3œ/ì¶âü»î4âô[Ìå—xÞíOºaþhI£KÑçu,Q²å¸Œ³ J:Fcñ±kÌú½Œz l‚-’¦[Ì‘¹ÜÏÅ{ö×Ñw×’“¿ìÃ~*ô\¸€Ö"¶êÓŠÆ{ߟõ¨Î}ªð5sr¥¦s1TÎ×וۧÀ˾sÝ9¼ÆnMc?×ötëú¾à×ÏFœ~ ŸqËãc_½.~OàG„Þÿ'9 Gï>%àOܺÐ3Ýâ¤ìÙšX7žûxö¯׳åÇ‚2Y ê—áö¯C ìÃq4ÖLž\ •3ƒ¾‹u"œÚ|ÕB ïtì£Gì™%/Òµ÷Ñ:?îgd¾K@Q:Nüg[úD`Íûá~^(˜§Þïl„åß#Ÿ itÉ#ú¼¦5;ŽËd¶NîÐX|TyÀ=6[$þJ·˜=s™ŸG|8†Æ‰¾»–HFj°û©<Àùèyñ=„£Ú´âîE(€Ú:ߌW|ó Ç‹`º¦ó1ùz‚LÌ}‡X—öëõ» Þô§Äò­ÿ´ýZn…®3˜Ûìß×€×V×·•?ÿ¥ãîÇ_~a9~@u\ ¨Ñ-DÓ9üšïËF]—Xq›û-ðõÜêÇ‚ZÐ}œÝ9º=†5hAí9N¦Ãub29ô]œâç¤4N^"|à§Gµ©Ñ[9à"Àýþ€ÍhKÅ€ž'Ï»|kDràp¶ %ñoì–Ì9øÅûû9þÐÝÊs¯¤¨.ŽXãŒVGfëäƒ6äÚç‡ÃöÇ [Ìž¹ÌÏ%>ƒãD;»–š”8`çüú¶Ü/8=/¦åþ ºA¬<ø€—œ÷ Ï€þÏå±xå7c¾bwlåU_ÛO×tnƒëÉdò`î;Ä‚¼´\ÿ²yÕØÿž…ËB×ÌmöïkÀk[ZßÖ{äÀ}ÈÎt n]3ûý{„ûL÷ÀßrµUxœÖOTýµÌâй»óo…í9†Æ™É%É2y0èº8'È)Ï-(1y'¯~ðÕ£Ú(x ñC©s˜Ù8¸ ® ØÆ›³ƒ}ŸC çË”’~¥6'PÓ׈b°<Š5'@õqäós´Ú8œÊJh´!gø¡§8û-é³g.ósq°=ÇPyv-5)qÀNýÆvåêŒ÷d­„¯ó§¿d\Q–g¼ü[Ës{å×zKàGW^þuÛË.w½¹lþê]¦sý›wo»v—‰®5¯k¬5_»‹ZÃ5<ëg=NçàŸÿ¯ÛzåÜÇ­ÝR†8Ã:óZ—è^Ö©ýØÞqì ª1Æ3çíÖ)Cí9N¦ë6ò™n’w1N˜Sžã®øÄ®Ý=ˆ‰˜´ÊZÁ…A› ìîeß9Ílk ‡Î·4gžoÆž$øKÆÍ8ûµüÁ#ëkæøÆ;Ì"üÒç¤Ñ%è»s5=ฌÚp¿…,ŽƒzL¯{|÷`ëPŸCàõì:=¬wsÉ`û,Fô³k‰ë^vêÇýQN÷Ug´§¯ÑâE€Œ .ðgoûUûqkE€2_7÷{ù·-‹S*\3Þ|=A&ðì†X*ܵæþu<¥µæk§Ôþœ'pï§S‚ü–d¿¯ÛZ†8Ã:—ÖÚѽ öP9ú£ÏnŒìÇ‚€óEÿPú8rî³1dJ¨=ÇÉtÝa§úïà”ç:7}`×îƒİl ì¯G¶xÙóƒªsœÙ8´ p…`;ÆÍO˜è/¥sn’)ïøçƒ œt¹b •›¿´îûŠol–þ˜ã®%Ë™L&ßa>é>ÀõÄ5Õ>pûçÖŽ®u‰Ö¿½”ÞÇàýä÷j¶ä1òãBX³µ 1†ç&àø­t/…,ç#s?ú8rþ³1d2ÔvczVìé(ÙªÚïâTçÜŸüžìÚÝØ’î/ m>:`_¢–d;¢8´ pã²Lu£Mò¿ûN¶·†³]Ê/=`8—'šïxækÍe_ÒøW‚¾ëN¹’FFuÑÎÎ×É3—Q=÷[(ÅrðC‘€‡¼vL¯£¹tÂôÙþ|2`Ïþ#ú<>ÃIŸƒmÔý5tfÇQÔŠ|Cªûr¤­Š¦V¼üÛ=Ž%øYÅ׌áëÉ6NÌ}‡9@®û××TûÀíŸ-ÐOXåîﳿ~ÇB×úÝþú¬ýwøóI¿¤¸>âåÛ®{€o(Þ–~ù˜÷éRÿá™ ÷ºÄújÓòcANޏkáX}ïA? %Å€³dÃórïþ ŠåKá«öcA›dKaÿþ(k=t-8[ŽÃú™ŒžïѬÓù_%Nqþ}!ðÈÇ ¿#€Åç„f ˆÃ±²¸NÎþYB^¢V@¦q—&þÇF×Ë­™Ó·|¹˜— ’I=œ“—àØ€ul[Bc€Ì†ûúPl)X·Òûtc^«…€ÒXyàÎYိ(¸@!ðÆ¿?È\! Óbà–óÇõ ™àzÕö„“1sß!–Ê^ë–ë{9oóÏzœ<êoÎ{œ®ÄVEAëûv ëùxºou² Ï ÷ìèèµ;.²Øn\ÈZq~}_Övе ¶óÓsbO'É?dS»ó¹âœÚyô…ÀcoþjPLŽ“™µà‚q<íCÆ}–—ÐÅ’‡Š.Z~šø_tò¯ÅJàÖŽa[å‡î¶ÿ€S>ÝüxPÆS*ß&ì^öµy"™äs‚½Êjp\:µgÔ'#óAŸŠúðSð DRÝ|Q @¼ýA6ŸO ¶ç'ú:Ÿ€“¾ Ø©÷K¬I\ È .âø¨ GW ®¸ì¢×‹÷_KÉ|»!–Êw­¹ßJ—!Yù¡è'(W…·’ï7øg»½èø Ê_âÑw ÷KïI÷Nn½Ù^ÉlU¾¿w'ÙÞ³r—0q;ƒýJ¼ôƒü~ÓO\L7d-”|FÝï gËqT?ʨ`&}gpJçÓ_õ­_ØOŠ™CÀE㘵>] ~ ,}8¸‚¸¤?P»crþ#wïq:eéº9þÏ]ò—à“î5¬Ñ1?´v\̹äd’ma¯²WYb«°Æè£¼ï›Ÿ_$Ô-ôöÝ8 Ç ÐdÓ|j°=ÇP¹Î pÒ—;õã>Óš(tA†£Yå-ÿä¼'ÚZh!€b (Ÿ3ŒYúQ¡‹* pþµkÉz•)“ï|}K{Àõú]5îÿ‹ûëzoüûùž"À€åA­PJÉ?Ðû ÷ »·â"Æð Wо¢¾-´p¸ø5Ô–c°.Ú<'†“>ۨ߬¿»¿‘¶a½Ê[A1” Y!0»b ÈŠ‡[ µkÉz•1sßá¼XÎׯ/Ú,Û’—=º}¯ oð»Óº>‚ŠP-‚Ò§àÐ{ä˜`n äjƒþ±ˆç8žå%˵+Á…€óÍâ²ÜÑl³»×¾3œÝ<ÆôœØÓ%EÀ`?ÍÇÍý*r*çr)…Ë3`ߊ>Ð -TÑ´&þÊ블l¬¹{Ûœõ©wèH(9>·Ä^ƒ‹—û8vy_z8&äHªKôv]ü ýAÖ=P[ŽÁºhó¼Mü¶Qô·âõçlä¯û[ç#lÏ…€+¢…€Úî‹út —Z¼ì»¦1º…œéj×’õ*cæ¾Ã*|=ÑfÙµÈ~ɯE+{öäBàõgyÌ÷ü»}Ÿc%Ò..dNW‚íÙ2¶ãã!ÄsÛۡͲê£lýcA-6`´Ýð}Yk”Iû®M öÿ5À)œË…,«Á>­¸‡ÄU`Mâϸõs8ß‹¤u(ž;ÚKA¬œ+ðcטÅõÄù„Ž~GoÓUBÇAuÔ6‹}ž£‰ŸÂ6êƒþ(§{mE}‚‡?g8ÿ–BÅÀ=wHâ³B Úoþ‚áØ\Ч—®WiOhß1÷b©ðõDÛ]ßë”ÑBà]ÿʯwÆ|Õ2û¥ß)`j÷g&gÔýšßZâùͰ í’} öe¶ú4 ¤sô¶»{7îåÒ³!ÃÙq àtÝÃ`É~˜3øtq®8§p×\!Žù€ØŠCæÐµZKé:­ùó¡Ág~Îà§…ŽK€ Î-.¾âlLØpÒ¯ôún¬:úƒ¬{4À¶ì¯1¢ÏóœôeÀÎùýÂ= }®€>8¤pÅŽi1p‰®ï ¾–“~.Sà;رTèufØN÷Îu^ë™~¯¼ùÍåïôûkûÊmö[鈣3ZmÈÔnkº‡ûˆÓl£8{Ç¡…€“µÐûìî]~.¾ï3œÝ<ÆôŒØÓ-(Ààןâ\öy\Úï(쳤¸JÿôIDATú°8¥_èÕ«ÄßáÖ´†‹ÓJ‹ÿ}ám­¼D(»C}N÷0s„-’j¥×uç[cç).] µc§ã9Mü¶Q¿±M/üìžfÛ (oôÜÁÖZ DÛ(WœJ1Ðr-¡W™2ùîï¯Ùõ£ë‹6Ë€îµüüýÚ×õþï4œÇo?ïÆ=Ý©ñÚÏš_·(´¸(\ÒÏ}WÔÀ={Št/™§¯ÁþŒ³ T—ù¨Œí–Ðûîîi½—õ¾wdvGmF™Ád?<[ƒoëŠsÙçq©¿,ÜJç`å­hbÖÄ­%þYòϲCÀúŠ‹½N8µBà¼Kø•·jSÂù‚£†{e„=’j¦—wã·0Œ¹{ÈP\ºjÇþNÇóšø)l£~c[îÝìžV¸ÐB ÚHæk…ìÇE |*4`çslZ¯%÷sßaþ,Ÿ]?º¾h³ìPþ—ùŽ”_yp}Møvûëp•¨ûêåûêÓoi_$ûk’þ«F÷à·r&l–’Åq²šÏZzÿݽ»Õ»2ÅéºÁŒÉv˜K‰Á¿‹yŹÌó8j!àd5œO×aÛ¥dÉC)néÏx"ÉwÉ?÷·„×ç\ì%p²©ð}ÃÙí{X\!ìÙíæ¼tÞì·KiµØsîAæ[.\s¢_ãvq\È oAm9ë¢Íód4ñSØFýf}¹où~fÚZZh1h!€bØB りڵ„Žû޹ï0w•w­Yvj¼z£_æ>eø¾ù ~oà‰ …üÒò:GqêEF÷2˜å'ܯö£ç5€Žûê—éÖÐÇÙÝ»ú®€®Df31=#X×=fÌm§wb‰!N÷ŠsYçqé…Û(¡Ï.2ÇX~üœéÿc&û%Ü:­ÁÅ^Ã3±´ˆãã»_Ã5Üy*ÎOq~ÀÙ+ØWzdôA¦„Í’"€c³SîŽóýòÔ–c°.ÚÇ,>þæùؼ¦ÑfB技 t\p! ÅÀ Ÿ(€+èµxïOº>ÿläÇkS»–Ðqß1÷æ¯òÀ]g–·w®óoyí_?ë‰öÞ½~Ÿàúó½YKŠcÁI?ŠÈN¹ è^ãq á³´`9Ã6Kéýw÷îšwEfÇqÔf”™B`°Þ‡- ±ºØW˜Ë:‡Í \¼ÎOQŸÒVÛ%¸‡á¾Í<ñ¿¬ä¸õZ‹‹¿–oüÌé{™RPBãd¬9/çSbÏßì·—j} 3ìw$ÕHŽjÉ?Ççq:ÃÝq¾wC^ÃÙq ÖG›çËhòǨ^}ÐBŒ6tž8W¡;´Bç &l@²¬¸íWίաð:1¼'ôs?¾ƒýKå_K´YÜÞ¹Îö`?dû‚y†ÿû¿-œNå—M÷Ò˜å'܇LÑB@íÔŸÛìS£·ßÝ·qósº™Í<Æô|ØÓI0ÙNïÄV†xÝW˜Ë8‡U…@L´öáŠÚCÖrá»} žRâÏðºlc)îÓÅ%úõ[»öî\—°/yÙð¾aœ.³çxú0㤨”üs[ŽãN²îÞ©àì8ë£}h! >qÜ"9ÔB @pè'­h!ð!/ŽL`”ögÍlÖ‚ýà®!ä|-¹ï˜ûîï/¾ž|}ÑfY+/~Ÿù×:¯ó›g#}ÿ7¦óÛ^½µx·¿^>g—ðsŸŸs§J÷b9(Wa?ŽÕOí½ÝîžÖûXï{Gf73ÄU]÷™Û Ï”5 q»q®0}M…@Lªõá>Ú Û¡Í,¹¸ê»A~/¸qãOÞñ/¦syß×ÏËÍ“÷ÉEì™cŒñ^ß~M»Uç£8¿ ×íîé¥ï‰’ Ça»™ì…@0ÄîÆ»¢\ôüm!“X û»8™¼ÆÒ‹«þ× ¼~[àÆ7ÑüJKðáfµÄߤßáÎc .¶#þ§/Ù-ñ™­ÊY=Ú|ÿL²î~© vs<°'ݱ å?½ú¼'ÚÿE|+÷}ÊÜ&ÈŠ€R!ý(¸jEŸ(j¸°±…ˆBàÈÅ€»Æ,Wæ6Ó^`9Ðë Øf‹O~®Ó†ïý÷þºµð‘¯˜|ßï†}ðÎyÖù›Uþ²QV |ÀKÊóÊž}×ÝK«篨=îÛ¸q/¶tÏ;2›yŒ!¦Õ¡CünÌ+ÊEÎ,bÐ.‘b™Cý¹ßŠ^Ø^fNDáW ]¿ñ%Jò­àq™%…ƒ:Ðä«OZÜy´àb)übiÁÅØ‚RlèøÈ°-ºzÿ@WÂÙ°¿ê£ï’9MþÕ«÷?ôeç#E€B_¸¤…Àk=sèG1€‚à>?7K…À ϋĵB€mßæÿ}ï·ûă‹€¾lw½øS#Ù5†ŽÛj‡½åüùÚ¢Í2°W@Ê^^Ê¡þ×*Z(ôÒ¹ü“Ì'¡äßõ¹(ñž×f—±Õ5þ£7;lŒ{oA÷[ûh,0ÚíîÛ-Þ`gz>°®{ŒÌí¦œïP†qºq¯(5ÿ´(%RªË`Ÿ%°¿^T¥3,â|N ^/¥×ï^N(<¦V´ün@pŒ³rçáØó;ÒÚ±™­“³>³Î]wÿ࡜álØŸõÑvŸšü1ªW?´9ùwpà NÚ£i!€bÀ®xßÚY!í·û³óž^Þ(‚(¸ˆc±8°Ðk™]ßVtoñµãk‹6ËÀõO.žÚ'“ü!Nüß±ðMÆÊ[ýé°OÞzwïö×û1þ}ÇJqr –|]‰Ò3z º—[3êÃqFÝûKÞ-ú)ÎwO~ä" cuóº‚\ÔÜ«¿# œN-“ÉB§´Dçdq¶—…;OGoK/Lgs(˜“ûET¥¤Ù£ë×f+ÜygïÀÚ祰¿ÆÂ8 EÆþ5€Žm™,ÃÙ°oMTÇ>Ý…Ûç÷NÈk8;ŽÁúhoY x(pŒ" V ò©xíg Ç×êŽv¬W´ÐBà­ÿt8r1¸pE@üÒ$ÿâ$ÓTlT ¸kÛJì-Ý_Œ»Î6¸Îº—¢þÜ?4öEÑ=ج¼Äš" ¶ü¿þõÊ¡¿tŸ àS„wøóÉÎý%£Z1GÏ >!À§ïþ7“4€áqÊ~Üé"¹ì}¦û'ú@e}{wïë=Œg»£E?Å⪮{ôÌm¦\ï ãvó¸b\ļg…@ 8ájMºµ¸%Â^/d‰Îid‰nKÜy,¥#/Kg·Äã¤É>dü£A,µBàPt¾º£]òÐ 9ãdLæçÈìC©ÙAÆG†m¨.úÝ…Ûç÷NÈKd6ƒm¢}h! >qäxQp!9@ÀÅZDûÁ¿zÞm¶ƒíüE@©èA!P*õ» boéþbô:¶qûf)Øóhkí–ÚoI÷Ð;ê;ê/ßyˆ­k¼¿|êæÐ?{Ë…@7zî°OŽõI@Púý‡«Ä£èG£\+wÝ2°—˜™žžßzCç(é9Æ`7ÄU]÷õ“Í”ë‹aìn®WŒcÏ{ö;š€mÆâ1j„½^Ä:ç=TÏýCpó>„>¦ya:Û¥DMú3ëTv ²ùêZ¸‡ ŽŽšž©Ås:öa=ä ëëÖ9=t8ÝÅÛç÷NÈKd6ƒm¢í ¾vŠêÕûZþ•áœðKÃÑ&÷Zd…ì£``Ë…ŠàáÏ9ïAh!ñï_5œÏǼrwÍZ `ã˜è>ÀÞ‚œ¯Ú¸Æ l‚½}C{x-¥|¿,Ñ]ÝÃÐÊÁg©À§àŸÿíþœÞüÙ[üñ°'â‹ûðå}Q€èk1ð|ø9¢8µbàO›Ÿ«ãY·i%ö àþž=¿[ß%]01ÄT]÷õ“Í”ç›aÝœ®ÇœwúË­¸äMõÚo%ìõ2ºñ”.ˆÅÙ¶âæÙŠ‹§d/L¯Äà„Ÿ|'Sܧ]ð=Y+nžLo“¬…‚—šRÒ•pqчÎõõU¹Ú@¦¨^m¹­²î‚îŽó{'ä%œÍÜïIçþWW¯£zõCE@V´À‰}ÀE {ÿìpl-@V ÐÿÙ{÷¿9ÛºêßT?b€÷‚{.óµCטÍE ÷Œê´ßj{lº¡ÅÙnAË'Ê;ýåþ|¢àb€u\ ú»2Ê»üÕyÓý;ùeæS-Žöiëžtû÷ò’÷C‹~Š3ÄU]÷õ“Í”ç]Ã<ºy]!Ž9çÅ…€KÚôj¯ýVÂ^/“m@¦ TÄù >¯ ÷Âä5YJøs¢Ï`L'+ñÄ]7À¢5tósô¶²ãZì|îA¨2î¯qK¨=û±Žå™6Ú¯ÁöìÓ]ÐÝq~„³™ûãá=éŽ]DE@}|îõSç=ѾçOœ°M …@V D;+àÃEÀ?yÁÔfÞ{÷ÅAYðO¾qõ¿ÞR·9zí÷\æk‡6®1‡îã-q±³þ±æÐJ÷0´8Û=·lîQp!ða/ŸÚï÷ïAßñðßÆÃ ]—]\ÄØnÿ¶ {‡ŸÝ­ï‡’.àƒí7ÓMú)Ç»Hú±é¾º kÎÕBÀ%j¶Uí·özá€nB·Ù˜.`ççæµÛá^˜.^ Äã$_q6e ºŠëçæU£÷“5ׂh3÷ظ±ë-d¥X%y+ÝÅÜÛîéçþÓºË(‚ûK@¼¥d/L7†öœÜ—P[ø+(Z 7¯z_9Ðëvê8*[q¶ç@W² 4·2Õ1°S{‡útsw\~ïdòÉzÈÇ1î™%…€Ó©/â¹"…@ ú($þ ô+JÅ@´·*¢¯EÀû¾xHî¹xÌ+7»S!öö‚’]gÈûÞ±ä>Yû"è†{ÏÔCyÉœõ8]÷¢ï@!ñš¿6ñÚÏ:›²‡={>ÜWÌ»þÕyO´ßþjPðöô»6ü×…˜[CB(xvëýËÏ|¦¤ó8C\•C7é§üî²èçA÷Ü©sŒùŽ…€KÌZ‰‰i¸~+a¯ è&t°=Óe;{NjÜœ2çP²—¦S ;Nê[PŒÇDòìB ÷“sgzýî¯/s–µÚ°®EŽ>tNïP}©ÏrîÆQ¥»˜»ã²û&³álm¾gw§cŸ8"^íÓ€¬J…~†ß\ ÄÑ(ÀCcXg.Þø÷Ïz`£EäA(@–üðKÏzœî"‰½ÅûË]G\_6º¿u×úLÉ_ujwYtĽgêZ^çMÛc<ýAÇÙSZ €G›_‰ÑOÎ[íäÅíÈtð+ùC®Ç¬Í2%t%2Ge;¿hwsw\vßd6ƒm¢­÷ p×1PúÄ‘ãqòÏ” þòÐv…ÀÝl8–Šhs!G.-‚÷Ú}RàŠðþÿøY=NwÙèÞâk‰6®1›cÝ*ƒ<Ó]&݃qï¹zl¶(ð—´ôô¶X­…@ðÖ•_*>„C «XDð³»åýÉ™yŒ!¦êB´ ôs¢{ïÔÙr¾1‘L\¿•°× x¶À¾ŒÚ ©aÔg)îej¶!+!çD~)ê}àŠ€`«B ·—óÍ@üqœîá›Ázµç>Ú ì ×v&c¹¢>ŠÚ´ôUG¦»˜»cû}SÒs ¶‹6î¾NzýÕÃrî×Ðb xð¯ mW DŸ .⨟ Y!ÀÅqDÀÅ€+$þLÈßïŽÿ;Kѽ宥úqßÐþu{Yõ%{Ö«.“›¹»¿Ö {î=K¹}lŽñI@ÀéŠ(¸ˆ ½Ï‹/fWµŽókƒgºRÒyœ!®“íŸ ý¼è^-¸ £æ²(´€='ñ5àÓJk!€vùú•èmå\K„}ïÓ=t³|IΨ¢¶¥>Ëœ?€ŽmTÔ‡ûh3Χ»à»cû}“éÙ°ÎÝ#îN§~h¿ß?œ÷DÕÜïçÏ{Bç ¬ˆv®¸àb 8´(ñ/~-‚S-to)zùÚÙ³•÷±£¤gÞŽš~ ¢X[ ¨Ý­Bß7ÀÅÀZMâ¯Z!ÀÏí–wC&gæ1(¡.ꦼî”èç&÷â)³Õ|W1'B—áì3Â^/ÐÍØ ÇÐ8Ñç¨Ã½ôZ¨Å ™q\“Ügç†ãùãæñ´ÀñÐB ·ëÆ\BïÓ=p¡[‚ó«Åsz•©žQ¶ÕcÛ),6öswqû#À^wdú¹ÿô‡û‡q×0p:õC…€+P `´@1\! ÂI¿…@P*Þö…ƒìþ|ÒE …@´O±±xoñuC×—M`÷Ínÿj;뫌©éOosÖƒ~÷€œ=W¯".1FĄ̂MðÅ7—Ï› ÙJi>×î™®:&“3óÃ^Vž“~êŸýüè>EúyîòšSg‹¹^/DÇI2P÷‚[ƒÆu±CöÙÝ1€›ãÆ1»"ÀÁ–…@¯ïÆ]Cøf Ap@ÏGõa™êØfÀF}–ô!srÖ•À~î.ôžÜQÓMþó½î%à®aàtìGÄû¬[ÎG`ì-‚%…ÀCžq>1Þü†v\ DòÏÿïð®5üO?(‚wûë³ô/‹?}«iÿã†ò|ø:¢ï€ÞîÙۮϲÖ{áTÐbŸ0¬g)žóðí÷R$¼ ¤×~f¿o*É㪰ï!lo+øyŽç¸ê˜LÎÌcPM:È'ÝÔ?eú¹îr›Sçй..b@'gÂ&ÃÙ;؇/Ì$ëN`CãD‰ £>î·«±!Cp~ãpts\Jo—üg…Àã>}e…@Ð]¬‘è»kôºnÜ%` ‡K 22?mgz%tlÃ>*S}fT§z†÷sw±­N©é&ÿùƒž÷“]ÏL]]<æÑ/{¢•ßý‡§¹fÅôq,ð\@ö¿;_o& §RŠ^c}ín³¬v0ñ ÀE  ¸ßpÅ`»Ï~XÛ:l '»H~×&Á5Ÿ·ü“ó•¿Éó÷e}å|^¬ƒlí<‹qH¼‹À=ÏYÎdregسª ù¤›'Û§N?gÊqN•C繨ˆÁœ\ » gï`¾(“¬;p }$6Œú¸Ü4®Æ†lëB EÉ©@1 XZôònÜ·÷é¬ú²¯½üÙGq6*s}–s6 Û9–«ÞÙCÎ:ôÖa/w{fÃ{])éç1¦‡}Çý¤×Ž®)prõ‰#b~ÒÍŸ;‘ø;`¸BàO›l²B ÚZ<€üòŒa´àB@?`Þëï×Ã2WÜs÷ ΧŒ^GÈÖã¯ÅÝ ûý<ñ¿¬¢À+€Ú>AÎóª%ÏNžÁ¾i8ŠÀ¶LKìVjsm=—‹Æ=ÏYÎdrf?ΰWUòI7O´¯ý¼)Ï9U™çI°ƒ_IÖÀ 8†Æ‰>’eF}ÜKn WcÏä]ph!0ÆÚ%þK € î"Í™^Ç^֛Ѷ{€fÔìXŸÙ©mµ…ÃzبŒQ :õá>Ë•L½Ü]ô=yFIÏ1Ø.ÚØW|-õ§ƒthk …*à »ýÐyO´¹軄þn;[E€"ŽÁ#ž7´KEÀ{ÿýôI€ú£CW wlsl¢àB T\&:OWØD!pjÅ’_Fulߢ;­sËÈìkMÌcÃÏìÚ{ÁÉó”4“n.Ÿ’ë«F?ÉwN‘µól.b'w„m†³gØ>|1&Yw+à'úš<#ÑaÜKn WcÏä} *8ùç6£EÀùco?ëwiFoÃ×±×Á1–€„—гc2;gË:Ö«Œû |ØŽeNW²°QB‡½Ü]ø™ïu¦¤ 8ÛF{Ü[t]õz§ƒtÜwEÀgì~_…À=règ…€AZ 8P¸"m-ÞäùÃEÀ»üÕ”ä½ýŸOm|³pVÜéƒ'ù}ßeÿ~ï|ÞùeûŠ÷–»Žè±gJð~v}Å%þÚGû¾$ù]‰¯½Ýºë‚yê|W 8õOkRìdµ)ñFÏìâÔ†)ÅŸ°áv l ß%þIíYÎdreg?GS9ÚW•þ$ç95Öα©ˆàNžöΞaøð…˜dÝ ¬€chœèsò ÔǽäÖP‹;ÊwEÀÚB AÉ?Ã:ŒÇhò¯tj$úã5ìÆuçÒ뺇%^êîå½¢v·jëàtØËÝÅŸÙò^gjºÉôI‡ýÅèµN§¾ˆ÷%»?#X*îÿ‹C[‹hs!€b àb€ .²B¶(‚(P(øÓ€«Nì™^G½Æz·gÞÏ-p"í’êÖþ¸P[ l–/~Ÿ{Xö¼Gœõ°lkN!æ9dsÉ䊳kõ=5Üóœå¬W™cƒe£c›«N.”óœ"kæX-"¨“—Ÿ gT¾“¬;…°¿‹}$ÏŒú¸—ÜR§w”¯,FJüØÔàd“¾»`“-=ÊÈVý¹í`{¶]Ûv‰Ìm'szGØ©-d¬Sä™˰—»M0³á½ÎÔt“ÿô°‡Ž÷Ð}ŒýÉ|.ýõ üx+⨅\p1ÇÖ"€¿7 ûaþ4<âyS‚ö–âýN™Ø¼¯Ü5Ôk¬6¥k ÜþžÚóDÙõÑÞý4ÉÿÒ"óm~\ @Vâåz9û+Kž·L¢?îÕù¹2|ñ_ë{,øyÍ÷.ëæ6s™cƒ’dÒÍåCûZ ?I¤O¥sܟص»¶!:y‰ðÉpöÓÁ‡/À$ëN`!ìïâDI4£>îE·Ä)ÅåT´½ŸIüŒnþ"ÿÕs $¦ tlãÚ*cÔVíTÆ:Õ;÷UÎ~ ¦W“qz–±ÜÁzìån#Œ2È5Ýä?Øó^ctc/grèâèâQd…€'þKÈŠþ Š.À#~þ¿°\¼ÅOº7ýóô¯±°¾†è;ØæP4AÖ¾£vÿ´ò·Î}í§˜'漎sJ?Tú„¢%)^›4#v«?Û;?í3Ξu-²ËÂ=ËYÎz•eÌãìçg³þZ¢?/“PŸ Kç77}`×îØ&wòá—á짃/þ$ëN`!ìïâDÉ £>îE·Ä)Åå ÞÇ$ýŒ²B ऴåŪö:¶cû¬Í2¦¦W›L–éXÎd6*g£fïô€íör·öäJ&s<Øù¸×vG ûúL]3øÒ›Ï{ÐW¢ˆ# úî»ÿÈpÄ_â_ ²" TD c-îõó9^6¼¯ø¢ï€ž¯ï8Ö¤Xû%T;œýZžñ³§nÎM1€¤½”¼¯¥sIb\³…>Ž@mKl3œ?d[Ä?îYÎrÖ«Ì1A‰±Ñ±ÍµFn&©>–̯/>ù=Ùµ»¶$á*k%|32ûLðÂO²îÂþ.Nô‘L3êã^tKAœRÜQÞXŒö&á°YŠK:]Rªý[´ÕŽåªc g g´3™Úg>êÇ:–3%]‹À†÷r·)F9ë˜Læþó>ö\mCïdìÃý'½hƒ Ï»å¼} Ÿ è'Z”Š-øè'-E€¬¿ž8ë耞ŸSà ~·>N†³Äè=1É}’ Ôþj…€ßá|ƒî9¶[z$銳­qˆ/@Òì’g'cJº Å?³ÉüX®¾ÜWÝe“=ËŽû%æ1()&Ý$›'Ï×ý9JR}J´Î¯/Þû‘êÚÝ[’p•µ¾ÎVe>¼è“¬;…°¿‹}N¬ú¸ÝR§w”7½IüÄémº‡”I¶Éâ0%½Ó©]æçÚ,ÚgÛ£ídª~æ“Ù*lã¨ÙC–éAè²½Îûœ)é‚yŒùÜw»#pûXe3ˆD!€b øòWmW  àb€õE€+`£E€¶ƒøî|@V<ð—ÙEyK¾Ç ööAÀ×Q¯/¾Æk)%È 'Ôh;ÔïP´б¸¯À§…îE9뻉»Cm[X#³AÂìg•©2'gJ1JþKâ¢_Šw™¸ç8Ë¡ã~yœýÜ rÖ_Ëôç)‰õ©Ð:·¾xäcæ¿#ÎÜ_Jøg8[•øð‚O²îÂþ.Nô‘X3êã^tKAœRÜQ^)z›$ñœ,º>(ýhPàbp,wTàœNeªÏì2ëÔ”ôìïäªCŸõjÃ8{§cèAȲ½Îûœ)é‚y <Üù¸÷x¯vm¥$gܽ¢àb Ž7Ý2ý5¡R!pß§Lý5…@oÿgû>\\uâú§w×8`›Ò5^ ßCß'×N°ï¸OܸŠú,¡{aÎúœ¨g°}+.pö Ó#yÖãŒ3NÇ>NçìÔ&£¦¿H²ç¸Óq¿Ä<%¤›dÓóâZ§?_I®O…–¹õ…ÀcošþjP8q2¾†ˆ‘¡vÜWàË=ɺXû»8ÑGrͨ{Ù-Ecº¸£<)F}ò¿þú‚\û¶Äc½Yï€úd}öã>dN ÏìJ:èqdgïlÑfØ6l«2µã~¶×yŸ³“ƒýó‡~ë½Q’3ï§_ôø–¡¢àb @1îýä©—ï›ÚZ @žñ€_΋€@? xÛ^;‰¿×{Àá®qàlû}.ó vàôê¿K µÝMÖg_ÃÅa`£~J‹RJÄ¡c2;>²ÜéÔÎß[ÇZ¿ågù$g»ó”“n’M‰ò­þœM’}Ù´Ì«/¾Šþ|h8q2¾†ˆ‘Á6ìã€/ô$ëN`!ìïâDÉ?£>îe·ĨÅå¦hEF–1*s}…ål»5Ù˜è·Èèa«>Ú/ÙªžûÚ.ù1l›Aôöq·q÷äJ&sÿé]ë½Q’3. ¯}Õã{TÏÅÀ=b>ç -´ @;¸÷“ÏzІ< . W¢¸Ö‹´õêõлë{(.±v°­Æ8„Ÿ½÷þ^È~$HaŸcнDÇ6'ë€m[p1lÏþŒ³œXgIrI°ŽmÑæ>ìZPû¥þ‰{޳:îטÇÙÏËTwk£?wI²OÚ¼úBß#ÆšŒ¯›ÁÁ6죰/ò$ëN`!ìïâDÉ?£>îe·ĨÅåIÀÉ ƒíØOQ{lÕ»6Ë G[Q;ÅÙe2gãp±죶N¹Ó;¹‚2§göq·qg6¼ÏA&sÿÝCn'Ç}¡ûØía•ö‰£»×‚¬ø¯·’F}Ü o ˆQŠ«º^ß=p˜š\)ékrçË2Õ£¯rèœ Ëþ@õ°qí°El‡úÕ³ê g;Ö1j§° ÚÓ^¯ß/™Ìýç}ܺWyC§2À>hß÷’ùØ ÿó’›úc ì¸pŸ  ­dŸdE€òz¿=|€ãµŒ^C†í€{–®Å%Ø5Ø/‹ù\!€b`iÜóOÖH  öKè^²³þ’ ýRœ¯Æf2='Üh»>Ë—çËq3½Ê.›ì9Î:µ«1ÑíGyǨîÖL¿’l_6¥9Í>Ø ÞŽV;À‹;ɺX|8†Æ‰>Ù‹K_zKAŒRÜ™¼{Д`[¦EÏdzìÔžå Û¨ê g2>–àX@õÎŽmX_j³-·U¯:¶á£2íõúý’ÉÁÜ÷pÛÉqoìíUÚÃЩ r†ïµR!D\ ÜëIC\ <èég{ ¶ÓeÉÿÿþ”Ø=ìÙë‰öEÏzíýùœîš*Ùót-œÀ·Ðâ£c\矵»W’B€m»Åžõ—Ò½|gýZrp"¿”,Çg2$Üšk¿Dæ ™êÐ.ÉJòËÂ=ÃUŽv ûqös2ÕÝÚé×BîË&›ÓÑ í¯v’u'°øp }@íMj–‚¥¸ª;8IÍP;î;pr–)ÐÃV}œÌéØFû•üèÕÆõÕVÛj¯6®ð>®Ý/N¦Ìýw¶÷†îUÞÃЩ rñÞï¦qŸögó9¥Oþë-ƒp p!´xýßúQh!€6ÿ决ô×òaw<<ÆeãÞ ‡àøZ|u¬k|Y!}wÓŒ ý|?¯%KÎ91?„,–Ž·5¥äÌé!cO‰ìÎ:µ«1A‰n¢»Î@¿&’t_6nN'W¸8¼¨“¬;À‡chœès€äDq‰Í£w&ï6 ëX¯rÖeÀF}Ø×Ù´¢1²>dìçlìÃ}ȸ¯À‡Q½Ú±\Ûè;=ËÑF_a=lj}ÞÇ|¿ðŸÛìËø¶ó?î Þ«¼AIθ{- Z1mWö¹ïS§Xøß~÷?þàþ¿0èø´áˆ"€ ÐúiÀÞ}6ÃÙ\+ès| 4q_B«¿ŽY¢dÿ÷<ëq:% Y@~L\²¾¥ø:&³)%éhƒ’ŽåJIwŠdÏpèÔ¦…yŒý|Lu×è×D’îËÆÍióB€7EàdŒú3°áEdÝ ,>CãDŸ‹—œ.±Yb”⎲ä!ÄI £6Úw° £6Ζõ-òSóT +ٲʖgv³>ë«O´y3¼ÇÙÆÉ™yŒÝCm'w÷ï_ìa•õE¼ñwç#j£h10§"@‹(P p! AZ((úSâ"àÍþÈÏ]‹€ ç{j¸kˆg¶>¿·F÷V–øê˜ŽÌþ›ï0\C-JëÂ…@Ð-ð“®~ol'é[R‹ÏsP2›,©×6÷KÀ¶Õþ”pÏo•£ÝÂ<Æ‹á}é®3ѯ$Þ—ÎéàB€7‚£Å¦/è$ëN`ðá'ú\¸d'Фf ì_Š»§ëHL&WÛ@βLçì\?³S™=ÛÁqrØ;2;ôU‡þeÍm'sí8¼Þãlãä`îO4Òé>åý ÊûY!ð‹ñø¶ ¾ÿ÷ϳ…ìSþ•ýxÈ3>{2.Hì]¢Ï2–Ÿ"¸þ^Ã-žñKá$| K}uܵÔÞ—³O’"`:Ö÷~‹Í8Qߊ–¸:.qÏd­‰¾Úµø\Ù3:µiaÿ Xw}úõ¡Äûà9-.øÂoÀ†s’u'°øp ýS-$‚šªŒåjãô ËÑV»Ì&“)+³‡œõê£}µ×>ÚjÄ ÏrµÕþØÇÅ+éYÆû˜á=½Ê”¹?=ÌH§û”÷/t*ìG½×´`(ŸtóyËþó«ç?*¤E@…Š×üÕ{ Ó" #Šý% ÿ·”õ— öÀer~›{¦¾Oà3Öø(»÷>7ñ}ÐP ºîþܽĶ™dÞö\²~­qyLÍI¼&ó-â{YäÏðIÆ6-ÌãLï'¿NN¿N»{òàù4|Á[p1Ö€x¼“¬;À‡chœèŸZ! ‰ú¬g™Ú¹#?%Ó³m'S{•«-Ö©Ú éÙ†ûg«¨Þùs_qv ³‹#ïc†÷8ô*Sæþ»‡ØNŽûB÷0ï_èTدt¯¬`â[‡ù›‡ƒzåyË‚;}çpN(^ó׆#"ÀE@€"àáÏñŸ\gìs¯rÕ»„ݱÄVÁX%Ü{,€ŽmµˆcwsìùpìîÏÝK@§í¡?ثϡp¾­1uLMÏ”’|—ôCæt§Dþ ú¬oacÈÖ«î:9ýZÑ=yÙ`>¶à Üû®ÁÅdx'Yw" €ÇÐ8ÑGRRJN\bÓ û—⎲îÁà Ÿ;è3Ÿ¬Í² µsm–±÷!Ëp6ܯŀ^mJ~5Ÿ ¶s>*C²Z_a=Ûp›÷1Ã{z•)sÿÝl'Ç}¡{X÷/÷ö ²ûŒi)~Ù`ïŠý¤ Š£Ì|Ç-‹€Oºùl†³¹µ‘%ûNÎLþ>‰-6 b—pï5Æù´ ÇîÞ¤8P»ýöäçü— ¾š¨Â’x<‡V8™gÔ”t§€Î/{~C§6-Ìc yÞN~:ýšÉýxY`.c!À¶÷°+ábg@Ï 8ɺi„í9†Æ‰>Y‚â’›VØ¿w”u7;'ÜW9|ë´þ© óÒ9fú øÁ–û-h<6Î'“©}–;Y+ØÃµ{ÅÉ”¹ÿîᵓã¾Ð=¬û—û ûÙ}–ñ»¿·_|UW*G!ðo^1?âå“ .òŒ!©ÔO”×~Ö|ÿùÕÛ É_ÿ\ýÜŽ…Kò—0ÅÉ“z'w V ÷ÞRØ–}k…úñ»/g/ï¹¾.›üØŠKÖ×°&σÉô¥"€u™Í© sËŸßCŸõ­Ìãìçaª»Nýš™ûñ2ˆ¹4úps8?àìkÀ—o’u'ÑÛs }.²Å%7­°)îLÞÝðH 9IdœŽc8j~ÚW[ôUØ'³°=5Zæêt?¿³§g;Û–«}À{¸t¯h?cî¿{píä¸/xŸòÞ…\e> »ÏÖð¯_rÓdQ€èG1ÀS*öìAÖRd|Ü«ÏFœþÔxõÇ^Ü<]b¿–)¦Oð<€_ ÷¾rÀVý£(ûí7Û”ŽsÙCí¡p‚~kbé\@I§É>úšd_òç÷Ðg} óó$v¦£ýÃv×)ƒµ;ÒB@h@íg¿—n’u'ÐÛs }.²Å%7-¨o)îL¾{(iB¨°O윯ö3;gËG•£­zz¶kéó±Fæ¯6Ü®‘ù @1àl”Ͻ;-Ý þÉyúïa¾WxOú¹ÌÿÁ~÷Ð"ùÞ¥½ Êû¥B@Ï=xÒßÎûOý«¡ÏEAK!E àþ¿0O QlÍgÐ/?î„YøðlÏžñŒKì×2Åœ'û܇¬—·Ìo÷®j}8†AwsŒ ?»{’˜ë–ç±”°Ù MÔ—²6†ÎC)Ù\Å ÈžÝNßÊÜžÀÎt²Øö:etý.‹Y! /l¶dß܈¼h“¬;FØžchœèŸZ!àÖ#¶Hž´¯¶èô¨ Ûq2´Ù†Û Û‚LÏr†mÖgíR_h+\h1À| }óì-Ÿ;´Q èxE è[ö7ô*Söc sbî_Ý»ÜWØ/(A¶ÎŠÿê‡!⤟‹È.ÀßÓþ?Å%>ú•g#N-ÂÏx}Ö3g]Òœ¾„+”Év^ŒòÂÜœS زÚ(ðI@ÐÝ=ûíî¾$ ÏŽ™nhÏceÀ~ 4Q_Â!1xJ‹MpU ƒìù>ë[™ÇÙÏÁzyaïÀç:e²u¼Hì'ü0;гCul¯¾j«2Õÿ¥ˆ@‹ ÇåEÛ´ìoèU¦ÌýéaE:Ý¿ºw¹¯°Ÿ»ÏžõÇûkxM~íO§¶+@ô5ñçþ£_6´ù‹ùÓ.úùÜ‚|Å=èÈËn쉶+󊳑èâÍg=lsÑç}íÙÏ…ÀR\¼VJsrs†¬lùøÓ-pœÚÝ=)¨í¾O.Úû13೜¤/åG WíG„²ç·êZ™ûï¼f:³g€ú^'§¶–Çf,ø!¶5¼qj ±â>/Ö$ëN ¶ç*çÀ%(KlZQÿRì=Ýn=t}¸Ï°Ÿƒc:;•;ü`Ï}'gߌV?èÕsŸåÐe>,WYA©È@!àŠMüÁ_¾ó|üÚþ†Žûsÿù½‡{B÷¨î]î+ìçî1æ×_P^ǧ¿pšo­pŸ Ü_Zòi€+¸€Ž“.˜OéŠ@å§Löì×¾Ã%ø[¢ã•æRš/ëJÀ–ýÐÎ  »AF†~wOlƒ¶“•ôC·øŠKÖ[8Ô?ày82›S.²g·Ó·2÷ïöŽÉÁzÙ'ÌhG1®ãiYÏcq´B€Ñ¤ ² ØðBM²îa{Ž¡r.€Ú»Ä¦õÏbGc»5ÑvÍ®ÇPÖñ±âlÇ,•E8=(Ù±\eÁSï;ìÍ5E“ ’†uµý ÷3æþó{oÜ—²±w!ç>Ã>ïsÕµ …@¹p…À{Èï0ò²ýõÀ/í'’óªé‹Åþ ky´÷ªàžÿÓ©oà÷CqãÔpsÕ9«ƒýô”>C¿»¶CÛÉjí¡¿¿øŠ&é­â t. ÅæÔȞݪke?F·o$ÿuf8Fû]¬ëx–¬é–lVàB3k_î /Ò$ëN ¶ç*GòϨ½KnZQÿ,v´16Ö ¨ö[lj„­yÉÆÑbµÍäÇÂÇÇLÆ„hð›¯3$$_@?t›'v>ú;n÷ï'™Z€Ðaµý ÷3æþó{oÜ—²yï¢í`Ÿ@÷yïyiÙN‹ºìSE€L‹.˜wÿ›ù5sD²ï€þƒ»vÀ>§ü;î=2½Æ\"¿óœ~ñ¾†›gÀúš-`ûìè îæúݽh`[´½Þžý8-„ÿVpÞ‡Îã*’=»U×ÊÜ¿Û;.ÿZ¹4æuöY³®‡rP!€MÁ¸:dq\üy&Yw°=ÇP9’Fí]rÓŠúgq£±u=¸ïäÑÖ>Ú5àÛÛ»8ÜfXÈø¨°þ€e°Lû,C¿„ÚÁ·æE c‚yÔö7tÜϘûïL$×ý«{—û |€½Ç ë…pz¦V¼×ߟ÷ ¯Dà> ÈøÈWL?Fô¯þqòû —žõDÛ(˜üî{N©pï%³ÓXÀ%÷%Ô?’~FõnŽz¶­ùjËÇEÀ–…@k›û󣫕ˆqÃ%ëk|2+£Åæ2(?»çºVæ1º}ãò¯ö΃b_gÎÚµ]Ë¢B°¿ÈÑæ;ËJÀžg’u'ЀÚr ÖE› €1ß&6­8ß,nô³ G…ål¯:–•p~ÎFqrõᣓk»ÔãR?•)°q@¯v_zÃ#,W^÷MÎ{XvÇ?a9ó·;ß#ä˜GËþF»ÆÜ÷P"¹î_Ý»ÜWàÜ>Ùõàb µ ˆ£~À…À?{ÑpžÚAVDÒÏ@ÎÀ¿úÇ! .`㊀ tQÔŠ%‰ïZº‡tï¥d:—Ø×À<€&þ@ín^¶×c†³‹6Ëk…ÀÐîîÃزö[uhG?Þ"ÎVh¢^b©} ¨é/ƒì¹­ºVæþÝ>q¹×lÿt~+ãÑ8×™8t}—P-p±÷Rxi³ ˘’ŽA^˜IÖ@jË1Xm. hò¢‰M+Î7‹ýq|³°i±‡MF‹=ëjvzTûLæÚN_ÈTWk3!è«|ÃíÏz¢­ÅÀÛ?p¾gøË>†Â…A©8­û›íJÌýw$’×ö.÷öãûLÉ®h-Þäù¹^‹€ø°¬@€°S\BÏÅ€£5>„îEÐÝû©Ù„Þ%ú Æšð+jïpóÉ€=k1XïüqÔB ènŒ‘¡ß݇ °÷~¾ß¢Ž~Ì¥D¬­à½ÄÛVt.§HþÜžäK˜ÇèöˆË½f{§ó;ë:[­q½Bd/b~Q3%S‹À†e’u'ЀÚr ÖE‰ '(š¼hbÓŠóÍâF߬ Ã1°ác ç›Á¶¬×¸Î7d€ûj¶aXÏ}g«zب òÀпúšó½«<àý<.^ü>g3ØÎ¡ûžûsz‘®¶w¹¯°ßì>£õä>˹ÍE@KAp¥oFàŠ&Š ýý’³µ[Â’D¸D¼œ@w„£¦Âf‹Ä?PŸ 7ðÉŽÎŽe®ÚÝ}˜°o;´í£=ýØkˆx[áue‰íx§DéÙÙÔ˜ûvûÃå^GÜ+<æu¶^kÇXàB}1C–Ñbã(ù &/È$ëN µå¬‹6“Y‚Blô×à|³¸Ñç©Çq¨ú³>“·ø•l\ŸåÎ7dŠÚÀ.뫯k³Ì¡zö¥B`äqoàt ,-2ø~Pævóû®vOpÛÁ>â­E -~¬ðóÿ÷êõד-`ó/þîlä®P`¼ÃŸçó\š \¥¤‹á¿†ów¸9´ßìè`]É¿T Çî,ÛÉ~hoÙŽ~üCˆ¸[àu¥Õn):—«„{Ö+sûn_¸¼k¶_:¿Ç¡ñ¯s¼õÓ'f£#ñ©±ÄÖ‘9/Æ$ëN µå¬‹6 2M`4¹iÅùfq£ÏI’® P=úêÃrÖs;CmµŸÙA®zí³¾Æeœ2öu,* EÁ~é|ë²àï¼/ÿg¯1ül<Ã÷‚cn;¿ïj÷·ìðgtí!cä\ øáx|l¶Æ@ …mKÉ?`ùEƒ—D´‘è*%à˜.¹oc”pã·ŽãdŒ³å6µàߎÃzgÀv²Ú®ïd¥þ~ÛÏáP"öV¸d´Ø¬…çp ,Yc÷Ìs»n/¸¼ëöH s¸Îq×|ï~áâX¢Å¦ý€b’u'ЀÚr ÖEPÛÀ%8-8ß,nô1~i]X¦º}f£°]«ŸÚ¸%œ/ËKvYŸå%2›u׳§_UgÛ¡…ÀZø(1÷Ù¿ïJ{—Ûö t—h¹vµbà‡ÿaÙZþ7Ÿp?ÚZ¸¤Àf ïÿ’¶µqòCÁK"ÚHp™Lç¬Käd.ÙwÀ¾Œ©óhEcp¬,®³ÉdZݱ;k]ö“ÏÐvýVYshûylAÄ?Žá’uPÓ¯ãžK×·åÙ¯Ïÿ‹ÚÁ8&ÍåÖÌ1×|ö‰¿l¹ÍýšüP—á…˜dÝ 4 ¶ƒuÑæ"IŠâœœo7úÙø[7…í2?ȵŽlW²/¡¶®éœ pz'c[§ßr‡³žhøçû/ø”Î{XÆÅË-® ŒíË?lüV>êöÓ\ø^p°_· {X¦{W÷-÷øÙ=Æ×B¯Û ýßoÚßôŠ}Ûc2p(ïôÃÚF²Ï¨]+khE_!Cb« ®q¸P`Ãsf /¡ã¡ ùœÖv2׿#Ç(œl ÷‡¶ŸËVćÀ1\Ò”tKÁX§ÌÒõÍžûúìßß'óky,Æñi^·V޵îÕBÀÉœ„nkx&Yw ¨-Ç`]´‘œdIJàœ™_w”5¬§®¿óq6@mØr>j»br õeèJ2§‡œqú¬>Ú(¸ßy§ý±À÷ï>)XT È÷Ýe>Ÿ¯¹]>?À÷ƒ2·Û¿ïöö(õÑ΀OÝc¸.Ùõa™Å€—U <êoÎf@É?Ã>-èù»$šaÛVø’\NpغÄ?cŒOín\wl…í[Ú%kÇ1+‚ΨÊ`×ݳDlê"+õ‡¶ŸÓ–Ä8‡À1J ¼Ó-q. ¾GÖÀëÛºÎxîë³ì_Çc¢s»µrŒµo. ¯áü™=Ë`à 0ɺh@m9ë¢ÍE€KR—àÔp~¥¸{:Z‹šk29=ÛÁ/ÃÙ£É2 ò¬¯:'6P=ËXÇÔŠ?x·óèP ®¸Ï“Ï{TÜó_<¾í—|ÀÙˆÚ.!>ÑçûAa¿¸ç–éþä=‹vûñ=Æë¶^î³¼.¾C¾Oàk^5õoºå¼'Úõʳèšô3°9$ùÜ9kÒïP{î~!¸>[Nn¹4ɯÁ¾ÆSx\:=¶âü²v­ïÚq<åBÀɸ?´ý¼¶&Æ:Ž‘%òNÞ b_gŽÇëR[k<÷õÙ¿¿?ö¯ß±çBs¼5²õúï1Ú Ëq1¶Í¨Ù«¶|ò“¬; ÎŽc°>Ú\ IQ\‚SÃù•âŽ2Z ^èœÛ@Wêgp¼V…ý'ƒ¼Å—mªSn«þ”h)>C柸OZ õÁ=Ç:Ý»¼gÑÎ`?¾ÇÜ5Êd*/ñ¼ßþ,+wD1ÀAÀ…€yÅyO´kÚ[p~›{†v=ù_^ ÚÎ’ÜÀ%ø l38žcfÀ†m[ü‚̧k‰OµàB 3jb°íÞƒ³Dlê/‘eòÒCÛÏíXĘkQM湿޹¥¸\ º&ÇpëÏ|f²öÁeí%›ï­‰-¯CµÀ‚³ rí3,c; :g>ñIÖ@gÇ1Xm.¤(.Á©áüJqG™¬¯IM¦:%³å¶Ú¹>“ÉKp<¦f—É™’SÓÊ—ÝvØ»ŸMIÑë¼éã{ÐÏàBài˜ÛG ÓBàé:ëAð=Á÷À¤§‡ étïòžEÛÁ>AzíÎE¯Ev}Z®YгsdrNþ·É?3È—ÎÆÉð‚èõ’ØK’}Ä×q8ž#ô-À–}Zý3Ÿ–vI‡v³B 3hf°ïîÉY26õ3Y&_#Ú~~Ç$Æ=Ž¡ =ú-ÀçZk¢ëŒç>žý“½î‰ù5º,tη6¶ºÅB€Û§™¢6 fŸô$ëN ‚³ã¬ö)ÑÆØºnmj²L—ÙèÕ®Ô6PëCvJðœ4Áù¼†ù~¾üò0Ã…@€Bà½îqÖíÛãù ¶×B ŠW ð=Á÷À¤ß¿çÜÞEº ö x«Ne¥}RòW+¶?„ï|Ùv±–Œ³ãØ%}¼ Ø®„Æp8?‰ôàÇþ-±JöN×bãÚ§XdòÚ8CßÏñØÄ؇À18¹çd¿|/Ì{‹5Èà5vÏþSÙŽqŽ»yßÚØâzØB@V¢Å–cª-ú*‡,àždÝ TpvƒõÑæ"‰Šâ’œÎ/‹m[×dú̇íõ¨°\mJ}´ãÈ8[¦dƒÌ{¾,ªDŸÛ€ (j…À‡™¿,´Ak!ð«d¿òàóè²"ð}{`Òíßsnï¢]ûd÷—®¿¢zwÍJrÆÎ_‰Ä?xç¿+‚Ψ‰Á¶»÷’±ºl ¹ïû¹^1þ!p Nð5ñW`wð˜|Þ[­A }öóµ?…ëŸÁs¿µqè5 \t/TEõ™-ä|\ œ,Ëk8;ŽÁúh#AÉ•À%9%2Ÿ,n´1v¶fX_][•«Lå¬wm–•äç˰ŽQ»k‹ ãêø(~þ~óü7üe?ÔL\  ZŠ€ß}ZñŸvsáû÷è6aËtïrí ø|µ^s½V,ËìT·–_úóÇÍp6ÊOÞs¾vY1ÖÂÙmn´„Î}ZPCã—lp¸$¿ük y^ ÇÐx¥øKü¢ßb£í8–Šk vÝý¸—ŒÍe[É[dCßÏ÷¢ˆ9Ç@Ò\Ý–´ÄwçìdÇ„¯û©\ûŒqλ÷×­‰C®‹-¶|‰2ü‚FüR;ŽHPp¢@“‡³ã¬6NT—ä”È|²¸ÑÎ’$^…×a=˲vÉ–eN®”|k°¿ê¶‚ç…qž÷ˆyÒE (¶]˾£ÇúitZ<óµæ÷“ÝÝ&ìa™î] t캳ÜÙàZ§s¶lwŠ\d!²(˜ÉÖ'þv54ŠÆªõl˾¶¯b!ÉU6ôýœ/’˜Ç!hŒ–} xœl ~à®Ë~^üCï´CÑOÐ^RÙ½Ñm–é¾å=‹vûï¯ÂõX"s1œìTù.Ù[â:¹Ìäw¹ИÇè/ñѶ_üY7ôÇΠ‡ÛƒMw?î%csÙy°ÄGeCßÏû2ˆù¬Åùg z›¿hX›\(°ÑóÃÀw øZŸê5/ÑÏu÷.»µ°æúì OìæÓ ӡz×_c£:€'ÈòÎŽc°>ÚHPЉJ'_Bæ“Å6­ë¢môÕNÉô,GÛÉІ_ ø¨¯“³·U¯üÔ½æö¬ÛþDüÈÝýxQ§wÜõÿ¹iG1€‚à3(qSPüÂýÛ%E@ÝÝ&ìa™î[ô±wK°_vo¸özM]_eL¦c9b¨íùm×òV~þ~õ5_‚+@è5‘oñUæ’ÇàÛ~®HŒÑÞ çâ³ÌÙ/Eý]?޵"83è»ûq/›ËJò`©O«|èû¹_1§µ8NηB“&ôzNLMðXkáë|ª×ºÆx.»wÚ­¥×i(núÀî¡>,K`q.P‹Í2 r$(89À L†³ã¬¶šÀ@¶„Ì'‹mŒÿ?_=Ì‹× è:ÁFû°¯Ñj‹¸°ç6újÔžÛ®Ïrî£x— ýk@ÇB W@E_pÃþ³û"î5™Û·èC—Á>AVà:g{Bå*sýš\A°¶XË÷Üy~}\⯄'òKÀ8Üv ¿ö½ÿ.éÍ`='ËÜ?ãâBƺh3,Sçò¬­EÀ©Á’x¹ÌÏÿ2‰y­e‹Ž›º{(ˆ¶+‚Ðñy8ZlÆ^ÊU¹Î-ŒçDï·k™%ת/>ù=Ù½†.^˜Üw`Q¨žûðlÇz$)81–—Èl8ÛDûÔ X'>òúiŸÉd£ídh«]ôÖ± U§¾, ´ø©{îÛÂW,ø¥^f‹bß-Ðòý@‹-j¸û"îµ€enߢ]ûÌî/º¾¸ÞzÍKrî³ÜÙghÒY…€â%ì4Á_Ê0–Oøž_ N†Y–éÑ_ƒúgñ0–âlZúªƒŒÛ­…@P–w÷£MÈÚåÁ–º\¶§@Ìí²·|ÞpÞKتZíæœŒ¹J׸•þvï¸kÖëÕïýÈGu/…éåÉGGèX_³Õ£³ÏdHRpR LFfÃ1Ø&ÚHRÆDewd4É©‘ùdq£ñß´û#ÀkÅkW“Á_ûjǨÞÙ°®¦oѡϸ"à'îám¿õåûò.Ú“9\Qðñ»ÿYÿùû 1¾ä†{¢Ÿð -ù¡5D€B pÀÝù¬GåŒÞq¯,sû}è2ØgvÉõÆQ匓CÆr–98áç¤_û |´K„Kî[ÆðI?ƒùÔà¤É0ä¬W[¶[Š‹Å}ÈtŒCû*S[W” ÀéYw?Ú„¬]JúCÇúóùŸ1ÇËE@©™›»c‰-ƒù'äîšû˜W‰ñüvﺥÀ¿ç‘ôs0kÀô…À#3üŽ€¾DÑV]­Í„ü¤à„X^"³álm$)c¢²;2šä”(Ùgq£ñK|3Xg>òúsßÉ¢¯°^9Ô®æËz´ûq ¬Pþß›s»/.èJp!ЂþYÉCà"`Kâ^ X¦ûmÈKÀ'àû‹q×_å¬s2Ö©l×ÿçßÉJ¼úcý5ø” 4ÃI>'ýްq ~i,ŸøØÕ@¬°^íœÛ·R‹‹˜,G{ím–«ni8ý ëîG›í˃‹Ô©|èÏÏá‰y^[ÁR{ó^võ®o+ã9îÞy%`ë¨éƼ(ú±Íùƒ¾xìMÓ_ bÂÙ•EŸa•g°=’tœ @Ÿ‘Ùp ¶‰6’$*šÄ@ÖJÉ>‹mŒÿ ]r°‚uB›×/ë—äˆZìTǰSÓ;)ÖŸ ôYï 5?&ô¯sÖ„óUžöÀýÂä]î{Ö£rðšsÜkëuߢ y ø³û«áúcŸ¸ýÒ.ÛOú rî;þø-޳ç\²_"|\¢_bÇ'þ€çT‰o†Ú©OCýJ8;øCÇmí¯9‚èîCÏ€ÒZT7ô»ûQÈäÁZ]°ÆWåC~^§LÌ÷"Ð"„îB Xã£`žŽ«zm[éÏk÷Þs¨~\’:¥k×_Eß# /Ò¬¯rÖ³·õq„I:N ÏÈl8ÛDIʘ¨ìŽŒ&9%JöYÜhc|å½ê¼Gå¼^º~Üw”l¨ŽmXÇ@Ÿ›%>kyýHÐ?{Ñ¶ã  Ð¢àî:ß·¿pÿAc W<å>ó˜ àôJ$ÿ\€¸×–éžEû¶ûñÞÖkݺئf¸¤ßÉÖðòu: žKöK„Kö3†1KþN€KÀVL)^èjz'S?îó1³©õYÎ:Ö3_ùå·ÛAöY¾ßïîG¡$ßÏýL>ôççvêà|·àsºçRÀ2W¡;¤‡ø2˜¯rU¯k+ãyîÞÇâ¢Æqdׯ/ô{~áfzµa™“CÇm†åHÒq |FfÃ1Ø&Ú§^”àuÄúAÆýŒšbƒLÞ‚ú¢ÝïØŸ0ß=¤—€B€ -@Œê?­q|.¶ùèÛïÇB! Å@ÜkúnÏ¢] öï-Ù@e™]†KÄ]ÂïdÌ’1ƒR,åOÞÒ_W—ì——ð+Süõ'¾­Àý]¬ZüзøÁŽåÜÏä-:g ¹ëQ øùO»_ì gÀVeÓ±» ðËàxÌ=ÚŽlNû}?ΩÀçt PÔŠ‚B!€ù ±ü>s~×ãyîÞƒ[ÂëxÌq2ÜøÁ^!À8Ö±íÈt!HÒõ$Àgd6ƒm¢}ª…À[üñyˬ–9=à-Ôü^å1ñc@ú£@kŠ€·{árŸ_fþ 'xþ›L:ýt€‹ç<üÆô- j…A)ég¾¸›oàt­ŸÔöl ¶ŸÝ[rÝK{áð·&êûó*û-Ï8_—ðg 1|ò†˜[øk·e¬°a;´!gTïì3_†ý4†êÐP¸Oj3õ»{Q’k…ã°¯Ó±>ÓñQ¯‚¹¹ùº8 ÏSQ}Í~-\ ñ[Áþ­8ÿk‰þwïµ蚕pþkqñK¬. ç¾Ê²6“ɃÐ!IדCŸálذ‰Ê˜¬ìŽŒ&:%Jö.nyüàaÏžÏûK’ßÀzñڡͰO ت/÷õw°Ú±|üË@»cK ×ÿÝvÛø+Aÿç.óq¢Ђ€õ W ÿN~ŸA‹OÙµKE@YiÏÖ`ûÙ½eöÂ1Yš¨s’žùªMfüùÛï¯uÉß%þÊÃÁçâ Àq²6Ó:nØ),g;•£½Ž©}Õi}à@ ÐÝDF6Ù©?t®­²¥:ÈY‡>sfÙ~¬­Ñy€š­—Íç øÓÀs\Ë!qÆyÐ{@7èÉÖĹV˜Îw=2à“ñy ï>·«Äß0ÌÅ0â~¦S=÷kv5ÂNO |†³aÀ:$*c²²;2šè”(Ù»˜ÑæñÖ•ìçlUÏ@¯öÎõW…OÝ%ZÁ³vÞÃú€ ‚Œ5En^ É?3Ø…®ºÍ7™Û³,/ÁöÙÞÆõ×}pì=¡ñ]bΰmfrþ}Ž(Z‹&l\òÏ qÚŠŒ»$¸ká/‹¿dܰÕ1ÐwòÏÿ­ö½Æq5>úZJx/AÁ±¤×ö!:–9äL÷èÉì—¢ñgÏd¶*ÚüØ غ Xc6>½ÈæÇÎOò*÷Zç]ƒ×b Y•/ã—ˆ|bV@r „¾Ó³Œu¥>d6šž6¡#Ó³?`$+šÈ@ÖBÍÖÅŒ¶&Kò²anŸÖø·ïyíÐÏXkëоá ö}Ї̵/›7znÛ\¢¹" Dö;AkAÀ‰~ W€Gßi>V·ùF s{–å%Ø~vo%ûà2ö„KÄKÔ|4¾Ãù)°uE@0ÄÙ/Ÿ¶½8¹EŸåkи™Ni7l\|'ÏxáÓç{-Š.~ëù~ u<>–ÆÄ{=?“˜¬S»R­Nûªƒ r´‡þ°–jŸÁ¾Œ³-QóUùÐïž8î0@!°UQ°Æo6¦¼òvçkö®‹ÕÏmwþ ô[ 1yœ£Û…@tâ%œQÒ#Ú*s@Ÿl.=IÝ€L¦gÀ:$*c²²;2šèdÔl]ÌhóøkÉÖ™åªÏäÐi?³]Â!þ_~Ûõã®…‹.J|Û;ÏÚï8¾éù£Û|=,+íÙìSÛׇ쥭p ù!l1üj…À`3]»RR qeTŸÙµÀ¾.N)vMX¦º´­Ÿèø<‡'}÷ƒzÐ×÷ú{r“|¨º¬_²_«+µU¦v äNØf)-qœ~èwÏ¿ ÎZx. †m—°Ôãô~»÷ÞÜÖ¾îãl/_+èðZ0?ýó5 œ=ËXîP[àlk°ßÞ'HÎ-zÆÉè9:l*=YÝxL¦gÀ:$áHX4‘¬…š­‹mÿ?š?Zk†¶¢¶ªcn»þ±xÔ‹ü¦þÆ.y ¢}QEÀ¾íYÓi1ð+>éûêÚÐ×ø¶;žõ ÿ£w?ëa› ûáŸ3Rô{ï|cÊ»/ºÍ׃~mÏÖ`ìkå¢ö–rÖ%ÙŠ³[J–È—lZ€¯+ ëe•„ «ÃÙÕ|2Ô¯ÖWBÏ6Ü×¶Ú´ E@Vdð˜n|.Üoî¾ëõIÒÁmí£Í2µsúLÇÇ]Öw1 gœÍR–ÄÌlY÷ì[ â®…çlU´Ú#ö8½ÐFßÉtoØ÷6fÜ«Œ[‡º›œ3é…ã"¶ÊÖ’þŽ÷(¶êÏ8;øc3éIë†c2=ûÖ! G¢‰ d-Ôl]ÌhóøÊ?ߟƒë¨@çlYÆòL |uR¼õŸ^Þ|Q ômS üÞ–çÆA€¢@ Mþ‘ø× € »/ºÍ׃¾Û¯,¯ûÙ}•ì'Mh/W Šg)®Î>¨%ÂHVK°­—¢~.NKì°ègÇ¥pòm™þ¸Pð[òÎæ¸E!¨Žû™ŸÆD¿Ž>:]©Í2Fõ­¬‰‘Ùòî¹·<¯5`>Ì¡A‹-bö¶»wÞÚW亿•Ñ׌UáõàöE€ñJd>úiEñ—…K°½Âz´k>b³6ž¸n2&Ó³?`’•1aÙMt2j¶.f´y|Ç[þÉtŸo~æ”Ööªñ…óÌp…À¾´}þ­ù»ûŸè§/xóóôùÓ8þÙÛŸ÷@ÏüØ=ÎGœ>C“-Üï#ð=½?éæ ·_Y^‚íKûÿ«}…@à’ùËÆÍ3£–‡¾Ø«ïÒ8 %F-vè]–£}(\ hAÀvJ6·—ÌÇöÇN8åžåœTì’ Éœ=ˇ1km–©³sÀ¶Õ”|y÷ÌÛŒ¹ÌMY[”ìgŒGï´YæäÐñ{%cŒaærU)­Ë±À˜Š³ œí“ï3Ì}ö;@Hîg2&Ó—äÐiGOD7“éÙ°É Mf k¡fëbF;K–KàõÆÚâÈzu§Î]¿škË÷¼Ï‹·;7\0Y!ÐÊWvÅG€þ’ຂ*ˆ¶»'â¹ýÊòlÏ÷ÃEÀõB Ž›’Ó%ÀOÚn¥Å¿7t}§[Ë~fØÿ8. ž›['“ÜsÍtÔÞóÛµØ*|;¿`´¥ö²X*w}–ÃWmkº5¿A×­ÓÁÖ‚y:–%=üÇ8Ø7»=¤Ôu]Ü0^ïcæu)­2;£¯áü²˜ýä=ý~²Ÿ(aè䎒-­õl˜ý“ì>!ÓÏý±“É Mf «ÑbçbFÛ%KÁ=~̯ƒ5Äzº>SÓ'» ^ñ-²>{Þßšÿx»r|þÔàÅïó¸Ö¥¢ ô׆ž÷ˆ³žhkò|M7·€eKÈî Yi¿Ö`ŸÙ}E ÿõ"  Ì·%F2ºŽ£ñ–Æoõwò1jù³¶þ>\!ð§ŸÍP=£óâ¹`L¸¯¨öê·'§ûÖÁ¾w.¶ëg¶ŠÚ´RóôÝú\|NkÀœ3¸ ô|áŸÉ¡ëØ3²ÀhotÁ ëb/`Œ)s»ŠÔÖÇFõܯáb°<à/l]ôËÂ-´ÄÀàÜfØ›DOB7“éçþXÜI§E€&3,/ÑbçbF;+ZÀºaí\ý’žåŒ“] %Pì ÛfVäVK@ìÞŸæyÏìO ^‡ ç§d¶'¨þhÂzg[òG|GfÍ¡“× Ädú¹ÿ|³FûÔ Ïküî%[ËšÞÉûŸk¾0é““oh^B|bà>5à‚@ ½Køw)/û°ÏqzwO€è×ökÛ¸¯xoƒë…€óË’^€äsKWªoa‰/Çm'ká–Ï]~¡È ¶åß!h¡›üìÈràú3[ºG—¢±3tÌC@<>ò8܇Œí£Õv°éÖãÁ\Áã“wõþLmÛ7û´ØƒMw%ã8»¹]UZÖÊó¯á|•Ì.ä?{oùB±,éc]‰ÌVã1΄“ºi@M7ùÏ7j´9YÉ’Nx2jvYÌh»di nÖgv-þ§ÌÚ?+ú¯_r¼ós…€#+¾áö7ZÔ¼üÃ×ãt tO€èg{–åNïï+“ðgEÀ±÷KÀ/7OG$ÄÇñy³uKüBÐwº­ùǘö™€í-xž<ß®3k£6ëÙNe½œîϵôqhlEÇÜ7žëóÑù15=ìºu8úùÜ4ã–DAàŠ‚i¦5ayß6û†iµ »n¬ÇÛÍù*²dÍ؃_.ü)rçïÈlC¾W„ú2†Lm²¾Âz¶Q9tؘ0ÐÍjºÉ¾I£]+8ñ)Q³å˜lmŒÿÈ?˜Ïw n[d™q¯3‡×çW|cÚ.^ö¡ó½ü£w?ÎÿðÝÎzœ.»'@ôÝ~…ÌéšÈ]Öÿü+. ¿,Üü2°žÇãðxnì–ù,ñ 9ë´ñÊñ{¼•(¸h…Ž:gØN8K ¸Ï¨à{óPúxÉØüL`ùZ0ÞØ§ñ»ÖF¿EVb°íÖà„ÏáHAÝ+Ž%¶Á`Û]ƒÁ¸} È5Ýä?ß Ñ>¥B` ºž×9=¢PXEA©0øÚÛÝhq¶€@%âžÀ}¸ýêd$Fœ -_šµ5.¿ ÜÜ2t= ÆãqÝZæÕê2À2Õ-åþåüþ º <¶Qp!0ÿ„à|äî|:ÁNÎ> îË­ècÊØnüš¾w”SÌZ›eŒêK öÝÑgØFuKY[È\1ÐR݉XX§>€ïË-écË\Ö3ÎÖ[ÓÙ  ´ÏòL—1Øws¸ôs튀óÝ-žØµƒhóïÜñžajzÇ`ß׆Œó0×Ý{ÅÙ–P§|žyÏ]£Œ_{ÈyÓ§ö™}" $ƒ´ÊT¾øòº!@M7ùÏ7f´·(Zì8&ìãØRd¸uä¾³ƒÎµYv­ðuæKÂÞ×|‡@|ƒsë·8󺩜ü¯Þu?î_½Ëù ÕƒO½å¼ÇéÀc_qÞƒþ—ݼÎîÁ÷€,Û¯ 'kYb×ÿÂð1 íõc¡sÉàDø2à±³6Sš«Ó© ý8j{)¯xLù9t›zÖç„}%äZ@†¶žÓ¡ð=y ú1äYÀýh;Ø>ƒmÝxz  c2Yfïìºñ¯ãù© øzqA Å@© Èä5Ÿîœ6óéã›=p(q¬$ÏÀÚÏã¹ý<ò¼}]SöeœÛôw88]À:Ø–ìØj\dž4䎚nòŸoÊhŸj!ð²GOçþŠô Ö m‡Ú³ÜõÙþ*ò)É7»oÎøÒÝ_zB!wkÅë©ú(˜™Î÷êóžh— -˜oéäúúpŠûD¿´_{½$nk“®@²¾%Y|—¸o߯'Ú ÆÖ9dsZ+wÇcÓmj+®ÔN‹>·à–ÏôÐ;ßÇdÏÌËÉ ç¾ƒýöÇêú.ñÝùÌ|MŸÎ ºùXW‰ñü.  `´pö—0øuçs$0·CùÒÎ{T>ß_C{ Îã·àÖ•Ybzû;„ålǨ}Ä(ùöÁzñAM7ùÏ7d´Oµ`\!ÀkÆ”dìËrî_uP|Ǧ½s¯' çöFÏ­Ÿã¯?Ô'q_󪹯®¯ãk‰BÅ@Ó%ü úðsÅBq?€è»ýª‰Î¡‰Qhlf²ñÉüRxÜ5¸µ¾H0¦ŽÍeœuhC~LºM=ë¿â[Î{X–Á Ýü³b@í¾·Æ×Bëü1Û騱þ`Ðw¶ô~žù6´¹Ïrç*ÓŸ [+ ¸ЂàÚ.eðíÎåðü¾ëNç=,‹^û£ÃŸkÖI÷^ ™_È¿l÷×qü’]1‚ãQqâÖVmÉÇ~"  ¹Ó«\e*‡of«„.lL–ýõ⃚nòŸoÆh_…B ëåÖPe,Ïü!¿jDòXî~,(ãûï2%†Q dÐõª­å;üù0—wìŽêÁ!ßuÀE(¾íåÑ@qOÑæ½Šdmë„­Vp‚¾.¾2Ùú¿·^W^sÈUvLx<;›Ë’yg1ãxLºMÝò¬ÐO€³uÜrãܶ;Áñ^+ûðPZc;»óuÌì(Ç„Ý^Ÿ\z?ã= ÛÉ~:jý}ý0ƵÂxŽG,-² Xú ÃÊàÛËF`^?wŸóô×ðSô­»HÌÞ-d~GP+¾p—㸵->ŠýD€ #í•sŸqº–8ÑÆÖÐMjºÉ¾£}J…ÀË>Ä_°kƒ6Ã2Ø0Kl™OÚà ¸.ßw—|]ŸH‰ h+ný²5}Ó?ÌÇÎ(ŸvËùˆÓ\”ŠþH ìINÔ¶æ 0Øûdß¡c•ÈÖ”e°a2ù1à±tÜÒ£¦?_ë+гÊâxLºëˆÊÑ~õWœ÷ Ï‰?’' ¢@ p! ºàüæŸõã}İÎéA?Ž$(5f¾Òf›±½[{~/·0øvmšŸëÏŽ»ùd„ƒ÷ÍU Ÿ³$ÿÇ(°®Úîûf}—2Äéæ|ã)÷9ïÁÜ¢àB€?9~ëuÏ{Ðg¸P]F¬M+ÎqøSWðÑ­çA êd;}F)ÀÅɪ\Éä`îäHÂO¹Ðu⣓×~4(ŠWˆqk‡ .·æÇà >ˆb€q6ÊE.¬lÁÅmÁŪ%°¡/›ÒQe5ý!hl7VËü`ö,;&݃ÕÂ6ZMüµ_£T¸"€û]4ý¸&!Q°†ã‘ý© ¦Ø°™¿—[btíÝÜJí8öíÝ|–_ûççHÉ? ¯íLnÖq C¬n¾ s+ÁÀo>lh£0Ðâ¿„Üú‹ÈØ“5ÔVãdð§n-—0<œ ذmÖfœëAŸq븄½OtNxèø¨öÎ_í¹Ïvá‚Åda¹’ÉÁÜÚpq¼*…ÖEû,C?Š€¬øqúÅ“[[!À|óîw&”ìOˆrA ë \ò à"à­v_n†B •ï~éyʳBàë^9%ÿQ0o=Nø´*…À¾ítm0×|^5`¯ÇLÇú­vKá¸Ùµ±Cïâ@~™¸BE@Ñ®*‹"@ |à> 8%ú9QB2›+'š’€²®×ïb)úN^Ã,%P˜³ö{™œçV ¾âÖç"éç@I¿¬Û·6‡0Äìæ¹’ðÏ èŠð=ï‰v€mx1%]†ÆŒ68¢ÀñÉ÷9ë‰vàÖ±•êaÀé´­vj؆õÚÇE‹ÉÂr%“ƒ¹ÿò«Tðúpý8¢@!p9øT€ ¯¿½O-Àý];;Öhµ[‚ÆtcÔÆ =Û ÜüñÓšoÉ/?¨-nîÓW 8¸@`yéÓ¥{àŸýœL’2ȧuvû0ú>>„1&Íóu2Æ÷Öè˜ý¸f­ŽÉ8î.é×BÀn²ïüw¨.íÁ¡ q»9®¤ÕŸÏC‹Ö=óµæ}Ýg ¤Ë`ŸhsP*âø³÷ŽÀ­eb!Aµj²’^mè∠“#Ћ9ÙíËÁ܈¹YÂ^¢Å&pq㸴T§~O{àYO´ÿÏî/éðÇ^ßsçóô¯5øÇƒP ¬)]÷‡<ól$úúc@@ ·û³óžh¿Íÿ|P –ÑF!ѯšÈA–‘éC¾¤ó8ñçä¿w.-°¯k—d¬«±Ä¶—Å/É¡ã#8V!àxù·ÍÇÂ7þ*Hþµ@¸Ojœ¿úcgýx"ýÜ()qt/­"{öò.Þ‚1ön®˜/÷!mwçׂ®Ë¡¸1·~[²7^R ñçB€áw·2ÄíæxAè9Eòt.°Ñý†=çä%Ø'Ú(PQ ¢@!0‹cÖ²ÄÞï”Jèjz'ƒ¼ÔgàÉB¹’ÉÁÜÚdq<´¨éGŒ¿´lí?y˳øÿØÝÏzÐPd øö;Î×îZÁ}*Àèïh1€µf¸`úëg=Ñ~Ýß:ïQ›yÙyúoú‡S;+>ºkè+K‹‡&p•(Ù †Kö[€ šøg›áÎa ˆÁ±jmçÓÂRû+‹íä!Úgnþ„e×b+¢ªÓä_û TœßòéS»+Ûtû“¤Ÿ%ŽîÅÕÄh/ïâ­˜æÓõ‘íÚ܇]ß7çì`ŸÎw .fàÖóú˜cÒß­ÏÂB@ [ÆÛ ±»y^01nV08ÿÞÆì½VØžcf ÐB€ýÝz:Ò_æ¾I§³eÛ9J6¡ÃBÇdr½*SæþÓ‹ã©ýõù¼[á" ÐBàßb®¿ÎDö¥b\dp!€äŸ 9Š€7zîÐÇQ‹rÿîUÃ…@­ˆ#®@¿„&|Ž’ÇrIþ8æ×'ÿÚ–pó_ ÇYÓæ~+k|§7³å#@òÇ5…ÀCž‘ïõV²"€qÅ€Ú´rUŠÐϱt/®&¬¯¼—eŒ»›o³v4ç{³†ó«aã˜5^Â,–)ygÛÈèóøã¬-bwó¼`Æó3:ÇhOûŽû5–Ú2%·¦LZ ϨéÄcX^²ÁâÆdãÜP™2÷Ÿ6WOµ`°&5ôÓ€À}"pü©Àp<ëmðš¿:Ø È q …£…Qh!]ð/é»>þô¨Z  ­p‚W£fz$ä.©oóšì;Ô§„›÷8–ÆÍt®­¾-¬ñQ\Œ,.Ë];ŽÁ-O˜_¿‹øDàõ~{~(¸È .fró;LöI@Ð=èOš~Ž’LŒs7 ¦£·5ï^6‡0‹·›3æ¯ý¾mÎù˜`n5œ/ã|·þ%f¾ ™oW0½ÌÌ{ †ØÝ8W€q}vû íê“¡~5z³¦`¯xêýÚ7m‰yq~2šð#Áu2,jLþë«L™ûO+ŽW¡P>­Kp´UbàW_s8j!ð·Ý÷ùšÛÍשÆûÿã2ûS‚÷Žú{ü©€- ×"pâ¯E@–ü³Že®@!ðI»" Š.€à;^6ÉÐÕhµ‡KðKÀoðõɾƒýj¸ùÇÌÚ%ÚjßÊZ?àüK1CÐwºà–'v/ •“sÙü©³‚€AP+œ<èô'O?Ï]1›»I,•Þ®ðþ*WŸ%Ìâ¸DˆÚ}ßœóeƒ¹Õhõs׆í Q/É¿ÒÛÈü¶bˆÝsEÀšÞ“¶c¿Ç1ÚšuYpã-ç=N÷}/Y6a€$L1•c1c²qnÁU¦Ìý§MÇS)X¼Û_Ïç 8ñGA Å€ ï¹ó=ª¿–À~r}Þo@¿aøw^oZCgd…Û”pÚ¬°ÉˆBÀÿzá=‹d.£Å ¦KöØMö>Ñw¨o ÌKçzOc—ú®­öKØÚ·/t¬Græ2 F‹€RßÑRdÄ»ç*ÐÏ•ˆqþ&¡dzy÷èøÈö諼•ÞG œƒö‡øÝœ¯ ˜‰ÌÎ]¯^ž£Ì$ý½½Ìy+†ØÝ8WŒqi:`ׂ³×xŒÚ‚]!ð‰V©<®+§SZÿ,"'U|D ˆ Ü"«L™ûO*ާZl+¢Ñ¿ ì#ÞOªÓ¶ò‹÷Ÿ¯lÙþ¾OlP¼æ¯ ºRð†Ï=ëA_“{î£ÍÀî&¹ßëï§> . {·¿þ×ÿ&úÉRÒ9oËÄhŒ:'>nÇÊÆk飭6KØÒ·+t¬G?¸Ë÷Í÷éÖàyî@b2“i-Îÿ§ö_½kŒ¹^ú¹šä¡{i¥ôzyï*°aÛ1ö®¯òLïèíLäd%Üš\%Ü9­A“üVF3·Câvã\1°&ãÚö¤þ导k¾g³­ …ÀMh•Ê!E'O.™rý8bñpñ[`•)sÿi3ÅñªôæþFÿ¯ k ¾Z{J÷ë´]£f‡"ÀñZÏ<ß+Nì]²ïdÁ‡¯ü&à(@ô×™¼Døl•øU"›…ãhL7FÉmç·„µþÎ/“';„—=zÙ5~ñ,³wI¿Ê|¢Ð"àüæOžÚ]FÙ®âýsÀ|™î¥µÇ¨“wnlÕ}–1¬Ïl‚^G‰ÚÌc8Wú[#.±_KÏ¬ï¡ q»1®ãs{·áþç=wô…À'¿ç#g†%~`áÏ„ÿ¿¯žì]òÅ2 žåŒ“)sÿi#ÅñB ¤shÌ8.)¢ÐB ŸxÃÙÛ-P ¬áS&b—î1´õÈzEulð1HúQh8Ùç„_e8F …À#žw>ýGýÍãgÀnM!hâÇý8–Kè—Âñj¸ùÖ×lk¨­ïdÜGÛù-eM ç“É G›ÁžÌè„V~xÆ· É>÷œ}•ZÀÄO™~Ž”0 ýN'E€¾k[`?cOä lÔn”íæGãÎýªãγ…[Φw…Kì×0Äõó<„!n7ÆCçõf⛑ñíÈß—ÉæÇî1µ¿ê¶g=èóþæ=2y_¼÷#5:M¬¸Ï°O¶P¼ˆÐ«L™ûO›(ŽW¡xÁ?æœ}°%ßÛm¼ ÚŸÓ%]Ú€S(tßdû)ƒíبýŒ»ýà°&Z°MÀ‰>Pë£øˆ—?aÔ_T!ÀíFÿnŸð/lºä¾ø·à棨]«Ÿƒ}]œ–±²Îv)KcÔæÇ}–Gû>»™cº^Ê{Ýî™|(/ûŽ!NÄj“á’þ¬ï@ÂÏ…@Vžç)²7ß ŠÀþc|Ò—ä ìݦìqíÑÆœû)ƒyg,µQ€¾oû5 ±çsÚ‚!n7ƃçíà)÷ÚKÀžæ½íäЩ¬/ù˜¶ßXÃÛ¾pš'VH¦TÆ„^ @Îz•)sÿiÅñ*Ï}£ýµQžzßÁç Þp8>ûag=làÐB T \&¼_XÆ:Õ×`¿Ì÷Nßµ¿Q€è»à?>ÄCbÏÀ†ûNDÐZÀd…À¥ øÚWMñ5Ù«1úuûÆ:—è;«7—ì·E ×w²šMÖ>„%qZæ‡>™î!·Çž¼ØÅÅ[ú Ð" Ó1\¨.ƒçzŠÌæ*×Pß±kÐ8YÜqFÇÀŽé6æxÜïÛæÜ/ Ì»„óc2{•+\£ÆØŸï! 1»1®:o¬ÏSïwÞƒþ¯ëa=,w´~"p ð¾áý¹Ók›õÜWjúŒ(˜eI>pzY!m-\1 ZZ Ôm»=S¶.ùÆX7Cç±õ_¯Å­ }g»–ÖX™›˘î!×£òŒx6N×ü‰á@òϨMÙ'úÜàyž:ãœ7.€ÆÇ#™êZôL·9g°l´1ç¾5«„ók!‹¡r>Îeó"Œv&¹_ÆÜ’!fÿ 1®k"¯Áû™q¶z¶ï ¯’/;&H¼ðP|ç®ê œM´³…ÑEã~ÆÜÚ8q¼¨BÀÅŒ£+¾à†iÎÜ%ô²ZÀº§ì>`žt¯Áÿën?¿ævg#lWã3(a;tezm—lX޶r~›g8›ÀjÀN‹|IÙÒB€?¥B Ÿƒí]Â_¾]gIlµm×"ã¾³_KK¬Ì&än^;ðÌu„.Cõê«dv¥{×ñ™d¿¶àçÃçsç}„"¸¸µ±ÆyIßÑmÐ*íÌù·‚%œßZj±Uζ¬›Ú¾½Iì×€±·dˆÙÅ¿B蜣ÿGo6ñËÃîˆyïòþma¶ß»v_è7 }(r€‡&?éçÉ>'ü™œáB ’ÁÝtÒ¹"À¦VàˆöOýíny³?ÚQ K Q¶Û_Kà˜kàyl‰‹]¯Õ'‹ÓbËý,Î!ÔbfsÔy]7ÑåÚ*ú>ñÏè}Lr¿”iüi·‚˜CÜnœl[ÂùnƒûQpQ öÁ×ï~ª£´_ï^\X!ð·&ñ’÷Ï'ãp År踟1÷ÇÍ0È×™¨óyÆCÛ(´øí×›÷õÓ€HþÛeœÊ'ÚWT¯v¬šÔs¢¯:¶QY†KþY!Ø…@€"…@ …®øÃߘHhlW²u&T|^¥ñœ®&‹v‰›ÀÅE{Kx<•kŸec¿p/eè3úJ1yÌ­@AP;gÞóÀÍñ”Ù›!‰îõ&ƲX,6Š€ó_h,ùêÜõ<ºòÑáñ–Ž™ù¨íÌv:úd¿…Þß$÷Kqs\JÄÈÀ~Q¾{Á¤bߎñžWøŸüµ<\b^È'¿÷†ç=N—‡«. €:îgÌý±ù¹.igÛ8y†Æ ²B @1ÐZ,EÌÿ–_¾Ãcæsxò½½ßeƒ„„Élöåy²_ÒmÁÞ}ÓHôµ¡Ë ÀE€+W 8P ¸dža½c´£ä1IæERWuÎsWjöNÎzµãö1Ðø:6˜é ÷Z ú¬^KKÇ»xÏ7·«ÀÞyì’èŒ={³•Ì_ÇÈxÅ7ž8½Î{ŽI͵œÏ·Þñ|$úßÖèÅíÇ­àø<æÜ}êÿÜ}òsù¦;,;Ï×}“³Óù · ,‡Žûs܃ü” ýrðKv?tå HÍ®”ìgò ‹ýþœIw¯' Q.JÅ@ȵàß\!ðѯœþ h …À¿íôô.‘œà×pþH./ƒÚø¬×69ëùÈòË3ýÖð®­²-Ðçõ–¸ñމÛ÷n^W…aþ»w&%Ì­` €£Dæòø€áq.¸Èæ9kS’¹ŒœM 5§G?ó›ë}r¿”ˆÕÇ3 þÆ82çaÿ›¯sÞÿ­p{ï˜`LÇžõÚƒ?ïÀ}ßehßçÝÎ{ ¿^ìäW©þî_Lçó‡ov6Ù““Šñ¿wÉiíg>ÄÇÿ¦;ìË?f÷éÀ Ÿ”Ïé¢á" Kð˺ý¤že,W½ÊKh<Q€èk€Ä>+pD{-j…@´µšÔ/Ac•@RyÙÔæ¢ó¬s>|Ìdè—dh«Í1à1ù¸'«ÜƒKÑçö¡ÌbS’×Â’s*íy7¯«ÄpÓùa ±žKAœ1žSqv!Óû¸" psÚëS¢ÙÇ_ã¯Ôâ8=Ëj¾ÓÑ'ökécš)¥ù3a—ßw—ó‘èóï(º·2ݱѱŸý°ó–ýêƒÏ{X–Á1Q ÷~·aí.¤xÚ†ÁÖàrèЮ1÷Ç 0ÈO±haIÐB(¾óNÃñßÞ¾íú}úÂäo \™Ó ú)1çÝéØo @ÏE€ÑæÄ>ÐBhpï'±”(j…@5™_ Ç?$œMmìÒ<Ño‘"C)ìßJcOžÜkkÑg÷! ñ¦„¡;Y²×BéÜjûÞÍéª1œÇtž¼~¼žkAÜ1¾™CÀºhsíMW÷GÙnïdÌâýRZã9=ËJþÐ GŸÌJÄîã› ¥ó0N€dù·_ï|„õ%xŸaqÛÙŒÙÊ Þ|ðù]Aäbìs¡…À1à“â“,1÷ÇM0È×NVCc­…¾á·å[~ñ ÃÏÝ}“0óE7œ÷°ì£(ÙçB€‹Ö‚à"ñ‰~ž””’s蹯l‘ìhÀ…@5¹Í_Žî-˜\ hhbß ü[(%˜ÙË\Qû­Èb·Œ9ë—´õˆ6÷Y¦òìׂú¹X|¯mqo}vÂoJº° _ |Ž­{ßÍé*1Çt®ºvÜߌÃð|x^ïMÞŸÁ¡…@/ßí^§;„Öx™Ëjq Ž>‘ߊ~ “à/!;Ÿ.XÎüôkœD}–kßÙŒ~ÿÏ{¢üÎÙA^¶Q \/vòS,~’~¶ë‹wŇ‹þ`ƒ®`¾õŽg=,CAàŠS„‘­8ëŠÀé2àÓBØ/)$þú©€+ sè§ ’$8-hŒ³$2yq³<ƒíΧçË1õÈ6®ïä5ÚzT½Ó9Âf 4¦ÞwW¥PºÚKüZÈö¿®»›ÓUb8‡iý°NX3×?1†Â{’aWüÅ/|úØîÆ£v£ýn-¶`IÜ’Ë[cMGŸÀoIŒÓe’üVô¼¢ÿgow>‚1‚ç¼îùHô÷ Î{¢­Eïs•·Ú Œå`›çîþû¶~W¢ÀdU9Ú5æþÓfˆã)ÿCþtg ú/ýàù¹à±ùSÜÎ@1ðïå¯\|V÷â XÙ¸Bàü6‰>’o´èjè8.V áÛR`œ€1…€ÐxÞ¼ÿz¿ýøžhk1ðï^5ÄÓä}l–€´¾¬ÑWy¦oAc8œ_³ed¥¾“×dhëmî³,ƒmK8߸÷ô¾Ø}v¯eŠ7%%º…°É_+º–nNWá<(Ü­Ö 8Ù±ˆ±xï2¡S^™|"tNã¨M¯ß­Á,™Ùjœ–˜°Ž>q?ý˜&ÉBWÒ° 4ùg²"LçßÅ•½®rgy¦ÛŒ“—ÉŽ¡\/vòS*.Н¾íYÓ:YòÁEÀ%åJ-±Ñkˆ8Y!ðKókÅÊ;üùFP|Ã+ŸØQ p¸dßÉzyòÂeøÅ쎬W}Éf 7ÃùÔÚè×ü3™ú¢­GÖ«¬ø©¿ÊëµàöVèó{ Cœ)*Ñœ•·­››ÓUc8I$MòœÉŽAŒƒýè=(Lç8ks¿—Ѭei¬’½Ê[ãÂn8ú„ý˜Ä¸ýØ•D)ööç=NàOØï¯äÝvmî³>Ó©lKjñ¡?„“-ðRÉN–åhטûÏ7ÁµPüÂýÎGT÷]¢ÿ¬×޵bàîrvËcOðwNöµ`]àòVÔ÷"^VÜçÉï‹.P¸bàÁ»ß!ˆ ŽQdŸ xß¼i$úšðŽÑÛÉKÖá^Ê|ÔvI¦„ ãl¡[åè;ùRÔ—ûîˆ6¹£fËòì8¶)éG _‹ÆÐçøÿ饯1Y6êL¸<ëy.W•á<$yÚ­ÖŠ×LeÇ ÆÁ~TB·–.ÀÞ8ã‘Ö` ³øFŸQ²W]kl¶Ú>Y¿úñM1„n ðV®àuh÷÷3Ù–h\/ø’Î{TÞÊÉ"8ËÑ®1÷Ç0Èk…ËYïä%8&(ë’±@åàþå0—ü?徃ŸÅøÊÛîÇ8U²d_å¬kA“—ÄoEÄçB `™+îÿ Ó\9ñ/Ñæ p@}oÓð‚Õ2=Û9Ÿ–X ì—ú)ì¯G¦$‹£ƒu/|útÍžÿ[ç=è3ŸehgG}†u ëKm–:*€Ú¬Aãé³¼•ÁwþÂÏì”î„g ¡Ã­ ãÆºJLç1Oœ°&¼F “oækï`=Úèqì{ãp»ïÓ:ÔXãÔüT·d ØGŸ _$ý<ŽP8tJ|A%©ÖûÃÁ÷Û;y ø!öwÞihY7Ïò8N_ºve 65æ>¸ùeè»Bà?¯HÊùç#ÑB@‹¶¯ñÍæû˜¥xŸ"¿×pl²d?“+µ„Å%îÇ ÆâB€? ¸ý×@ÏEµB Ž.ùàS{‘aÓlÕ'‹±4>€ß_µoi³ŒÑbží¸PJ·Ñwr–©Ü¡vêãtðéûæªÝW%Z|õ™^bò™¿ü-€ ÓøžL×¢—ɵwñ¯Ó¹H2i’e&“o愽©@;†m´ß5öÆÙëÓ:d ¶Ó•¨ù9ý’qØvhûäü¢Áy­߉TƒÏ›ùŸ’g}Ⴄºt¿d6™¼ÇÛŠ_èùHôOþGƒ‚¥‹¡ æ6ó±´p²4f×ïyÏýMhÀÅ@ ßsçóžhG!Øæ1]?@ÿ=îÕ JÉ~I§¸ÄÃ%ëÇ$ÆD!ÀŸpÀ…@! Ÿ p1€ßˆvKò^—¼D¼@[aõ/Å[;^ß,F¦Ëú,ýº{VïcèzýÎ>¥b ÇpGÕ—›šŸÚ ß˺û÷Ú,;ŽSŠëžïÊd;>9[†mÕÇé°°Ǽª ç1%“XËnSØd™)é!â¼_ÖÁV}²~×Ç@›e½\ÖkRÒרù9ýÒ±Ø~hûÄü¢ˆ9´Òò‰ÁgšçD€ó͈ï]ªûÒ]aà~ìÆÝ/zµkñUÂþÛîx>‚?`¾í›ï°/ká$ 7y÷ðoÅ-f0·™nˆ/ðì¡ÎrèTÖ‚ÆŒ#M"ð£:Ÿ¿[‹Ï¥dMùã·h_/~¹~ÌíÎ{Ô†‹-.›Z²_+.I?61®~oKúÁÛÿÙÔsP*ÌE€}]œZìCǃÉìœLÑûÚÝõQ´ü¸Æà¾¶Yƨ/Ëk2øöòÝóÏîC¶'“ÁÇ=çÁ Ÿ?çk>Œ³ç8îÈâÈ~W•á<¦d’׳Ûã1£¦_JÄsûdrÅÙñ\¹ÍôrY•-¡Åßé—ŽÉöCÛ'ç—AÌG9äÇ…þô­ÎGœ|÷î?<µøÙ{Ÿ°ü«owÖòÀÝ7³©ùdp¬VðãCJ|3¾…ùw^ÿ¼çä4h n!ƒ¹ÍtSx»»Ê¡SY 3@ò  Ð"àw^¾]À…Õ'ÝpÖÃúµüÇ…?ZtLJ…à„Ááb¸„ýX s(©Yü¾@mWDÿö_÷øøNòÑ×ä¿—ï^‚%ô¥¹Žãb¶Œ³Å\"ÈôN¦ð=íîá,Æ‹~f¾/Q hAÀ6Çà˜*g½ê'wöõò]RΉ¹ÊAc¹6ú {Þw¥§d瀽ú°œŸëØ û]E¦ó˜J^ÏncLÉ1%ËJM¿„ˆ…ýÈûdrÅÙ…,è:ãQéå»óG{ -þ™ÍšqÙghû¤ü¢À¹‹Rð½]°ìçºb ˆ¶Oº×YËøþP¹Þ? Û´ââ”øŠ…?Z~Ínñ”¹ýtSx‰gv–C§²8f€ãÿ¼ù¥_E€L(¾q÷¿ø(þë.ùCüc÷˜Æù¸.Á1ß}ç|ÌSGNþaã’öc0Ìgÿ›Žæì èPh!ÀI?3êéÅWB_–‡Àñ²Ø-c®ûñQcqzßÓ|z‰Éh1´ ´(à˜Ù‘½¢:õSκ{)`™&è¬k¥5ô ä°Ñg}wQfÏy~”€=ûD›¯1?×±ǺªLç2%” —srLɲ£Å¦…ˆãö.ÈäJÉ?è:{ã2nMZiñÏlÖŒ­>Cß'èÇ&Æ>EP€Ÿyóžhg…ß#%Ô¾K`æï?èûñ3îϪþöÃÏG®|!à-cî7ÝðÙƒåЩ¬Ž àÌïí¾ìûïzÖmWèWis€B ˆ"€ Á§íäZð‹öAÒÞŠ&ü%àã’÷-æå‹&ìP ”>p‰?mèeWB_[ q³qZÇ_2WµU?è!GûŸß®‡õ »§ÆZ¼èg†ëó§ÏïÁ ž³;jÛ¡¶Õ£`Ø>XóÌàg Ú,s°¾dÏÏø¡ïß Šóa?Óy Í±®*8§XC¥—K¢Ì}¥¦o!bðžD»$s”ìBçè”ãú¾Y“­¾™Í!ãÎÛ>I?61¶ã"ÿZ!¯ÃïtùP;. Ã7o»ß2œo¿ãyËþïÛ ý¿xÇóÖ]ÙB ¤‹Vbî?mˆàT (lþÃîçÒp,"…Š-P D!€b|½PÝ· ŸîåϸD¿•ðw ü s󉿃ωqI?ã|2Ü‹qKtŒÒ˜KæS›¿Ógö°Yà~v~¶ËŠ À6üÉÇB;Ž*w¨-·ÑW¹+ø‚&ò®ítŠÚüŒúþÝÀ°=û°¬ö\çxW•á<¦„’éu’¤sßÑbS"üyO¢]’9Jv¡ ºŽ<š5Éc’Ù-¨ßÐ÷‰ú±ˆ1•¾Û°ŽÀÙ}¿ùeØ-À:hð[¯{>Y`y‰ìUCï¿VžõÚƒýß㼇u(J\/HVz¸;ÊZà˜Ç…À¡|âÿ™Ðô¦sIýZÓ%ó‡0ÌÓ'ý˜ËàëÀ¶5Ü ñ¸±Jã/›;'ƒÜÉ‚3j— V8vF2W (ȘǘdüŒ.=×9ÖUf8—)‰dzI’k´Ú9—÷+Ú%™£fçæÈ²h÷}³.ʻ̶5†C}‡¾OØÎ+£Õ®Dí‹k¿püœ‡zWèw-9¾ì¶ç=ÑÖ?Gz.©W¢Nïx¡) ®ÿhÉJw•s 3È »dD¿ö?óñsüŒ³ÉxÊ}‡µù†ÛŸDÿï¶,Îeãù­ˆø.¡_Ë0_ŸðgLçyxòðâÓ—á±Ð±Jc¯ŸWCåÑDEÀ³ÏÖÇÿøÓ3‰ -þý?ÇgY¦w:'Sðsâ¯2Èk¸¤Þ¡6®Í²@Ÿñx”€­úD;+ ïª2Ë”D*½>I–K´Ú1ჽÉû3ëg´Ø¹ù©¬ï›5¡¯Ù€’]k ‡úýýdý˜Ä˜È/ün"tkáä¿ÆÌo·A€mðu¢¬¯±e1°%Q ø«w=‰þõB€düp׼ʹ¿Žh!ð»$œ‰"€aݯ<¸¾IŸ÷ˆÁæ×» Dû£Í8g+“Ì‹Â%îÇã¹Ä~)ü}Âïì·)ð²s}~!£6æš9á\@fƒcÀEÀV…€ŽÉã\,A‹–#ˆ>Ã2m+.Ù2ú;\Ÿµ—¢Ï÷xÔ`{öaYöLG›ã]UpN±†½^“cê—Xb„=ö¦îU×Ïh± › ëŒc£=“%k’é%Û%qê?ô}Â~ b<ðŒ‡ kÆ|ï]öe-pl—ø;Ø?V“ è~í5§vÝ/[ðS÷šâÅ/¶ ô{”Ç-xn^ùB€Ñ‹£Ìm§›dxÕ9ÛV8fà W (î‚g?쬇eÿm—(¢¢@!àâŸ(_ qÖ].Q¿(b|—Ü·2Ìß'üÊt¾Ûú²C›åh¿6æ’9…-p2ÈÑÖEh-Î?§«cìwq˜Q¾{8£pÅ@üþ€þE¡Yì][Çdãl÷ú»ùrb¯É>·gãì8ÙG»&ƒm¶C_ŸïÝÅ­ÂöìòÚ3ã]U¦s™I¥×krLýKìÃ{û³ÔÏXb×5ƱÑfY/×õ ~’ýÒXŠód>ißšëPð§Ó×âŠY[ÖÆŠ€ù:vqä^Y§˹¡øX ϧ6¯?{»ó‘è‡í5Uº`ßn”ð*çþ8f …€ã›îpÞãtЇòoîpÖòË,\b~`>.ѯ1œ‡Oü™Áî°À½äÛ°mÍï\ì–ñZmØ.ó+èƒC? û»?Ž®ˆ6÷]!Áã¹¶¢:×ïe»ù–yÀ6LM§ ¡,szÀ1ôùÞ]Ø*°SŸhóó¹ô<‡ÏUg:Ÿ)YRz½IUV¢Å>lxobºv‰V»óÂQ y¯Û­Ú-Ôì—ÄÊÐCß'í[ƒócœ?&ô-¹M cq\Nú‘ì×à5Â:1®€ß'ޝ»ýyÊ¿`÷Ÿ¬%ÿ§Þ÷¼'Úú{ú{|ß2l£ ×D!€“Ö…`ö}ö/.Ù/1œƒOþƒéÛ» [6·eµg:|®2Ó¹ì'?Jog’d••¨Ù‡ž÷&ö§k—Xb׊[“ŒšýÒx.Î ó ô±pc† üBW(ÑŽOÛ(™Ù™"€aöc°nh+ÐEá [˳6Äø£7Ž¿ñÐóèÝýªÀ…@ 'U<úNÓâ2|r*oeßw~1ƒÒžål·h!þ×íÎf°.…ÀµˆKÀO˜§Kü™á\|0èŽ_0êïbß‘ÅkGçÛ/Ú.éW¯„%8AÕdõßrÞƒ~+(¸8àóu²’žû£ÌmMعÏÀ8› ¤ 8Ï m¶úlï.nØ8–Õžçð¹ÊL粟ü(½IÜUV#ó 9ö%y3¦Åpì®aÁ¸½Y¥f×§†‹3È|ò|ÑÄ\Z‰ïÑwñöa'þŽÑ‡ú¼fЮ閠P(p_꽪ÀÏq¯÷ô÷úçûv×? Yé!Ïr¶[‚Æ ²B,)”§=pðÓO~äîC¿å;>w—”~zw ÿФhÛ—pŸ2˜·+‚áœö‹€‹.bp,w«ñ‚,Î’ø˜Oɺ8º¤ßÁqŸõŸõƒÖp‚Êm®pŸ l£ŸzÎzÑj7¶eÎïqºËÀ%ÛW˜{K!0ôë×TÑØZKcfcl1v)Fkü°kÅ%üðqEÀ¡pÒê n»B €>¨ºN1%N´y»ÄåÚg;>ªŽ}¸Ïrs ôÙÞ]Ø"°=ûDûz!ÓÛI¢dòê}ìKò8f6Ì>v½ùìõͺ%h±i%‹5È}²|QÄÖòw:Q‹í$ùWØnˆë×q-_, ÿ—tý€e¿÷†ç=, ø¾äû”åJIÇÜý}›ë…ÉKy–³Ý4&-…óEÉÿæ£øº®`T¯|v—„,ãBà ;ÝÇ4ÄÚ—\_5p.®€àÅS/¬­Al#óй”ü[b‡ púz—ì—€Ÿ+Z 6?#’~ý4À¥B@áswmÅù­!KÔÔüAIÏ1}®w¶lœËJÏò>Wé|扣·£ÄdòàGÞ¯Lè /Ù5}àbE;è:³y1½,[#gZl–àâ 2Ÿ$_1~}Kî÷Þù¼'Ú¥O”øùø;ùn\¥·“äß;Œ£ë  Wð{O¢ïX ߃N¦÷i õCûîï;œCÁÉë^¶˲“Æ‚´0÷ó´ô g9Û-AcR(ïð€|s:þæÝ÷íŸûFç=èíÊI:%\‚~ÑÄ<¸˜Í^8x1 CÇËÆ?tn%ßšŽõÎ6d.ɯ؇0Îiw?óÿ¤+®àbÀè;Ù8vwD›œõÚmwóVØ&p zàtêÇ}ÈÔÞÉØžm ×çzwqSXï|XVz–Ãþª3Ï<ñÉèm%92y+˜ïO†õ%» U¯vѺÎxTz¹¬‡Ê-6KÈâ rŸ¬ÃEáæ Œ¶’ü+l3ÄÞ_Wú_§_æe~➃<¾Y¨MÀ÷ž¿½_ .^pò…à—Ž[>Áæ¾ó Jz–³Ý4æ–…€ï'ï9œçWSbßR0_äO\½n¬ËF_4üR:&<–Ž[›ÇÚy–ü2]ÈUçú.Éoñ·Ä%ÏHþµ@ŸA¡ÏºR¿—íæŒäŸÏû.1Ï’s–© ËØ–û,Wnü\ï.lØÀžýâÈÏåÒ³œc^e¦ó™'<%zû,I6òVŸ÷'ƒy¢­z¦UïìBÖ5Æ£ò^‡uµq´Ú-!‹9È}b|lblü¢oð³÷>ï‰öw™ó_uÛó–×¾KÉͰ¾oS⯌ñ¨Ÿ­m­Èp÷^ z|aòI b0Î.8ÉB@_>îôkÌ}ç”ô,g»%h̬øñ{Ìç¥ è èÇ‚>¡k¬çà¢@!°õC!€±ùúl…Kä¯fç¸{¹”ЗÑEÀãêjsZ3ç¥1£ï|Xm—à·€øý³?¶×ÐÝè{²ì^yõWœ÷ Ï‰?’' \!𚰌רž½:g–CÇ 9'âŒÚ€šniŒhwrwœ®AÈ2XûL¦Ïq}žÃçª3Ï<é)ÑÛ'I²“·¾ÙV¹Óƒ’.¨ÅyÐu,Ð÷6fm˜V»¥d1ù~R|Qà|[øþ»ž÷8à/Vå RJsÙëSÀ¨nð¯-xÆCýoÒ_þñ] ú¸Çô¾cà«ý¥pLÆÙî O´ÊSÁM^O®ÆÜ×_P}Ø«Nm–¢1³B ãó“Ê‹§î6œòœ‡OçÊý§-¶Æ%ÐWñÜ䥒Á/ ‹†Çws©Íoé9´Ä+õUG—à·ÐÇøìáØJwCÏŽKAÀ…@àí-€® Ö ¨-Ë9ÑÏÐb@õ,C¢Î89ì¡c–3ÎFŸéÝNa½óaYé9àw•™ÎezGÖèíM’”t%Âooo&}Õ1-ºÌ&ä­¸uaZlÖ’ÅäûIñEsøIúßñ§?è¼}Çî~Îþëo>¢6Kà¹ðÜF%üŒêD€"€ùí×;ï‰6 €@ï3î;àWâ[ïxÞãtKb…ÀMh•§‚;=ÁsßùÍ‚$¼ô°‡Œm–¢1³B›ð×\/áGw&4#¾4 _ÆDÑ€Âá›vß(\Ã%À­°ïµÀx^/}]:7¯–¹¶žÏ’X%ÛÐ.Á¯ß(¸xõÙÿolo hW¼ú˧¶&ÿ®pðºð‘׊QæÇÉ>Ú,c²ä}µCÛéÔFelÏ}Ð=H¥ïßëËJÏqþW Ì}8Γʽ½I惒®DøaoîíÑ]›åh+™ÎÅa]/ßí±Nh®?šu5ý!”bºyâ{Ä<øEaü²pŒÚƒïéìƒhë_ÞÉÀ‰þÿ¹Ëù ØÕpãëü`ƒ"_ †"€á" Ð5Àl3ù®ÛGlžÚNú5\ FçúBà‘9íßpð ·0÷Ý¿0ü°w|ÈÔn Ó¨˜õçâð³f?!¿HÌàkªŸzß}›ïjü&àïK¾h,xˇ :—g°¿Ó_Uø¼ZЗÎ)¢óÌæ½ä|J¶5Èô.É/1Æ3€ Ó Øyl‡»ÇKd…€è3Y!€£Î²’M/ß%²YB° ì\r S–±}•³^ûÝžù@æPóaYéÞëwspë‚cÀcž"Ó<çÉK ½%ÇLIç{Þ¯ŠÓ/‘©|”ɵc:ÃqnhÏdn=D¶5¥1Ý~Â{Ùļ‚?{»óžh¿èQûëí Ös,­òLï@P"¾”_Ì身L ãîÃcÃcö…Àco:í/sðI´0÷Ý¿(ü°w|ÈÔn ÓÊï¼þºñôõDûOÞÒo¾Ï O¢l“á’ãŒ5>§ ¯A üÂ9uÜ|³sXrnKc„œuj½Kö3ú&ñWûP Ú¤âsý=͉?’íƒ(¸x­XË÷ú4_zÖ±,ƒuÉAͨ>ü<úù»@ûìG~&óóÛ=ǯ¯·yÜSç블ÞOdPÒ9ÂûSÁ¼Ô‡ÌÚÑõRàÓG¥—ëZPÿXdã òy|*ÄÜ´@!€/s_<¸X-:ÇRû þ%bw-28ÆàÛí%ºŒÖ@uKy7‡ãö…ÀWàŸurŸL‰¹ÏþÁÞú dj·é ý-ðR!ð‹÷Ÿëþò‡óyækMç…b` Z àÛp™Aî“eeŠãõWœC+ü²¹JèÜKç²ä<3[7ž“©Þ%û½¿Iúˆ¿œ¤x®E!€bÀšükh!ðze²82½Œ~þBÎ:¶€“tÆéÔ,gT;~žwÞ¢:سŸÊøùížãn tjÃs80§á8OZZèýL’ jzvîQìÓL¯2×·6Ýu©ßÎÉÒëxh]ŽEiœA7OtO‰˜_†5ÿÒ_Íic¾àÍÏzÔ¦…5û;ôÅý¹‡û}!p*ß#€¿P£7 ÃL‰¹ïþÅÀÞúŠÚ,Eã¹B Fö'«žÿ&Ó¹D!ØÆñ•æ¯9²b`Ðùä™iµ;%p~­Œ/zÙ\5ÜüKç´ä|ÃVík}•ÇÑ%ûްíýLŸŸc‚B T ®P‡®Wv,Á‰Ã:µ6'æèC¦‰;ËÔFåÐñt{wœže!s¨öìÇýÒódëÁ2Õ¡Ïs¹L0—á8OXZèýL’ jzv±?¡ƒ^íJ}ö›éé:•ÛÎ)¥×c d]ŽE6Ö ßOžO‰˜ã_¼ãù Ì;Ž-ç;æ[vß1Àß7|ÃíÏG Ëbl…»6ç˸û´|q›úÕT!è `â ŸD sßý Áü졯6KÑx¥Bà{ï|6r-ð…´@;ÀïüÅ;ÍåÌï~1økä/}臾+À ÷ÉôU„Ï¿}ɨìªàæ]:—5çÉ>Y[ ]à~GË$ú50Î18ßý(Z ਸB@á˜×*k[[yÞ¶ÂÏjøs¯ ;PPÒ.F´» >ÓAæPóa?»í3\æ…uÐuÁ1ƒçtLó˜'*­ô¾&I5=;ìMóc}KÛéú>]Ÿð©áÖ唯t>y>%bž(Î'P;÷iŠ€oîŽA´Qà¯-–b®åõßh.îµÍp÷*ß³l«¨üʘ<Ã'Rcî·1ðÀç¿¢6KÑxZ ©\üÑ› mW¸b ø™{ÏûQp1ð´Lí¬`´`½O¬¯ z¾Ká—Ïì¥#òS';•5ç>jÈ€Kø}“ä—Àúâï&2ëHB‘òóJÃA6}.ä|T¸@P*XŽ6úl;Êé<ÐVØža=¯zÅéÔ ?ˇþðÜgœ\}âÈÿ1ÃÏnû §¹ê¼°X›¬Ïèü.Šiüy²²„Þ_{¦EðþÔ}ª²–6úý‘Ö¾•ðë¤` ·&Ç 4Ö ›'ϧ æŠõß¶ðG}â“|P ¢àBò×Ãeã­Á]§ß}ƒöqݽZBí¹Ë/µp7ã|>¹sŸù ðÀç¿¢6KáX\d…ø~ùù_Ü%ð(PðÈ¡ý3¯1Éj¸/{ì&þŽÉÖ'Ú§ Ÿg îÃ}¥¤;EÜ\kó_s~X— ¶s ¿2ú™D?>½_å¹£I?ø¨<ƒ :¶a?&+p,­/ô£}7_E壯ѱžáµÈÖÆÙ8½Ú°,àgy·,ªƒ=û©ŒŸÝ{Ïp™ ÃvºNÜg9Ãó¼¦qç Ëz“(ƒ}Àû{´¤ã£Êfz³î-„o$/pk²5¥qOºO^C_¶(P ¼á‚D¼•û¿Óú˜ú;Ÿ?HNÕß«å±ÔGû,;‰Oô¦ãvPºùz=`ÆÜ~~óxàóƒ_Q›¥p¬%…€‚B È æg铸ëYëKêÿùîÏd±®Æ`ï“îSç·÷’á~F‹Í)ͱåüœ¼Ö¤4¦Kú•Þß$úã˜É3g Y"|f' ÐG¢¯@§6ð­…·3…ׄeLIG] î3¡Sœ] ºèwwœži!SœöìÇ}~nëó;à¹`>¬ã#àuÒuã6ìuÎÇã Çyr¹„ÞŸÞÕŽ’Mè°/™ß&ÑCæŽ Öw áßÝ›+·û¾Y“­)3è|²}ªÄœKßÄûÃò ÃøÆaþFâg<ä¬6¿üÀ³!{²ütÄ<çáó˜zÛa>‡ ߣK/ÇÐXÐ\àFÙ½ù½ 8)ÇÜn~óxèóÃ_Q›V\¬C 5üø=ÎzœNyPÓ—˜|}"~YŒó2/‹ ¶Í^:jS¢Åæ²qs<ƹÁ>Ï%ýLØô¾&ÙÏèí“çË3›%ð_“Z ‚LyëVê³ìsä|Kë°ÌÙDŸ“aüØ6³wòu›`ô!Sœ|²ž‹, øùížã˜÷u~N°N¼n*‹¶Î{k0Æpœ'—Kèýé=íÈlB`ê>u:Û^×5 N7Àl®Úí̺lE-þ ÷ ÷©Âk÷œ‡Ok‰ïDj¡T@…€lKô9Üÿ‡±îû.õsùƒG¶ŸïJ÷:ëOîwJd7ƒSæ6ó›'ÀCŸþŒê[ÐŒ+Jüé[åø&ú>ð_ æ’ø-ÆðIùE2žoòÂP²Míˆv%¶—A6·–9/Y×F?pÉ?è}L¢Ÿ˜ ^öüÒ_Bw£[¹&}¥‚@~NúK:W¼~ÚÖõ\¼.µµ r¬K‚UŽ¶Ú© ë‚n#X™âäêÃý€ŸãÙóóSj:‡®·ÿVLñç‰åRúôŽvd6˜ïQìS>fÀŸáõ\ buƒÌÚ ëݺlE)þ óÉö©sV~ëu§uv¸(pä"ài»#O¾Ïp<ñœçg=Š®Û1Éîw>øÓ‹†o@NŽ™ëç7P€‡þÿŸ½ÿ޶®«ª|a_rŽ/9 „—(ÁR”`*µôZeµj7Té½UÕn}•ͨ(œ ‚0"Š•`€ QI‚$%gP$ë€oµvß»¯¾ûL+ìsÎó<üÚšs¤9×\iŒùæÏ¨>…ú9ôÆUSZ ¼ê6óÖß%îk°Ï'ék²;ñ°Pøá OmUÆò­öÇ"5§š¹ÖÚ¨÷£í’ÐÛšdß±zyÀsŸåŽ5nܹwrrÖ3¼ŽN K¡ë¢¨½âl\R”t©ñqéNŽœöì§2ÜÏݽ]çÆó‚Nûj«m‡[sÝ—¹ì㎓Ë)ôq¶ÏçÎspç(Ú¬S`»ó¡u›Çì²@×oÍš,A)ö 'Ég˜óŸ'>Fïà]ç `Ïï pÀ…@¿íŠ.žsýa üÜf W ¤þ¨Å€¾øsãÏöö©™áës z­µ™\DpZ…@à.B%½ãã (ÀÍÞÝô^Q{‡»ζÑæþ/\í¤}‡KØ×f×'ìK³ÛÏÊõÕc c›ëjûVŸµIͧfž9›Ü¾Bç’ÿ`çk~¶½½y¸k›û9`[k_Cª HÉ´ðòZ²~×.Ì÷möIéYÎ áUR:ç¯²î„Øn÷÷º)N{öã>ß×Ýý=5_í«œõ*ƒ<¯­îÓTöñÆÉåú8Ûgs µÁø8dNç@œÞ¾[§%à˜Ý Öõm³.s)Åô>Y>«ÄœÁû?c¼ÖÀÙ*(P(P(jÞxòUOz¢ÍEÀ{ïuÒƒ>pstÅÀià®ù€m&§]¾øR¸Ö (ÀŸŒêÚ¥(ݸ¦¢E@! _ v ú1æà“÷¹ð~Ö⎠`=ÚNæÚÜoaŽïÒ¤æQ;¿Vÿ®z?“ð+ˆ“z 3l“³sÔú–ô\¸ A§2nóòZrÛ‘›—ûÂû”“E›\—ørÛÙ¥üº“bäãdºáþȲ€ïïî>¯ó56AmŒtßZ€ÿ°'—SèãlŸË)Ô&úÎawþ²ÎÑÛLX»çª6Ý #È µÍºÌ¡sÐ&Úg™˜sÀÿ%ðÞ{®ñÒh!Ðò]„€‹€Ô;K‚/G3¸^K2×;Ãúsõ|Ö Q€??˜œ.‡»a-Á›>µî$Ô_ rÉù±ÙÏÅ'ô­ìâ5¬¯ìؾ¥Í²VÂwŽÿ䯝›Ú¹ý‚ L-8?Äç€ÄL“5È—„ ÀɾöYÎkéÖ”Ñ$GåŠÚÖ³䬯Y3^[ÆéBÖ#È'ƒœ}¸à>Ÿ»çë|T§}µ×>Ûæôº¶@÷±ø Ûq‚9…>Îöyœƒí¢àæóXÛÊΗÖD×…Q»œ-è²8›¾mÖe¥˜ƒÞ'Üg¬] 6Çëw=éAÿÍw<ÙÙkowÒƒ¾‚/*ÿÁåþ|ø‹ÌÇz€îúî£B¯¼µ§¾vs2ì`‹íQ£ Q.RE/¢7üÔ?õ0`F7¦Ä ë´q‰ùi1ÌÇ'÷5ìö©r}õ˜ä`ûš6÷s6­ÌõŸKjü–yÁ6¶ÚFŸeZô6&ñ°QRúš‡ÿÒ´Œ™*´­…¶º¾½|»¹õ`›”]Nœ]*©¬gRºã!¢¯89û@Ï}~ÔÜ÷÷!ƒœ·,gœ °Ÿ®³îk ø Ûq‚9…>ÎöYœv± pÞò¹‹6똭¢6è«ËF[³.­ÔÄlÐ Ø·\p!Ðo»"€ ØF*jÆÔ9‚œžýƒÔ/%18¶Üçc>ÈÆqøÚV]‰Y…À£Ìï×+ÿýb[´w:YTÜð¶gô†¤ý —¼/Í0ŽOþ{]åó1i…ý5–‹³AÛùÍ!â-3Gn¬šy`¾ §®vzzpëVÛ®V¨ ‚š¢ b¯?Ù1–öê¯}•±Nû,‹v*‘eàǨÞ=èô!È}foïŸM¸ÿ—ž9x?xî;Ã2µ…ÎÉø1©uØo÷ÏĹôñ¶ÏÝa‡{ß\}ÀçY+µ1`× >j3jÃr·6-ÔÄl“Ï …Ø¿(P(P(¸x$ç˜OëS6zà0ö;î²é‰¶þÊÐ#ºù,K¡×vJ®úà‚|G@9¸håB Ÿ-p7$½9uNºd{*.ÞÒ ÉdÍsÀvGcº1r6¹XK1׈«äÆ(9²¶•R0²Ýöyë`ŸóLª À>–ö×{Ýa ´ÑÏ¡6ì Õ\òÊ2§r;èT¹úqŸïÿî9ÐæÎ¤ä ärñÙŸû®Å~;N0çÐÇÛ>ss`Nz/àþ¨½Ý=¯¦²/£Ý$,ªG»ß𵩥ư'¥"±ŸàÅ7Öö7*‘{G „Î…å<ן¹Ê¦Gí‚÷ݧ<ïÔOŽ>l{^>ÔœŸÀ]Û54Ϻδ< Œ.T¹˜pógzùö&Ä7#ÈÑ^kI\‚–๶¬l碱J}'ËõÿDܵb¥Ø9=tjý€¿ \ ¸‡õÅ‚œ¼äÖ%WÃñ¢ÍrvгqI+ãdóÃ@9÷ö÷w÷~zL%5'cÞ²œa™³S¶ °ßûí8ÉœCoû¼Í¹ð=Aï;¹Ù>¯æ ñ†öáuÒMÆîCªß·ÍúÔPã;ØŒ“æ ØÇHªñ³£ï¾Çþ˜½íÎ'=è·R3~Iü𕆹Õð}—mzœ.@!p®ª\¯í.Šw€»@£›>ßüqCâ›Òšc—|Ÿ&n޵ëÀÇg 4¦£F–ë;ÿ%Y3~.vJrèÔ&ú®r@N|r8ßó¿ZÄ…dŽš $’A®zèwl@Jr÷€ Ð>³·G"5޵»ÿÓ³` ˜+Ú<Ö©žmT–Bmaïäúx.Aoû¬MÁc뽂û;ùvÞ¹ó‰Ï¹)ìãì¯Ì7€žåjò~kÖ§D­ß`w˜<_(Äþ=óÚãuW¢àÿx×݇uÑ"@ã*9Ãqj}Àï”øµky?œ³Z½ç帨 @/Ðh㦿{$nFkgéñ]"~ðœ89©]sØ-Æ.õsòœo*ÎRDü5Æ(Åtz–©>ú½¬ô§Ö%K€Û“nÇ­\Ñ}q¤Þ>¸¶r@Í8¯1€ÜÙä|w|Õ±{¸á¡÷Y¾·÷ë²{Ðó cjîNÏätÁÜ8êÏà™¸}¼mbìàqs÷‡^¾wê|Ò¾ÊkØûŒÏ‹˜«#gY¿5kS¢Æo°9LJ/bߦE à-w<é‰6Ç}ÊU÷Ç/7.ëR„ÝKo6>ZxýaØÃé<ÄwÜ÷~å'=,ûöî¼ X¸{Ÿã¢+¾Hc{E€²5ÆwIù1Ðyè¶v½a·ß—šC-÷Sq–&ÆYr¬R,ÕçúÑîûæã?x(ëš.l[“¡µØ=¼)Y(ÁûÑB.ùjãêZ:`£°ÎÙF_Ÿœî0©vsŸû®ÑÔ"@Á\yεƒ­“±Û°œq6œ8'‘hÎEc+t?ûC/ÛΟÏ…m<¥‡vûsóUØ>¥ßmÍú¤¨µì|rzž‰ýbâ¾Rò¤üW0ðeý/_Çl/c;xÙÍ¿?ºUz®ÁwlÏ·(¸˜ÃÏ]m¾2|ÏÓûŸrQ ª;|t7Ã%pIúZð¸qS#yå>b=ÖÂQ+KÉK²T¬5ˆ±–¯&lܘ:Sìt™‡´ƒí¶«IŒÖ`ôð6 C Ý¥¸µI[ÆÙ1°á­rÔqqzŸÔ2ȹÏìí‘ ŒãÌ-t®*o±q:µQYŠœ>u>✊‹ 0FÀ÷†Ñ½‚æ¬çNŠ’=ôl7îŸU1W†m]_mw[³>)jí»Ãõ<û23p¶-pŒ¥b*¿AÅÀ³¯·éa}€ï¤¾C…PCï{A±ø%y âËÀ7¾ÝÍOúKâö¥Ð±ø†Š›êNW¹o¼k¢c¥Æn‘×ÈRñÖ"Æ›;fÉzgǺ©¶>Ìì¬Âï¾o’†¹}u×™RZûtìôÚ«žå)ÔÎ%²Ü‡2÷ãDmÇÞÞ¯ÕÔB@ç™’’5þAN¸,Sô\½n{ÞN¡[Ñ{ÅNÞÍ¿•Zß½Ýøy…kIç‹>Ë]›ûýÖ¬£Öv°;L|Ï3±OÌóo´_÷×Üvh»DÙÅRØþÑݱ,ÿiùüþ”Ïó¿ü›§S¢@*Jüò67çàç¥HÝUP|Íe'=l|‰åàßôœüDNÖ©¸ä}.ßÝHƒ‘ ík]‡5qã¥æ°„œe)¿µ‰q§Ž]ãçâ£ÝΆÆ}p3Îþ¬Âð$%xÿS×3:Ht+×p?Î~«8yÎ'dNZÑvIlîaÆmelŸY¯mÐRž·’Ók²u2ç§rFŸ‡ —oÏÝVR1Œ pŽê=‚Ï›)äâð8%0oEu©~¿5k¤´Ùù¤÷<ûóò[Ö£ƒÏäógó—"Š0àU·Ùì`9ˆOÆ?(?ï›Ñ•7=lÏD€"çÈß Ù¥ ¾ÙñMÏɃÐE!0·pIü4.'!ŠÚ–pû¿6nÜÔ\rslñQY.îÚL»äzÆÉñžò@®qs8¿5áxŠn¡F D ¹kÍ—Rr[Z]GØs[íJ~ðarInêA9÷™±ÏáºíФ‰E€Âû€ýоڶØätªgxíèq‚|{×âb!ÞÁ=Á«2¿9hLôù ÷X7]¿˜³#¥gÚýÖ¬Sc[ŸìžGb˜÷ÜsX³?þÄMê'‡‹1•ÇUü$hª`Ù«©Ÿ+˜^~²CuünΓ}¿;'ͽ\*@ol,OQ£G!0¥ pÉ|+O“}…mkqû},Üø©9åæÚê£ò\쵉±[ÇÏÙk<ôç hÛÁ6Ç‚à5t‹g嵸õçä6·)]ͺa}Ö©-ú€+ÏÀ'õ{ÚŽ½ýpX,U¸y£ÏrØ1)y¿’=ØÆ9Èô²íy\K*Ž‚óÕÝ3ܧÂ1yŒ)AN®ý^fÖ‡©± ;Ÿìž'°.൷Ö*Š9\ÌðÁtÝ—tÕå0A´™ÈgR_Z~êÕ÷òwßcÓÃz_&Ž"€Q;ð»7Lë‚ß¹ÁÉÕá|Ù÷»sRî‡_*V€olŽZW¸„})0à~E}jà}ä}>nÜÜ\–Ô©,ç,bµóHÙ!†Ó³®×˃x)Ü<àd`­±sðC|èÞŒw:N¨]ƒ[k°Kt'¬¯âìµQÕë±SÜC 2´{ûô= EÀÔB€Ï?¦Æ&HéÙÔØ]kî§€oœƒ ïoÏåÔ1½Gèø Ïq*.n€‚ ·¶¼h+ήߚ5 r:e°õ ïy æÏ8xzâ÷óÆv°=hÿúµOz ßÓå6ʃ?¬üˆäD?•ü¿f[ Eò¢ÿ’›žô°íóo<ôSEÀ9³ïwçåÁ=Q ¿ÿ?Ó/Q7µ-vÇ(0÷~^Ý8µ°_-¼o®} Rãåæ±´Nå¹Ç$æQšKiŸœ~·{¨æÄksZãóC|èïoÆ|CÞé)‰XŠ9¯rcÝÕ•ìjSJhX?]SflŸ¾wÍ)€K!×>£2g«môÑvè±à~ ˆ£ç$Îéì§þ`wÏ0cj¯8ŸZ\<k­ktßÖïìÍ92Øú¤÷¬ƒu*˧ùcÂ1˜œ.Ð8¿#*.žãMëÁ^¶éqº¯è ƒ ÚQ€èçÞ ˆ"…xöõNzXpÞ íûb´/½#P '4*¯¥Å>l×(0oà’üê_ƒÛ7í;»5H“iÊs1Nƒ˜OË~±}RWñà]“R´üßËö7cÀú$)t­wrJjÑ®I‚T–³ r'ƒ<§ŸÖNדÛÞÃvk³@!4ä>dlË[´'‡}‰Ô1¨%|õ|ĹÂùŒî îœ5cj['«íÙß¡ëÍëÎû§@¿³M­‘‘;[Ÿôže°ÿ`ª#e²Ôõ£AÏèŠ ÚO»æIë•§]ÓÇMñ;æ³þ GH©" @©Àù3ô»óSî“ o›˜ž7ÜÍ òZ¦ú,U`ü~Û„¾ŽQƒÛ'ÆÙÔøÍ!?7niNS}UWç4HÍ)7wm+îa|!£7áA¶¿+l·³—ä"À»uÖ„6—ÜÖ ¶AÛQ²MÉæâÖ‘ÙÛ €5Ë­U N™œ.˜ƒý˜ÔÚòºOqø\Äš:Øöz¾ºø*gXïìYÆrFmjÉ­;ï'ÝÎέ‘ÈR ¶ã„÷¬³ßo¯µv)à‹8¯¸¿â–';X_[´&ÿA5ExEW¸N·8‡†vw~Ò½qµwÞ{/¿ Ìßý«²M ßYHXù‚,‘Ldè\ß ü¦˜+p‰} §·/)œý”85äbNÕSõN^ŠuÄœt^Ü/éÀ’ä)”’§µà‡ø^6Ü„s°=“Ó.¡EÛ­ûZÇq•«ÏTt픽]úžæÖ­œcŠÓ9?í3ÎÎÁëËät%46úÝE¾ooÏsv°ÝÝ#(¾‚˜ g“꫾PÁºÕì;ìÞu÷a½µ€>xÙÍOzX~íZ'=*ï,ð÷ð+?sA*Þü©åqxÿùËï9øþ¸H!ðû7ò zá‹Rq Ë[™ëÛR`®ý˜’з²‹³G :ÿr~Sc¦HÅ+3Gº’>×?Kè¾ ¯sFŸõgš$j ø!>ô‡›o ã8cù‰$¬œÈjB‹v*9jIš¬¥ÃÙƒÖ„«^flsøœÚ­¬Ùt=´¯2%:ÇÐQÒçÈùbìî‚¶Ûsa½»/¸¸ ÆVå%û€m˜œÎ¡ÇƒýcŸúýV׆ú9[Ÿ_,”Ö ôQ Pâ£Bø¸/ºÉÐæà¥7ÛôD[ &d?pÙ¦6à9×ßô ÿû7ÚôDûIW=é‰6ügc)]‡ZpŸÜ5Êy¢ë§$7SXÂ?pI=p }+»X4~ w+¹ÇÃÉê1§¥à؈¯²³DíüÕŽ“ 6krcü úû$µÄ8Î^ÖR@ßo»ýOÝßKrÝ|,y}ÃÆ¿µI¯áøá RëV‹[ÈÙ²ZR1ÀîzëlrÔØ8jý0Ÿç;èeÛg­»/0.v]ÊÖÉXîtªgr:#ûŽýßÉxmh­r ¶ãÄ÷B†×ËÑb€‹è^r³¡…Š%xlWè£`ØþØàœÚæË­Á\þ¿³ÜâçÀ©¥IÍT–Ф’—ÈOe“Æ-¡óC)ÞÜñRþ5ãæ€ú1ªg%å³6:V\,<õÁÈIÎÅßp‡þ>I-áü¢Í…'± ôsÁ±ã­ÓÇÇ–íØVýÖB×*e‰uãýÇ]g¥ÆF©­À/àõîn #Ý K?÷s±Sý”,§ƒl t ^ƒÝºlר†Á~œü^,`ÝjóλëœzWD¢¯…À‹n²éAE^­çWìžh?ùª'=Еxï½7=,{áå›–¼ƒð£Wª#Ϋ`öGƒž™øù¥³D\„ŠÚp23‡¥béüú¸&‰ŸÃ.nb<‡Îs jâN?çãt‡Q&gSò‡vŒÚ­Éœqr~üÐÕãÅ?Ä÷²!A-‘ò‰~K!Àí)à˜ññC›½;Û©|úŸÖÅàuÔãÀ¸ukE ´Y޶Â>NîàõÌÑb´Ú;0ÇÜš×’Šê§dª;:nw³¶Ûu‰m ƒía‚|1ûÎû¾â~UçwÙôDÛ}dE€E€¾›  Ðbú?¹ý {Á7# gP xîö#E¿@XV‚׎׫ô½Õ¾,ü¾ûο ´ð3W9/.<\|Üg9’ %X*æë’÷¹ 6æÊý:¿5¨§e>9[èb«° ÷èR69}ÈrrFmæà⃔]Î}üèA¨°Ý… ?È÷²!¡/‘ò‰þR…@é8èñrm…ýÕNukr¸†þyäÖlšÈk_e¬Ó~ ^Ó-¶A«½ÂsLQk§¤ÆÒ¾“¡¯°ÏZ¤ÆÃ½¡†Á~œà] Ä~ÿÒ56=ûuóvî'6Q”Àïò»ßçOQúxOLÈrEÀÛî\7×àç®Vž£®ÏNž(¶…À×õâ8]V²KöUÆ:Md¦€øNW bôq$içD~*»Xf¼<¿cP;fíüR6ðgRv¼Urz–¥ôNκœMõgœ=pvÜOmØ_"nÆûùÐ’ùÆqÆòR!ôÜoA“˜\ŸáÊû?#¯_¿†þá™Z·8gR:õÓv ·Ö9j}¦Æw VŽ[‡/'s6,_›Ô¸¸?”lÇÉï…ÖüôUìÜ»o¢_Ú‰$DÿùÛ·y×Ý6=°Cðá϶/¹ÙfGô_sÛÍŽè¯ñyÿß¼î¦ÇéZI­¥qŽ …À#¾b¤8ïtÉ.ÑwrÖk"ÓÊܘ›KÞAIŸc_ÆËÁó;&­cçìûT¯ÀÆÙª,×OéT™³OÉl—#çDz\ö¬ÛÙña{áùÐÔƒý¢ÝúEá¹c¤ÉK®Ÿ’G¿&É]=ÌÔuc°LJÎh î+¼¦5ÔúL‰CçÌý”l*n\'ƒ\Û8'º›×.XM¸xÝ 7l·çfŠÁæ0Q¾Á¥àwÀ[ï´é‰vúTÀ…óáùûEÀÅø‹ÏÞÛ¿òÖ›ض†ßtïó+Ûý}?OiøB }!ðõ_x…U®ÅhÑN¾ð9‘ieŽ?æâ’wÇd{/Ïï´h‡›»ë«öÕµôkmUYNžÒ×RŠ¡:µ+ésÙáµ3£6"xïûûd?û°_´—þ¢pîXèñâ¾ÊœëJ‰îšpRÅÌY7†“{’+«„[_ei»©ù¡Ï:×^“ûNŽ6ŸÝ l”,IÍïºc.Ê ó ó…Hì/>JS Š. {ã'ïÛoø¤ý=€‹|wàíWìm™—ßb3ÂÙ(µÆäý_ŠGÒ¹®`¬Gosžø¢+42ºÐá ž™¦úb.y¯¡ä»‹/ãåàù¦Ì‰}xßÛ†·ŠÊ[úµº”ÊAÈSºðËù:½ë³LÛ ŽKvøAÌ2'?ïàA¾ï }Ø9¿h¯ñ± ÔÚã¸@Ï}–§t ìN= µnSáómFíKèºéš¦(Ù¶Æs F*ë•’¾Ž§ã£¯ò`”lS!ض„ÆNññGucvXÝv>Ì ?L˜/Dt=Þ@IÑ?V!¯?Ú,s¨p¶§IjÝjàs9wn3°«µ¯]7]cî+%}ŽÔ˜¶MQk—ƒch<ôcË@ï®Ñ^NÅ@ ú*Qh1*ØŠ-Ö‚÷]²´üéTúB૱ü¯upsbSC‹Æâ¤})[çÃrÛžeZçڲΆe©çôN—òã~ªÍ}µq}–•HÙ:y*6䀓Nzõч4÷ShŒ³†&œÐçàìí(Z 9ð:ó–×^mTÏv*;mÖZ7Æû³ºV¹ujÃ}–§t9à×âël!KÅsúØ—c2,ÇõÉר£»ÉJA€y!é½ÐÑýÏ{->xÿq…ø“ÛŸô°ÌQSüîö§BŸ}½“Õ3¿~í“ô[ÿkàô…Àã~>ô×®y¶v`.šØ¤h±ßÙš~ˆËðx9tŽçšyë>jßát,+ù¦ô%]J¦:×Où§t9JñT]JÎp²ÃÉ£>Onü'_5½/ê‹"…@ðÏÞôDûÏ?sÓÈ\8~eû™ý_¥ÏîG …€¾«ï¤Ö"pf†~b· íí6=è·` Úäÿ<¢µK|˜’ âôv&¡¯…ãh¬ÌŒ™‚çxžqû’ÛO•ÕØ0ˆÛJ«/ÛóøóVÛ*s:&ô9›”~9µ™‚&Nš@á!žÃù¶aëØéÜj9Ï…@ nͧSßÓ&·n%ø\às#'g%·F¼†%œ})ÆÔ±Rä⨮fLÌm.Š€Ü5Êò~›;N_âãßÚùnqú@çÆs::Ÿ©pÒîp>ÊÏ_m?Ÿ(Àûî3îsð‘϶®˜šT3¿sƒ}Ì(P \`ŸâgCù§C™WÜr*Ó>ËT™“39?%e§‰ÃþN–ÂÅà$AlKÀGã(ìÓ?—d8`Ã>ìíÓø~€öS:ÆÉaL8¡b欛ž—¥¾ò0ºnrëÛä`[Ž¡@—ÒÏ!Óéjç€ùÎcá¼às×™=ÓÝüòˆVº¯g×§91ƒn?Ÿóö«ü!×k¶Éìs®诅€¢öA ú°ã"€ ØZ8üñ'ý×Ò¦òWÞúðÞÂ|·9wù]ýx¿6„_JO½ú^þÚnžA´k?Ò ÷nÀy.ôbÕ X“Ò!Ž&î9àS㻳‘ñrðüމ›ËÚ¸y09Žvй7·ï{Ù8^jž,Ó¶ÊXκj£1Ü–=à$È¡ösàDx7Fjløh‡ú–à‡øÐ?<—ØÁ‡ý¢]ú~dl3ì³®ƒ“«˹Ù1áãÀk£ë¸ïàÜÁùÃç‘Ê];…®‹[•£ 9£ö¬ƒ ¨n)J±Sú–9aæÂçÅ^vxM2l»ó¡\8;Ðp;v²í\R 6Ã.°ßJ(–ÄŠ-jÀ—ˆ×øŸ2÷Ggü½n.‚Wß&?ü éwuygñ;§Á[>m¼ƒsá‹T/ZMnà8Y/—Ä]ãì”­Œw–áõY‹–1kôKe¸Yé òšdkóØ+íˆ~é‡Î»ÔF_e)4ŽökÚ ô Frä’¤”| ¹ø,›CMBÂñ¡x.)°ƒûEûXïS¥¤c¶…üuwXöÞžCCPZ/>Wpî@¦}¶ãm XŸ9?ôYž²]ƒÚ1œÝ”ùa¿¦€sBÏ \k%اDw¢í¶`§£y”ìý|ÎØÿl§þ­¸˜ŽÔ™ø¢Àé–$õoÇšø.v˜R!Àì x'àBþn貘ô‘Øprã“|_²K±ó“ñZÀ|/$tÿx‹¶’“39n|3!_"éúðóöÇý}/ó·ÎŸ·Úf™“3lã칯z§ÛÙ˜6PÛœP1j·.viîÚO‡÷¾x.1lãü¢}ßе9ÐXg…ƒµ’sÙwh³Àf*níÎ7‡‹±µã¥ì¦Îû î§Ð{¯ÇÆ1å݉¶Û¢=Øîǯeð¿&˜k çSKøãóìúééu„­Ê–†Çgbn˜ßûï»éQåy7ØôDû…—ïíöjãçAðèíùú‰óöwÙô í±|Lˆ?*¤EÏ=ÅwosÏݾ+0*Øð¼ÃI¶ö»»ÿ^žIr8a×x)›Zvþò RT92¬/áüÏn®®_k¹¶Õ¸Fº\’õ°G~ÂÈN¶ÇúoŸ>¾0£@AÅ€+x?x«môË™œ¿“¥ú± iB¤l…mׯ%lA®6s犇÷¾ïÏ'À6Î/Ú¹B2è™Ô>¤ö}–³-P¹³…ì¼ÁçŸKZ«8ŽÃù¬M˸9Û©óǾ+)'×{Ùøz¬!å?’Ï,˜!ÆxKƒ¹Öàük˜«Æ®6VÀピ\yÕm6=ÑŽïà;5<ë:›–}ße'=,CÞvç¡ÿ¶;íZ‹7ß(.ÈBà ÙÞöY¶Ó™'iKq¦ ñZàdÌÉkQÿÎwmrã§æÄ>°Ñ¾“q_Ñ›`›G=jˆÁÉ¿+.Pð»ž+ö2më–a]NÏý”] É›5q ·›“ΕûÕÂûlûàÞ÷ýù`Ã>ì§ò–B ]K^O•i_IÉ™—ܬlãøEú’ܱÐó¤õ\ xÍZY:Þ\ZÇÏÙÏݬâpŸáÄz/;¼&s¤|Gr¼#°o.:Öìæž§ô-„ÿ[ï”+E=l”œ ë¶yÏ=Çã³Îñ7Ùô ÿ›×Ýô°Í3¯=ôŸq­ü}, .´Þ{ïMËÞ}¡ÿλnv°þOn?ôQŒ¾#»€Î. gœÃùNa©Z8C›q¶KÀqs8ß)”âÕŒ•‹ôÜWô¦ÔÎ)Pè; ¦ à}Ѷ“q°œõ52ȧ{h§t­Ôúk"Ç}E}sàÁƒ²löíÔ/ ׬‡Úðq@›e9è!çþ±áª•Ôy ý)ðzµàẩ·­ã—ì—ØŸˆ´s‚Ï \{µp<õ?ÔíÇ›‹Žu^Ù¯×ç(ùB_Âùæp1Þxý6;XÿÊ[×Ï«–7}jý}Í€åôŽÀá…¤œ|ÂÃv8ýi±Ä».Ÿ‹§'\¼å$ }ú’Ý’è˜)œoPcÔÄ@›åjÃv)ÜÍ `›Ú€Iùë.À~`îÚNÙÄVuŒÓ9ÈNˆr°-ûÜs”Ðqœ” h\Þ*ìƒvÀóE|œ#xpC–ƒmࣲ©ßÐý®~¼Œ³ƒ }µ=6| ¦¢ç·½F^“ZJþSã.Á”±k|–Ú§ˆƒXhsR½—¯Çì«þcùa2?oMx_R°-û.ƯóTœm §„/— ø×aþ÷á\|ÿâ‹?!½#ààäŸa›Wßfþ„‚·_Ñ_rF1Àý{ßaãZ‡sÀG‹Þÿ›ÕÉBÀ%ÿŒÚ;{¥ökÅ%ú9ŸÃÄ]eSàyÕ ˜Âzg[À¶Åg-t.Œ³X—²u6åú,Ó›€î{­p1ÔÚG›eNr>)ß\°œ¤3NÇ~À=¼ÕÏáâäúÇì}ߟOêË.ôsòÏðzÖÀ¶h#†¶JÍY‚ÏíÜù•ƒ÷¹•9qæŽ=…9cÖø.¹O+àdz/Û_{5°¯úïdÛB lö‰üè¸KùçøÉ+{;økÌ©hü.(éý~åc{àe7OÇ‹B ¶øé«Ú¡ppð¾í/ ½÷^›žh.éwÀ~-ÞrǺqɾcoŸNâ¼âîâÓC%'X)Ô.åWÁ<€³YÏ =Ûåä¬×>Ûr[õÇ–o Û¶üŠî?€ÿœ%\üÒxðq¾lãdìÃmÕ3z“ζD$q ú(¸ÐBŀ…ö÷…Ûè·Ø¦ô:ó°ˆ i×DžaûZ\ ¶n^<_ÕÍçÖ¥P=|Ø7¶¹B}Ö×âöŸ×…õÚw¶)ÙY†ÏñؖΧt ˜Z»–ŒUÃÜñZü—Ø·ˆÄuÉ׿ _“9ØO}w2)À`ßµBÇŸæ®üýÊÍ‹èp˜ß¾CðôN£ÄÈQòËéSò%ùlzœ®ÄËé¿‚_®(ÐF1ð”›ò>F ð‹Ht!0è}"Ÿb7¯ïm¶Lµ¢¾¥XsÇ c‰X «~)Øp[a¹Úu]»ïËÍÓÇ>>ö9¸ÐD.ÐwjqÅ€kó6¥g9ãìwí̃v .^ vš ¥P?Gi¬©ìΓ탲ª‡ûÆ–Ï.\!0jo÷M÷ÀNqv®íP=bž5Rçw빤ð¾»ýWý¬×±ÄX-1æŽþA\“|]²ñõ˜ö)ÿÌ`ðéÚ  ãOs~ÎõÇû¥hPós¿n¼.Î\4¾öOƒølê»°(ø„ýÚ›´cû8ó@î]G ú‹ûž¶IÔú;e%U :ŸÌ× þˆÙË·ŽxÈÌEcÕÄ^z|àô9J~%âl¸­¨.gðÍ7ŒÚ"@ $q'ÝxA´Ý» ÷΀~Tˆ÷Ãm°žqzô¡SÜ´Ø2j NÔ°c{•q\Ž=œ+*K¡zçDz€‹$ýœüÏ¡f=xÝÎFcœ6z^sß/%j÷Q×e)jcÏÇRûÐgîF܃þ Û_{%`ïüG2S0ƒ_מ ?žsŠçßxo÷â›í©ÿùáæ 8¿Þã¯ß~LékäãJ€Ç˜3Þ àbà Ÿ¼oGÞ›*@(ž|Õ½í÷Ìø¡É…@à¦øØ÷NŸdWp?‡Ñ8ôÀ(Á˜%p1kÆYc>ˆY»ÖÆÉR¨]ÉGõè§|p£h¹Y¸ èuÝ85…ú­Å·ÑG›õ*w8Èbˉ’{ð*ðµ¾)øWã³^eÜטséºô÷çãtÎe+–.”Z;²Ñ8Kòír¯v¸sZe½¼"“Ú?–Áf jãc.Sç4Å'Ek¬©cc_㺬½6ز/ûïú&ñw ¾]{&<‡Z0×%xIW,{:ýbÍÓ®¹_o7¶µ”|þ{Ã+äSç0‡T!Àð¯îcGQp1è¿çøÅ«ñŽV´ð$Ù±Z 2ŸÔ·0C9øÁ²$©Øµc®9?ÄÖøµcæüÐfÔ6e—BýÜjo .ù½¾C U°s²^.÷þxÿÝ~«~)ZbOÏÒó?Æøá³¿Öê®KÇqþ;™IúS 1ºö t%0Oæ.÷ò?9Yþ%—A!ÀS;G..Ô&åSâÿMüú‘㶉2À÷"¾s{Ž-Í[>í¤ÇérüÌöû5ï è¿g¢øèãÚw1¬ËÙ9J~¹’¢‰?Óë»ø©B@‰€‹´]! }ì‹îË G»dçä&ÒœL§ÆÎ‡qþ©x)#à˜Ç¢;¸Ûíþ²ª‡ûÆçRÀE’Wèºðú°ŽåªKÙ:Y?Û­IwÂö°LÏeîC6ÞGG«ýÖŠ Öˆ?%f«OØqMòu9Èö×^ز/ûd&áÏ1ÄéÚ3๔à¹. ú® Ò|Rò9¬“yÚ5‡ØO¾êáߟy!ãƒ÷?éAÿ}÷ŸŸà-Ÿ6Äxó7;Ô ˜BüÄé©û¡üä_õ®oí·øàCtŒKê[Åjx@ðemrãµÎe­¹c]¦Ru)>)_´s7 ½kòz]ÏXý‘MúHþ]1À àbÀíÚ Û±žû,g=ÚšÄ3;û®Ícgë€*N+.¦Žél¦ÐÜív/ ™Ãéàþ±ÅùÔ)x=Ýš²LmAIÇz´!_›îD2œÛ@eìRrûyÚ¬=—5âOÙâ¶A\“5×¥öðÕ»¾IôkØÇëúà¹Ô€ñ˜×ÜvÓí”ÍYåòÑ¥´ï9ØwŠ©b`xW`3*ö:?OHϾަGåøÃ³E¾,œãcOìc?°ïk!ð?5Äý»_}h¿E!Â%õ-ŒbÕ>èArlrã·Îméýáx-qS¶ˆ§@W²°SÔ†ûÀÝ|ƒÐi€¤Íb¢H(´R︶n¡crz—H+lï|T_ƒ{Ð;ØVcKÌÅÑ`+s8ÝÞg8·X\à ·ÿ©õPà›¢Öæ4èNÖ!ÓóØÓ­`u¿O“Ò|tþµ¬µŸsâÖø† ®!\S€¯»l›òßÉL’ß·k7¢ó)ùæÀ«ÜSøãO<éAÿ+ð¥…Ë?ûp~¥ý¬Ù÷T '«!g_.öE@NÆ?ñ \!À?) P ´Bàc߿ݚB j)\b_Ë.Fö§IiSæ¹Äþ¹¥˜¥q¡g ÏÙ(°­õq7\%ì8ù¹(WMþµ¤ÞÐmJÆ„\©±™ƒ&ãرŸ>ìÎŽc¸q¦‚xß67ý9T—òSyK!€­¶öÊÎÝ Ûm=‡KçsN—B×ô´(ÍeÊœ×Ü¿9±k|±¯|¿ÞËö×^ ¶cß”¼»g3ÄîÚðœjûÜGLjy}ÎþŸ2ÌE€+Ü\ØÁ†û,w¶5°=ûAÎ@—³Iáünw—tŒ(¸H€ ßÞ¾²ï ¥æ‹Ãñodz þ’nê'D§¼#PƒKðsŒ| ¶g…Òœ¦ÎyŽŸóÍÅKù0°aRrPÒ3üÐpa§E@ Œƒ1r…@ É¿{W€Ûè»6úi›íXÏð>å€-ü4OálCÇ`jôý%Ày±ï*x@8™úÅVÏ/W°žÑ}æ>ËY—²Зì¶eÞy×ñ-MwÂöD›ÏßÔyÜ‚îïïiSšÏ”y¯½sâ—|±¯|¿úãk/ÛÂWcìú&©ŸÊ¿k7ÀsªóV~>Ûï¾Lš…@zW 5'g‡qv9àÃþhÏ…ÇÉ·ÇÜØ¼“ð‘=`Óùî·os€B Å_y?¶+þð›ÑŸ\„³þZO-¹B —è§ù¬Çƒä¬QšÛœ¹·î{Î>'¯vk  –£ínºAèj‹G®øèãÆ²\!BׯÔF¿J¿]›Ú¤á*›Õ×âÆoanLç¿&8–NäÝg÷ÿâs†~€õ%¸®õe‡sÑã>»pÅ€{w Úõ3EÀß>=]`¸dß1òix :Ë”æ9w?jÖ¢Ö†Û5>€í—€¼E›û¥nºsI(°åbv@eºvÚOÙ¥ä¬ç5qI9¯SÒi<Žëä bpL£ü瀇 ŸúÚÛx9ãdK9;'oµU9÷¡_‹î„Ý™žãKÀûwVXr^ÇÚǹã¤üC¸ûµ^{¶c_'ï.ÂUÆêÚ•ðÜjÁ>ýÌx üRг®³é‰öŸ~úIlø§0ݦ€Øh«^}+KÄ`Þ}÷ͧǸ½€þÈ-W¼éSåÜÞž7ÌOË÷øüñ'qAs!Î\¤Šæcß7œß>ú#‡;áp ¿2²Ÿø @BtV©™ãû‘Z”\ Û×øð™‹>$Rmµe¹Þt—@‹-КøGŸeºvÚOÙTéh=jr¶W™߀ãqüãØ¸?D@N>è†s‹e ¶(áÖŸMÉ^u)[–#æšt'­•/ï×YcÉùk_—ÇÅY ÷k½îj_±ëo«5ÆëÚ•ðüjû—fþ)øy7Øì€ìíW¤í™÷Üs˜ÿ¾›Ã×ÅW] s|[yï½öãDÀE€^y›üRÒ›3+¸Ï,V ÐB —ð+#{JbZàDˆûg‘šù-µSÖvêË69Ø*î!Á[–;{:¾áÎáã_ÈÉ¿è3(\!Àm]G•óVÙù˜µpÉx >Î?üŽ77pöSpW¦ÒT„ƒKúKè )4ÑOqà'ÉK MxØ/Õg™ÊO›ÚùÌ÷”ýWÛ’/jl< ¸Ï Þ*)y€xK€B U ¥b .¬¯“Êb›²Ó~¿M¬Ë>…ós°-ûs’ïHÙp 7lÙžûxøàA ™’“3N†Ä?W¼ŸeðCAe,gÃ~)jí8¹à"@ W °^áµáµÓvJÆòŽöW׊ûгwqR¤ìC}¦F_Kn>xC¦ääìÏ2ÐRð>ºy;äºu8›”_ô'kÁÁ1õùð0:¯§ÂcðX)`læŽ}¬¹ëZév×_çp6Î$“d}möséú ýx?ZرïÿåŒ÷;xç]7=Ñæ¼äàq8>t%ÛìÏðÚ¹~ðëÛ/>§xòU½ÞÅJñ×_2ÄHŽ|Þ CðÁûÛ¥‹€àÔ L€ý°ÝùTÞä9±É[õÉÅÀ9›cÐ2þ”¹ªO.Fè‚ÝG¶2µƒ\qz–±¼~Pðƒ2ÅÙp»=µà€Û€‹‘<ñ?ºVºnÚg³ÓÑZð:¤ä)¨µqr€'ÀH‚Uæà)Rc÷r(•½ÏöÜ pE@©àýãùëþ”Ú,«±W;:¥Å†Û9û©¸˜9œÏÔµ”|]RÍ„MîÆ6•A®~*ÓÄ_‹€)ð~c߬Õ^û)Ò³o ÎGagϱµ]’)ñ—žSi?¡oÅÅbÂ×’aÀלâôcß!ÖœÀÓós`ÎKÀûýá }­…À÷]vh›/¯“;Ô¶Ä›>uÓãt#p¶õÏ7=ÑŽ"DJ!°G+Ÿü˜Pë ÉËp<»vLØÕØ.Aë8%ûšx°‰­¢ï(*GLe§—›~-°wþ,ËÉô5|üá{û(˜ ŒÓCZ §WäØ>ª›kÀ¶KR³ÆN–Cí9vöQ\„N\2À~°S™+r…€›'6ºßÜŸ*X§mç—’§€ýjcA§ö Û°/Ãr§_šÖ1–žöät­p,GØàúA" øšSœž}Y¿ë›äï´æ×µž÷D<.Ü»@ÿ%÷ç®6î?z{¼jqûíp¾­¼ñSÚæÖª[’ø£7üÙÛÏÊÚƒx'D¿ú0vÉ} Ü%ÿÁN/ J N`–Bã¦ÆiÍù2­cÌÝ7ì—C?Þàp1ÁÎFnöSá8Û” €M \ ® àdŸ“\h!€­®%˵Ï@‡B WäÖÆ%¢³Í¡Ç¢ûÔÆa;µgï?$?<¡SØûìÜÚB@çÊëͰ-ìµ·YÏ}…}S:í—ba3—\7žÊ˜ŸR¬¥hgÉyE¬%}-ˆÃãØàZÚ÷ýµ¤ôìÏ6»¾IBO“aŽ]›ày/öà ¬)½òœë—m·9\Œ)h€þ›3ï (<§ï¤ÜV)S9œˆûÛwžÊ¶øÚîAá‹€ ]’_bð;û£c¤ÆlO«}+Sb«O.æÏ¤ä©B@c*;;s£çö\–ŠSC® ØÙP¯‰¿“Õ;=¶öqè1jçp ª¶ì«ã9Rv¥ÐçìXï~x(òÃQe`ï3Ü YZ ž§®'Ö’mÔ‡û,‡.eØÖ=Ûäìöiᄞ19ܘAN8}ʧ4Ö´Ä_c.ØÇ5¹Òީދk×àëMqú±ïáuÙ]|gÌ—ÁÜ—$bFÐRàÏÆ‚ç&ŠÇ]i;_³o)4FP{¾ü›žhÇ;x·#ˆ WÔ̸b`N ¤þ…ø=÷Ë^sÛMO´ßÔ훡xÄWt7N_aèý~ž FÇËß:7ìO«_‰©ñàÇþ˜]JÏh!À¾ŽÝöBæ›<÷Y¦ät%Rc͉YB Nø9ñOɹ`Fë)môyËìl ûìrö*w ªÃÙ"†ŽËÔè]–×à€x0BÇ}f쳿'\7”ø»"`÷<ÚÝ]?Ö³äجÉÜqùÙ2–çcªž™¢ÏùÔŒ9•–¸kÌûv,x\\S|-AîH騗mv}IÏÃ|»öŠ…@€µ˜>>ô[×Ý/·O)à³\|~«¼åŽ›žh»¹êSËšïLLå]w?Œ®xÝN†Bàë¿ðŠîA±\Jþ{%%4Q9nìÜ|¦Îuéýœ;šù¨-xÈ£Ýÿýà«ö[ç«À—oêüPœî,=Þàw¸èm$áWËSðú¦¶j×÷+ö—Ú,c»œ '¨Žœ b.¾ÊRp ´kqE}`rŸûø‰+´èuÛ¹ó~1¡ãuƒŒ·LÈ–«=SchL&%/¡ÏšÔ;¹9@ǤäÀésñ‚RÌ)ÔÆ\cìû|,0¦»¦XîHé÷¾Ã¹s 7IàYs?ÅøíëmçiöÇ¿Ç^©nO½zÙn÷;ýT|à~CÛ°Q~¬rNk‚ŸvÕóæ"_†Þ_tŃºç¼B ìÛÃ@ް?Mܾ×9}JW7¨±I‘ÛÉ[Ñ}@Mþô^ékד^GzÍ”nì;ÄbywÝéŽ Æo%’KÐ÷Í~ª]ް}£üënüö<÷óWÔžûAÎÛêç€ “Òåþñ—ÿ™×ñ„+uøMÿ³À>ëdëúB õ?aàŠÜlA*áHÁIÊY'5ßÚýXrk×/gÓ£>/N>á![Yù÷ð[ŠGÊy| Jû‚b€ à lù¸ñq„¬—oÇf +Á¶hO‰Ã°¿}­=HÙ!'øœHçô6ö¡J[´cþqâ?§€Êr}¦V—²Ëí9p⯄ž Öb (Ù§ôSý˜°©±S¦Î)æ’‹½ï»O96®'¾Žôz%£òî&º•w‰ã9ón¥»É 6oÞ~qÄO‚âgA ÄÑþZð8h»q¹xéÍÆûüÁ回hã¹R¸øµüdWXÈâÂRÆè¯¹"à}÷9éIa¤£IF NLΩù×î×ÒkP/¥¯™âׂ‡o€€qº” Ç8ßAû±&5û—*´8nî8òš–ÆÖ„j¬;ŒÁm¶C›hØÖàìkâÔè&ø,K6š< q€œûÊØÏŸo®È˜—î'÷srÄsr•ÖÕØ©}€}*|®2¡›[ûqÚô¥±JzŠŸbÊ\·äËv%žsýá<ïóŽ9p×Ë™”<ûs;Ÿ³B€Áþ8xsðgÉA\t7¨Yp칸øŠÚ»­ãÅ7­_·cð¤«nzœNá"àÏ?kð9(`ì èz™$%819Ϥö¥e—^¬±‹[+kiÜC8{Ðb{)íZ(8†z,k×P©Cý8ba«@®É*ësälJqjâð|•л‡(ËÐN±÷Ù>tHJ…ÿßÏ÷I÷´èr¶Ai¬zØNÏÍÂG ©Å@°ŸGZ_#cZæRk«v-caß2Öi‚ë×Ë•”<û^“Ý ulÎØŸV°ÿ ÿÙÖšt7;+_‚\ìÐ¥ô¯»Ã¦'Ú\ è;WrûMËZù½mz¢ý—mz¢ýCÝ6`[-~âÊ›–.’…ÀæÚJLkÂû …Ü>µìïZëãâr?¥/É— æÁ¡‡ó»(í[KA ^íÚiu¨]Ê6úœH3ΞÉé§Ö F îAÉ2´Sì}†µ†Œ}´]À¸¹ë¾)%›ÖXmv釰ƒÏËÂwÉBäü®4^èkçTc«úšØˆ[c˰_-¥_\i× ®#È””ÀWcìúq!ðáÏ=\Ÿ ‘¼l|_ên¸É‚€á"à½÷Þô°~ (ZÐ1?}•Mú(¸ˆíÁ;JkrÈ å…FnÿZ÷}­µâãÀ[m£¯°~IR×vp¬58ÆŽÚqµp¯Ú¥øœ<êÚ×^ÇuE“óå~ ŽÃ¾*O¡¶©¹òƒ° mÇØ'ý ©)°-ûxÞàä¾…ðu…@0Äݯ]+û¹y]Li™Síø¹˜ˆ‘³©…c9^tÓôyÞÂ/\}Ç]O,gRò`ì;Ägy÷@»óö©¬Aàþq¨m ‘l3Îæ4àùüÑ­òû÷§Ÿ>è—(Àó»b ˆö‹n²éŽ_í×/&?³Mú±å" ÐB xï½åvhM 9™¼P)ígë:¬¹n8.гÎ~ ˆµKhÌ$P³ äh_ˆ`ÿJû™*x½¸‚“¦CÝ8N õSŸè»„:ÇÐX ìjpþ)Øžcðü܃2tŽ–{ 'øµ„'þK`?¿CyLi—ýT,ç3Ä<OºêpüÜõÄrÖ«Œûîcïdç¼Àþ´‚ýÿÐ÷í¿øì¡[´/1æ]wŸ¶.ñ‹LøU&Wh1âoám~îj'=NÞhºIoÈ‹‰Ò~·®Ëšk‰Ø5ñÙvˆÅ Lê’“Ç–mÐ?Ït‹cå v?S…oH’8aR°ÞOa[´YÆvœè—ÐX)œ/öáy¥HÙq~P¢Ú)Æ~‰õÇ5³½~ø: øû½Ýv~¼MÑjÇý”O^~¸¥{ ÎÍ9D$ýÊ’Å@àba,•qß1e^샶ÊdkÀã`,•-®%¾†ôZÛÛÊÁÞwœ8ïäRlÖÁþLkpÀò9¸1ç£<õêƒÝ›WƵâùç˜[èÏ³æø¥kœô¨< \1€¶ûE®ý; !l/VJk0e–^W=V¹ø°Çr Œ>4¸CýÎ+»óöa’#·¯î‰ü6O½ºÈ÷7n;t½¹ïdìëtš çP;m×âì‡ç§äô¡s)–¡bï³P£ëdÛækˆõ(x^:Oî§äµvŒÓ¹¸Žšû 'ósˆXü³t! ¶“çúŽ)sÃøg¿:&÷ƒ^ž¿ïÔ¢×’ÊY¯2fì;ÌåqŸvÀþ<€}š Ö$ÀÏjª¼õå±ëÏÝÍÚÊkÀ—‘Á /ßô°Ìñ„íÇP¼ìæÃöÅ7=ÙÛ .ÞsÏMÝw¸}‰íƒØÈÁÔµZr]²©h,—À¸Ð Ú*grº³ÊîÆ,•¹}D1P#lkÁØ:ôU^ƒ&ç¶Óvmœœ Çqû¢2:÷BºcŸü±p×ÐH/óÊõSòZ;%ôl£í9p2?‡ˆ…BÀ1Œ5Þ¯%pqUV3vØL™ãT¿%ÀØŸûKâ®'–³^eÌØw8'XÎ÷iöçìÓRìÖfÛÆçÐkxü•¼­~†=EMBüÊ56=ÑN}ö§æ½&ø%"þE¢7}Êf‡Ú§@!DÀ…ä@ß ˆ" [p’ÈÉÞ%Jë2gÝæ®yé¸A»)ؘ’À ‰á‡Ú,KɵžÙݘ̓%Eißs'E9øøõýë _ŽÁ±\bΨMʧ¯f¬qtzþÁ¨ïþIDAT¾ŽÐé2Ö¥ûøã²»^Ì54²£9ñsòY*ž#lö—€ûVÂßÌ0†ß·9ìç?–¹v‰©¶Ñnñ]Ìág3ŸM~þÊ÷'×_CîZS™²÷Ý'Í ß£ö9Ë óìæ¼ˆ…µ™Ãso0ÄÑ?»JÁÿaàæðìë ²§]sÓ£ú%ènÂVÎ|Šù¯…ZôG¼ÚŸ-Å~º}F^ÒËøŽ¢ˆmöNô.1¦f}æ¬áTßÚc»9p,M^@¯Û>܃‚eLÊrî+%ý±Ñt/3˜n Rp2”CÏ>Vn<–;½³QìRIyŒA<µ+ù)ˆ¡s†ðƒÑÉsŒíýñÙº~ J JÉçÚ¥{àιݹ•8q®ªžåSˆ.ùg†qü~-Á~_ö}×.QcëlBÖ2Î`5üíÿV¶w×ËY¯2fì;œ ,ûqøe°OsÀz(?våýõê>Ÿ?‡Ô¸¹ùœ'¾y{ïqð;)Rhö¶;ozX†"@ €å(¾ß` N.‘¦f­æ¬gëñ¨±‡Í’hâz=øáy µŸ’Óô=ÒÉ&Ei-4Ê¡ç/'ËAju¼˜¿øœ±8(8I¸D™š5›»®µþ9»ÐAö¸Äôzyèƒ"Ûs ¦¤µvk 7hGw`FšØÞN€r¸ó¡—oÕ\xn˜ŸÊöuI{Ó98¦Ãù0°=æéèC—cï3>tíùú¬ïm¶sâµTjíŽëäªW9“»¿p²¾&1–Kü•aNã}^ƒýþïû¼­ÁŨñ‡M­ýÒ`Ü%ÀuÄ×^cÜO±÷õ÷ä¸ç`ß³Ê0Çn¾ð:8~—ú³F$Í*[¢˜Ã'}Úüñµ¢àB ¶o½Ó¦'ÚQ¸b@ îÓow…€M¶²K¤©]§¹ëY:&)½ÊÑ_ —¸€‘yH”`?ŽØ–m¸ŸÓ ¾9—èÒîa“‚÷“Ÿî|éåXMóÏo,ƒ\u¥óðMá|R¨=b¤”üM1¶ÏŸ ¹khg³¯ŸƒísÀNIÙòùÆÿBóË“ƒÏ%þŽan‡û¹ûµØ¿Öñ9F-ìÓê;ŒÝŠÆp×Ë¡ã¾cì;–ǽ·|Ï*ا)`˜ßÛ&ÿ¹"àÕÛWë™×ÞnÓmü<æ nœŽ±$o6EÁš¤ÖÜúËÏ…@ Eä¯ÿ¤íùPøžÃA!À¨±³¹ÄöágäÊkèbèñA?g»$𼀑 ÝØka?ŽR¶99û³NåKÂ7è½ìpÌîÙv$>ŽšcîŽÕt­Ýú²›TbÎr ¾h§bæpv!K=(!Ï1¶÷Ç ÇÇC ,²¥Áz¥p>ÁÃ*î+š¬¯IŒç’~Ç07¿¿k1u[CاÏÁãMñoãoøäô}Jqqܵ¤r´sŒ}‡9±<î»5Àÿ,‚}š Ö"Ð_™ùƒ› ñÝÏÁ¾þ“ƶsøÆî¸,ûŸ•_0Nñû7:éqºÓ& )Ùë+¾DÌ ¢à"ÀÛ [(ìèô3µk²ÄÚq >Üv@¿4©äEoæN^öìŸB}á—’³÷!sò)ð z/;¼éîtÛ¶[¨=ÞzÌæ€¤ðúa=ká8‹­ö¼Õ6ú€}ÆéB–:^çÛ§D| éqÑBÀíŸ_§c8ž³‡\©)—¬¯IŒé’þÃÇû¼6ãõÙƒlþ-,£Äo!Ç_KãkŒûޱ¯¹'S¢_‚cœ5†¹uóœ¯ xÿ}ï[/¿å^¶d |m¢ø/+|nÿÜü¾Ã¼o¶Ý® { ì`yÐT0ÈÙ\L´¬ÁëÅkœpöKà’w3gØ¿d¯¶°wr†ýÑN¡¾ðqò)ð z/Ëß|»ƒ¶{àLÅ÷ƒc%ý³Œ7>FÜwm~.éw2wœøøåØÛÏ]w †õ½Ív>ºè³Üµ•”/äûöáãMØ×"Ær Šanã58¼>¹y8]ŸCí§Ä(˜5üÍ—î¶G¯#Àr´sŒ}‡1YŽ{n ˆqÖÀ>Íëñþ.Q †ö›áB`IZŠó¿-Pœöw jÐã3‡îá2bôeaM[àAœþb eß—X§Ú5g»%Ñd…oà-pLGõjãô Û;œOŽ_¾IïeéðÈŽ<5䎹K.l ¼X]µÉÁ>)_•;»”/=p…tîñ±Ë±·Ÿ©c‘;&˜³ÛTßÙƒ”.äƒnÙ‡½&ík㸄?Ç0·Ãu8ãõñ:•öÍÙ)ξſâOAãèuXŽvޱïpÌYŽ{m ˆqÖÀ>Í롼ï>ù{Aü7pú9|âËÇ<‹üâÕOg?GÄx§¿PiÝß9ë£kÌí”Ý’p¢Â7î%#}–+ÎNq~³-QëË7é½Ìß„¶ëmåäÈï\‚©ý©ðZbMœÌÉô)ß\¿E–"lÉãBÇ,ÅØþð<zŒø¸àcA;[3÷ gS+ƒ|Ðåü ÅîÄX.ÙÏ1Ìïp-ŽÉ~ö}Öç€më~¨}ô[c8g Ç_K{Ú9ƾæ~L÷ØZ8ÖYa˜S7¿‰„ÿß~ù¦kãxj—°Ñ~DwœµyÃö µÜôŸ ö—ßoÓù >·-ÎÒ\çK†ñ±>shyça‰ñj9øhPÑ^ÐÙ\H´ìãœõ€¯Æˆ>ËпÐá‡?Dr´Ú:y |“úþ&̰ïCÆûNK 6ÜŸ ¯%ÖJe@}R1µgÝT¹»Øò;î˜ð±Ê1öŸŒ#>.îûhçp6ð…Žû­‰KÜ—&ÆqÉ~‰a~ãõ8 ökåõ)àÓêïl[c8£ø°¿»ŽTŽvޱï>aÞÉ(Á¯±Îد©`=Àß~™¿_‹>p˜Sk1p{ù]ýVZþ#amž×Ó-ÅÁGƒ°] Üé/ZömÊ:ðú¥üa³ü‘ €›÷’èµ,«†.k³rÀ7é¡ïoŽþÑÖWŠ—XµãþTÜz«LÑKÇÉúF{­Bmwè²Çy;gGÉžû{ýá¹\û¥`ÆÅád}Mb,—è—æ¸_ŸÓb¼fÞ&û´ÄHÙM™CÀc£]¶Ã_G{Ú%ö¾ã{ñNnýï,0̧›Û °ûeûvüä'~ö󗯱é.xÖuÆý¥øºÄGŒnùé‡ò'þ(KyèØ¼Y¾ïðò[žî|RØa»6<‘cy Z÷¥Å^×*å »c 7{Üȧ¢qr±Yç`»ZŸ%á›ô^æoÂŽ”_ô#A<øØÈ6‰LálY6¬-¯±Ê gî#ùæ$<…Ú©We%9âé±àãPbï3>RÇ‚a}o³n̰œõÚú‡ ’Ã%Þ%›cã»D¿†aîã5<&¼vûµô¶)Ô§6Fj¼”<‡ú Ÿ‚í°u×ËÕ&ÅØ×ÜM’_Ç; óéæ¶X›ÔïþGòÏ„ìºÄa{ü+p î|á{;@òŸ*ZùÞnÎÓMA‹åéך7Ö-îµÜ\“ßàö±à‰9ýy¢ujíÕ.åò ÷jâRà&rºsã±]ŠÛ]¶fÛ ß¤÷2óu¤ü¢ÌBàÛ+ÖL…öU¹&ñèײG,GÇU} >9ööãó€×ÇngCóÒ9¢Ï2Õ¡ÍÛ|Q8é>LZ÷}Ö“Û%ù5 óÞ¯ç1Ñ5Ã\bÛ:/õi‰‘²›~)Øíõb9ëKŒ}ÍýØ$ùµpÌÓf˜K7¯™ðÚúGb¿~íCÇc3¿æó£¢{\ÂöÁt><£KœÖ+ßßÈ?t{½ðòMê¿m«?u•úØÊKo>ÝWyîõ—‹îö™HG€Ûdž'yšó˜Ê”9—|ÜZ8Ø-‰K²€Þșۜ.`ÿœ£>J«} ¸)£ÍýAæoÀŽ”_ôµp ¥[Øs*º†h«Ì:>·øüR¹RkÃ`L‡¢~Ý…µ{ðätL”±ÝáyôñqÁñÅœtž9y€8$›Sá¤U)é×$ÆvI~ üýZ®Ij½x>ÑnŸÚׯÈÙÔÄ`=ìÕÛ ìüu´—¡]bïë¯A\ÛSวÍ0—n^3àuáà%7ÚØF1ÀAئþyA*Iç¢Á£è(Hºöi“vú³È”¹¦|Rû®2Ø-K°°u7ó8;àìg›Âù·0'ߤ÷2v¤ü¢– '°v)ÂFÏ-€)“+ˆÁ¸y0Î'è.°ÝÃ$§ãÂŒmöç;îø0˜—ΰ“+H2káÄ”û9jí–&ÆuI~-üÇëÈkéts(­“ŽÙ:g_£d“Ó³.Ú@eè3!O_G‡úcßÃ{q/§Ä¾Ž{š óèæ4^Pp!ð³WÛìPûrÅ@ŽŸN¼r_*þðóæ›ãÅ7bç>"õ[×õº÷Üs¯YTØB ¥kŸxœþ,1eŽÎ'GåÑ_ —h¡s7ôÛÙµ+Ù+ìwløF½—ù›±Â>ìm-…ìØ^eSqç¶à|Äà¾êRèX)]ÊÆÑ]h^NÇÇi¯ÛŸ¼î¹ããh™gàö Ée šœÖ2Çw*1¦Kðkæ¼_·Ãõ;ÔM¥v}tÜÖ¹8ÛR èaãìK2´Y9ÚJèRבêJŒý̽É<%÷-pÜÓd˜G7§Fvë@mî¿àòMë^u›¡ÿ{7ËÁ³¯·Ü˜/ºÉa¬—nßñxå­—ç϶?‹z–©*\ÿ¬À;sç8uNì—Û7g·H¾”йº±¸ÏrÕ§¨µa;盵àõ^æoÊ û°_´µ8©t°-ìU6…Ô9¡ýÀ­?Ûå@ F㥀-û¸8,ËÑ]p^nŽŸž¼îö¸T\˘¯’ÒíýÆç¢Â‰§Ê¦0× 1¦KðS`?UæÖqIZÖ&5ÌÝé”Ö§p¶h«\õh;B§×d¬«aïkîÜÌoÛSàø§Å0‡n>3p1B†B  ŠÀò¹<éªùxñ%|L‰¿t[óÜwßcÓƒ~$ÿ úQ¤ ¾_LåÍw,Ï1Å;ï:ø¾íΛÕOeWD %'–¹þY;v–æ:u.5ûÛ®‰KЂй›:€¿“« ò”ôN´úÁžýrýøF=ôÇ7Ú‡}£=·p²©¤Î‡”<ÐõÏÙÈøxpœjçü¯•îâór:~z,ΨNý@êžá’й¬7EŒÇI} Þ–ñ:®Á0†ßGnNª‹>pr–±Nû ËÙ¨}'CŸ 9îs| Ö•û^ƒqíí·ÀñO‹aÝ|&’ó¢AŠš™À?¥+կŻï>Œ…" Çc.Ÿ?5¼k ×ý¢ÃñP€·_±éaÙ²…¹þY; œÍ1˜3viîÐÁÄÍÝØœ©Ñ»8®¯2ÅéáÇþ*› ߨ‡¾¿Ù:8ûFû¼¾Xk–õ;v,Sœ÷Y>…î´rÀçÀÜ5×¹êüûõ/M<—díøLŒÅ‰~ ^•óz.ÉÛÏ?GnNØn§ìsò”.Èéb(¬g{&t5÷ÀÆ~ãûp/Ódžú-püÓ`¿›ËDvëatôñË7²àÇ¿øSÃ/lÿXáÏë¿ñS6=¬ŸÃ;¶Ét(À«»'`ÙYe©" }4(œd•§ìÎ:ØéÓ˜ÿ”1y®h³ÌÉÜ\—B“2–Ç–oèÜÏQk ®ÃÙ+l§þ §stÙÝh;ÒmoÔû¾¿Ù*ì£~Ño- gÛ]{» t%ø|`r:¦&v¹ù:¹ÊRòuÕ.Öœ??°yÝç¢ûÁ²8¹tò%Y+®#Æâ„¾ï;ûFk»$C\?÷JóªwÎ.t)}­ÚNÆ>Lèjî%Æ~ûëo'£D¤ä%xŒÓ`¿›ËDJþ¡w@+©Ø9P,UpÀrþ¸ÐY*®ý¥‡÷§àƒ÷÷ò©L*R²óà˜ûÑ2Vi~¬w঺4.9 ÔNoð%¦ø:®#eŸŠádSÁzß?¼:ØGý¢¯…þ°aû]{»LNîpçƒÊ W?n—;7/€XÜg}N²îâÚ?Ü·ÛVØkœ¼î­¸ù:,–ÐäÒÉ—dÍØLŒÃ‰þ†9×}K¬A͜¦ÖÎÉAJŸŠÏr´UÆöLèô>ǰ®ÄØoýídÛëœIÉkàqŽÍ0v7ˆØjþÉ—©ù·\;‡‹nöƒþæ÷ÙÛ½ÿ¾å9(üjº~o` ß´=‡™ëþóC™ûgäV¢X²8ø²p9áÌÉS¶ç ,p6KЛç’óƒÝ1p‰ã|Ü ßÑb´ŒÁ¶Ç7gm}ãSØGý¢?¥`X–Z³”œQ9Ÿ î¼€Œ<¥g†ç“ã9P}ô»‹jüpßn§°‹Alw,já¹b¾‡6ù‡CJωæZs—ÔOa˜óxݧ²äþ×Î+ìJ¶5ú”Êч`™¶Aôõ>X^ÃØwýídtƒ”¼çØ cwóhk¡¨M©^qË“§ 4¦Ê”пæv›ØŸw\QP˵¾l¿¶·¸wz[ÁzWÓåìÏ+X¤5ö­&¦ŽòÝÚ¸„Œa»ØêͰÜQk£v-±-bNEÿÁzß?¼é)°s~ÑÖ" à¤ßÁ¶°õÍš¨ ò’Ÿ¢ç‹Â6%ûÐë˜ Æeœ]ÀºhwÖážÚSÐs •ÔµÎó¸–@"©²cpŒ±b Mèç0Ìy|Þ´²Æ~·Ì«dú©6,C¶ÀÉèù>Ç@^ÃØoŸ,ïdt}+%} ë˜ ãvsh$üâ§8Aô(v¿e÷ýl®nS¸ö¿˜î;…ªø·â9ÿ:|h*§/ùœg°PÀÙ´RŠ£ú”}/ßÞ€ùF«ý9¸d ¤lBÆóróIél«ý°«ñéNüäµ…{¡cl7¾ÿö2ºns´Øó ãucÀ¾ÿöõ6=è§Hù×ò}æã<ø¥Ÿn–=÷móxtÅ9ù;‰˜­<ŸÁw$æâŽþêQË­ûBàë¿ðŠî<6‘))›ß ,pn-XWk[ܘ.»;ÍE“°Â7üZ0.ÚN×û3Щ}NžëîÖŸoØC|ƒuÀ>êm-8éWXÏöhóñj×S)éçÐó [økL¥Æ&;Ð]dYR6£w«lg»MúR¸±Fçôk³Ö˜×%ósæëÏ!æôÖÒϧ†”¿“‡ 8Yð±ïyج•îäO^[¸*{ý8aîet½–hµtܵÆëÆÎ€}W~÷†‡ºÇ^iÓƒ~M¬ß¿QzŒ5ÈÍe.ß´½Ž\!pýÏ?î~–(—â–¾ø¢+ÔÇã‡@Nrú’ïō޷)؎鲺Y+|#×›:'c- V-jß⹦ä-Lõsàf½ïï/Þ°c?ööœw´Ÿ:v)¹¢kŽõsò@ýjlÎ^)Ù¹xèw[’œþ5¤®q•õòíCª„&ˆ)¦ú-ÍcGL—ÈÏe˜ëáyÄœþZúy9Â>…³«õá>ë§Ò]Vྨ÷LM˜{™\«%&ûÐØk2ŒÕ›û žÓð1QûÝdÓ£ræÚ_êõ.>ã|þ‚ñTP´ð] ãSàµÁ¥)©ï„(}!pÅ¿G€BNÎäljü/F°øŠ³;¹Ù2¸9´‚˜¥·KS„=ÇMØ)“3°™3dKÀÇ@‡Þà°KùEÉB Eꘪ}]Oí;;èTæà->N°ÎÙ…¬»ð’äô¡+á®o'Ëál\‚˜bŠÏÒ¬1~Ät‰ü óŸ+ÌÙXO?7&ì€öYžòQjíæÐðVÞ3÷ÉòN&×i‰É>Û±×f«7Aèÿäö›žhƒøH >ó‚oz¢/ĺX âÀo-t¼Ö_š[¼îãó¸¢ç!+ž÷Ç /¾êã_ aàäJή6ÆÅ¿öá.Ãö5°¶9&’=¶¼üˆãtLÉúÚXÀé¶™ nÖûþáM•açmýXPÀ‰¿=Û/;Ö)Ü:ƒ=Û ­r‡Ó;¿TØv à9F︶­l›Ø´·z…ÂóÄÒsx.‰_‚a®‡çJpVŽAnŽLØ1Nïd){Õ39ݺ‹ÀÊ$Ê÷_¹>khõÓñ×b§3ö™yÝÊÇÀÅÎ>xáåi]Îo*øÍþÇ6o½Ó`ÿλú=•¯¹íþÆ9Ü3)›”¿ÊRvÐåú%9}w!ú‡¾‘3aR×¶“•ÐÄOeç%ç±\¿Ã\Ï7—µˆñRcºù¥@EõêÃ}ö%ºÝÊ[qq,ëý·×ѵYC«OoOã¯Å0N7f‚пöv›žh»" x$ñ.P¿¿xõÃõZã,ùeÝ|Þ¦ÇéJüñ'úý)ñÝ2ÿ'mßiyLW¸¬›C뺂ÝÿЧ/ô˜0rr¥dWç ߀[nÈjþ äHø8ñsv e =ûÕ’òSyÉŽõÎ6dK€‹7l–ç`çí% 8~%øx–³­®7Ö\ûµ¶ŒóCßé@J®„]w1ú¿‘3ý‰ëZûµ¸ð<³ä>E,—À/Å0×ñ¹áæ±&1&HéyŽ5pLõWY®]CwÂï® l§¢þœ,+·…V¿Þ~;‡µÆèÆË€}ø™øÜ8vÜùзðsW¯ûÏRߎö—úã<ØœOϸö¦'Ú¿xõ±þ'ÌO˜*o¿Ë¦'Úø×ä—ß2ï÷T«Ò_zâJÿ3Ps,ÔÆýós‰b!„¡“+%»Ú8g ,”#e£29`WÂÝŒs7è”-ûp‚ÇÉÚŽ»œ}-.F‹Lå©>l瀋7lÈr¨ üXícs'w¤l8FàÖÇÃQ҈ääSé.ÊÿȘлkZû½l›Ä1¬É%ù;ï,µOÇ%ðK2Ì礟ÇZĘÀéæXË8nÚ†ÛSèNèѵ¡ý)ŒâQ²<è†öÇ~8^ ­>½ývk1ŒÑWAئ~JÒÙÐG²Í ÷Ó¯µÙ™ãç¥ \üZts‰"8=xÕmý{ïµéQ½ã)]Qœ~ SÖ¬…E  dÛë˜`A”;§w}§CÛõ!sàæ–CoàÕ±t¹¤NíØ0ήõMÅJÙåä¬C.|Ãúã­Â6ðQßh×ôj¿ko÷Yv|¼Ñ×ó@eÜOß@çਵ 8vκœ ƒxÝÅyøðècË5­×77¦¤‡üBb‰}Š.y_’Ó^ÿšñ½?s”ü0v-êÛØׇöçppï¥BàÅ@o»Ã ñ»±Ÿà5·Ýôäb„în²éßRr`ü³D®xüöçVã:›žh/Y‹ªB c'Wjìjc- vÚQk_²S¹k£Ÿ³g™cwsÛÞ¹7ëÐv„Þ%q Æ_û ës°mÎ:Ý2!ËÉÈSzß´‡¾¿é¶úF{λíڴߌê`pÜÐñ9¢¨à156Ç+Åf]É6€¶ÝEºøS2Àr½žGím¦í8ù;ï,±?Ã%ïKr^Ö˜Ÿ?—çÀû_ûu'¿½Nœl.Ý ¯§oo )Å@‹}o»½ÿ¯Á¿«ðajl˜§]s³²gËŸ“½övãë"øÃ[ÊJc<'m³] óP>ôÀMO´ÿê‹ò¶9ÞwïÁ÷}÷ h?°ýî€Û¿c°x!ÔØ¶Äk;æpöL‹}ÎNå)›’ qjÀ ¡7nôùæÌ}&ä.™crþANÀ_qv¼MÁþ©8¬oEã¶Ñã›Y ¶a?•Ï-€›?P½úÖ;OT–W©ÑÃFmo*^J¸¸ÝźO(!€Ì]ßCœô5[ '¥š®ÍZc΋uY Žmàæræ6>çÀû X®vÜk"EJ8s™S->½-%ïK2ÄîÆYˆ ð'a/½Ùfë#ñfX^yëñµ~°ðeÙÒÜ‚gn¿#ÐÊÔ" ;Ù¶ˆïðwþèV'=èƒÇ^æ×ÃáöymV)‚ûÖ˜“w8{Çß’­Ó9ÛR n¯nʸAóÚÉ8qËáüAN—"|¦Â14žÊؤÀ~–À {ß?¼ÁÕ³t±ûýÆí;P½óU™¢ç…ÊXçÆbëœ gËûŒ1q3ÃMàFçP½ó‹vm! r¶E{'ëæ­û¥2‡Æq𺨌u.ËxL´]¿$ˆ œ Ãv%{ØÝ…<êOÁ%uzئT þsáØkÅwòáçÖ¢Þ7ÅÙºy,ŽÑÂàïÏÛ9趉롆[£ö›S ÔÚöv’Ä/Á·cEb (¸¯ÿ¤ý9þ§÷Ú·ßu·¡ýö+ö²~=ñÑŸGÎ5æ}÷lùgR§ò7ÿbˆñ7_º…Bà¬òœëç×þòûçŸ-RIj ©úÎ'Å_Ð⟳+ù7Åßžø¸™:Ø–eœhÕÂ1Gãµ 1Ý%ÂÇù¥bÁ>åǨ¾ä›²çýÅ7m 7[àtÎ/ÚZœð•³-Ú<ç^×µÝ>:à3ŒÍã§ÀxºEÛ}ŠF㢟ƒýŸ¶‡¢&qµ‹¾&¨LküÓfêðK¡ñj?Ác¦P?GNÆÙp[a[ب r€ nÚ¥pzø±.ÚS µE;uœjÐýN­ÅRLËóRX_c;$`NÐTVƒÚGŸ“ÓSÆ: ¦Ì±v X—Væú/‰[f°ñçúöã^3݃®‰KÁýS}¦µ¶ÃØ>¡ŸÊ³‹b¬—ÜtÓmE‹÷«Asx}üè‡è{((˜·_áçøÒ›ïå7Û~Á÷fŸám÷NÀN·ý#´T€ÿpüÎ Æö“ïL¤À1YŠëþ¦'Úg®P gœ]-Sâ”ìkâÁÆQk‹A ܈S‰ú|ÏÁ¾ Ç/öã+%=HÙåä ¦¯¤ä ô¸XùXñÍUQ=|Ô7Ú-ßH኉nµÓ)pNLÇsÀ&g¯òœ-Sk3Ø^¯£õ× öNžC}¢ÏÉmÌeʸǢun-ûÏðZ(ß#_XüŽ‚ýYÀ­M0èü¹;ßÑ=ઙbïà{¨Ú¯Y cû„~ C¼.ö‘ˆñRExƒyGà4yÇ]÷óå"ÀýŒi ýÅ›ÑBÅ@‰ß½áIO´µ˜‚£žãü¸U…@æúÌÛœ ÅÙ9¦ø5>5zÅÙg_7 EqÆÝȶu¾,<¦zø!ƒN—ÂÙ×ÄÀX­¸X ô¸8ù˜ð…«¨>êí\_S‹|¼·¯ û®‰Ž¥ó€~ª,'5úÁf|MFÀEãµ±¬„ú ¶KxSÀ‡ãœZçÔºßöáãh1pžpk¤çn—òwvŽîaWE‹-ó°a_ù>ª¶SŠ»a\ŸÔOaˆ×Å>1“’¯Mé—Œ”·Ý9mÿŠ[^ëצåà"@uÊÝ*ó¹…Ïï1×Fí¦p. г ú*gJú5~9ŸNíÚ3]¦7l·7ÅÉ5©î&œ ÷sþðe0‡úpœÔ·‹Ç‹mj¦à.L½pÓ9ߨFÐòjþRë¡ëÇ<ýZãsäj “·ÚÎÉœc⟅·|Ú¦'Úo»³Ÿ_nŸz¯Mú(P¼çž›èS¼fÂw(Zæ ¾³ñ¾ì èpRʱZùTYjŒºœMzàô%j}sv,×¶ú¸½,sà pSeœ]ŽT 'gÔ&¯|g[ûº8¹Ø›áBÅ@ΞÁM{ßßx€Ó±ô±=Ö»sùý û¾Ä;ºÖ¼þh³Ó±>…Ú3j£öCÿp_ùšÞÉȎ׵vLÊ'ä.®óž2§¥¨»v_yŸR|Ûö35²ó ŸÏKRóè.˜$%=ØÅ’"ô:º×²ßÅÀ0^7öL†8]ÌS ÆžÊ×®øqºk}Ù°.×úòýµ\S(©ý¬ÙwµyçݦíïwÑuRóú¾nMô¿¿kè£øöÊ{\-œ ¨.e[·Æ7eBÏ8G‹}ÊNc¨óKÉ€»alãìTïpö,K‘²«õx<ݲ^>Ûh»ÖŸÉ9¿7î}|c¬C{ï3Ä€ì…ÀÏ]ÍïÏYA×û9œ¾Å6ºM¡×²Ã%°Ž[òÁØ.)nqRã¬I͘5ûÈûÀ|ÇöØ~«Ø î… ŸïKÐ3컋'I¸"ôz¾ï’k1P²ÆêÆÉ§‹yˆ¹0£_ñùåklzX¯¸âÚñóò<â±Ý<œìMŸrÒ£òZ\ÌwÝ}Ó½³IñªÛ”çò]r¯Ñó‰ üš þS©ø½îm?ó3ÿÙþ£A!ÐÄ”û ës¶5v*/õ™Ð±^ûŽÆÙº®ï|¡ãv-zó¬ÕÖ±}‰œ})^JYÎ7€?“²Ñv °µ…@Üpãf¹Âr¶|óíyyG`-±½©ñšó1HÉ w8[Æù€šÄ°dƒÄµD‹mP²½KŽ§Ðº/s©+·˜ï%Ò¸k¡•©q0‡î¡x@JØw×6…@Ðëø^L1Îb10Äèâ21ðÌŠñ<á*e›9蜘¹EHí¿“«MŠ—Ýküº¶ú%ìTWê«ÜéCæâ8Ûµ1R2'‡ŽÛsÐi ¾ùÖRãçlr~¬‹vÍögŸCý[‹€7ܸ!s°¶ ëÏk!ð ÛÚRðºëqà>dÎÎÙæ€O-œjbÊúZýJö<§%ˆxÀ·$söçÙÂßóˆ»Z˜CçÑ=’ •çÓ÷M!ô:ºÇŽ|ÎP!0øw±Î1ÿ@|1Z&·V)rÿ¬çÃÿ­0þã·{Þín¾À6G­mëœ]Ê·;䌳I¡>¹­r€˜ÇÄÝ€k©ñ‡MÍxN_3†ã1ÎΡ~¥BvÜÇÅ›7d¶Ï›Ó,ôáÃyò”øÏæ`¦€¢‚×<Õæ>“’3ðç8ÃvŸh¦Ð„”ÛœŒ²]-­~%{žÓ’DÜ©ûXK.~i¿0¿[Ü .ôšh¥5Fjìèwʃ„ÈÉ€Ó¹B èu|OfŸ…ŠaŒn¼‰ þ]¬3@Ìå©W¶Q¬Q<ýZ›î³¾„›s SýwNœZžu“ôéã{ÖO^ù¤‡e€ Ïùœû NNY¦À¦dÔÆã­âä,ËÅ]NïÐØ¥ø)yÎ/€ÍiÁ7Ýj|Zâ§ljý¶­&ñŒúµcgëd¸èqó†La9ìj¨ýŸ€µá}> x|ݲÞáôðKù²ý1Ý|ÂÆ­\¿.!å¶&£l[K«_É>ô:·¥@ìÒ¦‹Y³?<·K¢×@ ­þ°O ywÁíkJ´!srÐëL!ô:¾7³Oe1Óñ»±&2øw±Î1—¥xó—§L¯Û_–±|M¾=÷öj›È¿á²MO´k Þ*ïºû ¿? 5XM‚èSv*/õ™Rl…íK>9}J‡¸§Aê&ëtŽœÇÑmŽRL'B§úès! ÀGýà Ø^õìÃ:wƒÐl¸]½€?[²8À~ä伿§‰›æ–C}r~ÎÖ‘JFµï’Q¶©¥Å¯ÖÖÍoI">pãO!«f_`ƒ9]bŒ»jiñ‡m͸°é¢»-`]ŠMe1Ðo·…Àiƒoç sù­ënzx^Ñ.ñÄ«Úá~À[ïT+Å,ôîsÀû…ýÔýÕþ±A€- lK…xÀý?û°pÉkÀ6Ζel“"åë`óå>Ãq¹‚mU§älx,´Y¦vÇÂÝ`A]JçäM r±œÿa˸8)=½»!àFÁ°\í•§ý·Éÿ¶üEŸûâöOûµàWX¾½Ñ/ø\ó‘¤%à}Iáü. T}MF9eÛZ|jmSs\š©û¬¤bÔìÛ`>—Øã®‰Z|a«Ûa×=­¶nŽkãMÙÿ@ýrsOé0þ%ök9´÷×M‰{µA¿u,~ŽîáZ¤·[¸H醘CrßÂà×Å8ãÄ<ÿöˇí1ˆ"`j!°|œk©)JÿÉây78é‰ö¯^ód‡ÚÏÁχ:e ÿ×ÕNz¢íÜÔ…ëd Çâ­¢rç«„œq6g«1\mvKðÈÌ:*¼öS¨“²¿âlƒ”.åíT²ž‚ãrn—oˆ ß,¡Oõ÷>ã‡Ñ1xÇ]Ò7 Æ­ÇiQšÏ5eËZà P ØäHÙ…Ü%¡LíÌÜy¥¨™ïÒĘÀÍÉ¡¶©yçä@û+ãµÝßs”lUÏý–q@ø ~ûyBºm–)4Fß>r10øtþgˆ˜S+?qåMÓ¥ˆ •>2ô”í÷°UøwK<Úœ?µð1n…%éÝ6€…¶zŽÃöÅ7=éœ W÷¾ç=ê ––/Xž¼ÊYW‚“h†ujWòËég›’±<5ìŽ;5hŒšX9ŽçìRòËá|r¤|4n€$nÞ,×›¨Ê ßûì­ùQ ¥øÇÿ{˜÷ÿúŠüM§•k?ãýöÎo{øîŽo>”-_£HŒjÈÙ‡NQ¥u¼ Ögʾ¸9ƒ¸¹1lãæìdŒê£13^×Ã{ R²S=÷kÇ`ŸÃsÀÑ]ÈEz;)¸ Ù©ì;ßS&æ±~ЦGå5ß()žx•“§;&(´àB Ø¢xÞ ‡- §™‚àíWl>þ9÷ûÌr!  ¬b}è‚徃ýþá)ûþß>}¬KíÚ9äÀéµËù:yJvl°Þz r°/Ëx›"§G\ r¶eØGIé5F µ~a‡&nà)9ùÞoˆÁòóXüåŒo:/¸ñ¸ŸäÓÉýÏþýP¬~´oÓõ™J48 a'¡ç„3E)Ž£Ö§5vØ×Î{-07?½ÎuÊÜ1ÞÅÌx]ý½¤lö±Æ²\¿Ä`xüÆTº‹:Ko³b1ÐË(Ñ/1Øw¾§DŒ¯üí+ì_ÝmÖýÏmŸ?gŸú,~ÀEÀï?lÿâsÒöÁko·éQy¼bŽWÍã:{ý#¶s‰/ë—‚ñ¯Ç¥_Ô™Ë+n¹éA¿æŽßÞþ*Óo_o?7.~貓èZ 7~ò~ü(øÀûûB@“Ö;ûn‘÷éa;ü™–b²œ.%-P†õ%ûœÞÅ9+äŽMJÇí;~­¸XŒ³iñµ¶a‡'nàéUe>ƒÍ>ƱþH,÷­%U|à~ÓcãÝ€%ùñÌt­’ Ö³“ƒÐ»ÄÓ‘'E­}kÜ eîk5qó‡ŒçÉíV0ÎÅÎ~mýý/pú”ËKq•Á~|ÜS„­£»À“ìlfNÞË(Ñ/1Øw¾G&Æ­å!Ý1 Tî¾t|øs»ä¿ƒe(Zù“Ûoz¢íŠ€(ÀOmß%x‚…Š(\!É?èû]ÀÀ.W  ¢@!DàÞ <Kìì·(_¨)ƒí.˜TA }ÆÉ!k‘³aJvï,ãŽpú”ONžÂÙ×Ròo«¤ÂÆÝ@Ý VeÀùÆvÉBs ÞÿÛøÛ&œÿõJþF1‡šBàF÷¤•OázÏöí&p¸®Ì—_ëa=N—K$N8˜œ.½&œ%J1•ZûÖ¸Á”ù¯EÌE÷2èÕ§ĺØÁºê}8]Ê^幸LØ ¶ãó±ø2ÝC8Ko“)úmáûNÞËLÒïl;¿#c~Ëv½±îñÙy|~?Çù½ Ÿ½OQS`NÁâfGô¹`ðϹþ¦Gõñ½ýî@k9ÞvçañŠ|m-`[ .j½#  k È¡r ç[ æ£sªã~NÇ2 º5¶÷,ãŽHégÛ‚‹y±¡Ç=uÿËõsò”-3ØŒÏÁ)D¥{ 'éõÅ@*Ž“÷2“ô+ƒ]çsDbÌZ¢@1 Ïë(0rüÙgnz¢Íózß}ò¾¯¹í ç"€õ%¸~†ÚSyÙÍ7; ‹äDEÌóo|²CuKò ÚBîB¬‡=ö9»ú®HÍ7Õw>Kûµ”|÷<àŽ“²Qÿ’ô±E!À°lsÔØ¤Ð±ËÉw#Å :î+{ŸýC2¥æû57ŽïJ<× W ,ÉS¯¾¿{7à¡ã1£pÅ@+©DÃÉ•°s‰g‰Úø Æ¾5&¿©û±&˜×\–Žw^qÇ]ï—ÜV=ëjdÊ`3žÃ\0O¦{8[zÝ‚Å@ß—¤ß1Øu>g”˜ßÒäŠ-ø(P0ñûøA´ŸwƒMO´Ÿ@¿^ô’›ô Dà ß½á¦Gå)¸Àw!R…|-ž|ÕÃ91|ŽÒ».˜W±€ƒ»H™ZÆÉúW¸y»¶ë«<¥/~Îrè¸ÖÑcÈÔêÕ±È]! ¨Ÿ#§KÁqÎ'»9âf÷•½Ïþ!Epúï¾GþF²(Ö.jà"àÏÚ¹¬îgoߪuÉEÓ1aÇÉk µc-óqòæìËZÄœ˜›KäÑcÎ÷>Þ:RºœO0èÇçÛRDl¥{8[vú Å€Êú¾$ýŽÁ®óYˆYƒóÍábL…€ã½÷tï»wÚ&U(/¿Å°ÆZ,ýÊ;Hºo»SWl¿7ðö+Nz [zNŽd!\h§(éˆëøèŒõ­Åú*OÉb9œ=Ãv9?ÖuÜq%} ñØGe±u‰Ž8ˆ…6£öL*>·ÄKÝõfÉ}fì3\ô*S‹å;éaøÌÆ$l!W|câ¼&(PÜäEÃ:k1»ù¦ 'Oö.A­¡e¬ZÛÖù3söe 0Þ¶«ý8ÎÅŽñX6\7¼Máôu>þ|K1ÕGéÒ–^×X h'“Ä_l:ûDŒ¾2ñó›.æ\ìÿ;½»Z¼òÖ›žh»"¯äó«ù\ôÛíçêñ üÔäÛýAŠW Ð"@‹©¼á“7=ÑþýÌ?>P¤/Îzy ÏÁÅ lsÒ-ãd€c8 ¯ÁùgVqÇ ”ôŒ‹ä±å$| Óá|rä|3uÃÓ›!÷™±Ïpñ«|m>þøûêaûOÿᤇm=n-ÄŸ–¹?.ûÊÂ[žk" —L9#ì5él¡e¼ÛÖù+s÷g)t®ß:WØÃ÷bÃë±~|¯gRúœ|ÐÇL{ÆÙ•pqº‡µOâ3Å€óSYß—ÄŸôíL0æk·Ÿëÿù²ìƒ»µ¢Ÿ©ØN9ÚjÇò9¼çžC,÷¯øt«A÷šÛmz¢­éA!DÀ…äAüüiî'PKhòÿ¡ ý=pÓm.ràûKóØº‹“q65~ Æ*‘zW€ßÈ‘JÂSò’oŠV_µ?«¸c§”ì4ú t.áv¨?“ÇÅ)Qò ½»ÉéÍûÊØïðÆv øûÿc™ù ¨ýãcqù 7=*Å­†y¾ï>'=¬sI„ÊJ„&œ­¤æã¨±›² æãæz,Üø)Yí|ÙöbÄë`ÐÞóAJŸ—û±R„âìjÑXÝ{·}¿¡°}Iþ™AßÙ.æÅ<²[ó}Ì7HQpL2µsú§]ó0®òïÍçô£à"@ïŠÆ=ƒ¸âÿnðŸ7Z<þJåy+‘üƒ¾¿-¸üœäy¾þ“êÇÅ9öºÛozTÏüá-ý¶øÚw¡Öçl9Scƒ"@ßàb W¤p'SŸ”¿Â¾rµjÖácåHÙ”ü¡W4ÉNáb2Άýyœ9ûÐéMŽes_ûoRSyîõ—‰ƒBào¿|oÊͰ–;¿m™Øßð±òþ»@Ñ"hòÀýÂÇ%S¨¿Ænʾ(Kî[ 1njìÜœr~ô+©c¬÷W&§wºÔ8µÌõW"žÒ=ÀGÉ|/“b —>"Ô·%ùg}g»/ oÝns¤béXÚ?Mø¼4¹~ë§ô  Ð?¿ü±í3/ž}µÏ¿çlŸÁ®`»àƒl]Ђžsµ …À#¾Â*õbe ç­Âöç\!jŠTžêk;#P=úN†¾ÊÏ2šè‚Ô1¬‘)7…ó«¥ä¯cñ>+9}èÜMOo†ÜWÆ~åÀß/ºI~nߟR °,ÕÎÉœýû³ŒKvÛñ±ÔãŠ>Ër¨½óc›Z}x,·ß*¡s7F¾a¢bìW¾ h)^vóé7–¥Š€5xÌÌÿ"¸û»H%š,p¿…ðåds.µs)ÙÍÙ'féý«¡4fíœÂ ït{(ÈéY—Š¿6w*݃ü ÙrÅ€Úr¿oK€{¿{FÌsiå‡é•ï–xOJ|ùxMR/hq _ÂEðæ;Û(@ô_zóMO´- RåwÝRE€)ôz*ñë×ÇtÿlÜ_tŃš‚Æ·5¨ èS…¶\ ÀF¿Dìrn»¾“E?gçt€uˆsVqÉ®Ãù:øø3)›”OÊ>E­ƒÇ¹}v7G¾i¢bïãošˆO)–àC<éqºà±æó¤ç…ëÍýš ÈÅQ§~fÆo[xÓ§úqô—x¢àB€u©B@‰¨î¹Û?6{þ}œšÄmâ|ì +þÝáww1§úŠ‹Ár&§ jŠF“q–¹>Ë™” ¶)›³Ž&üŒ³wð1N‘²¯ñgßœ}M,Ec+ÎÞÝ$ù&ŒvнOÝM \1°ä¿£Ðb€_5Êñ”î&8]+¸¹®?øk˜â—Î¥¨SÉnξ)kí+S;Æ”¹„ÏÅŠG½‚œ.€^cÖ>58ßη‡}‚î¿Kîû~E1Ðo¥ùøù0̱cûf“(¿ôf]âÛÁ2õoå/ÛŒp6ÇB_wEÀâIO´Qà¿^rÓÍŽè3©B ˆ" UþY';œþô…ÀW=â{»<}ñôÊ /éÖüчvQh1¤ €dÜ%è*µºhçlØœg\qBïŽ-dJÊ&ç“¢5Û+){n3îf«r´êW Š€¹…@mr®@‰%ÿÿíJÓÇqúZæúÃ%žs©Ý¿” ükbÔ±Ü\—¢%~«íÅŠ;†|odrº ³„úÌ!·e,ŽÓ=äGɾ:¶;F!À`.~«ð'™ñ‹>€å\ @!  àBà]wlßy×aû¶;ã‡69~õš{??2ã¯}!Pó?%}PcÃÀ>©‚mÖ.4AGbîdŒêa“ëCæìÎ2.¹o!b¸ãÌè˜ê£ý `>Œó¯Åù‡ÌÝdY†v ö ~öjÃÅþôkù‹I¿3K~4ˆùË/<éqºó„{¨·°T —„.IÍpsªW_'‡³™»Á² íìW‚~.XÖ(Ö(þã•—WâaòÐÖz-s|•ˆ¥ÉèÒÔÌ—m¢í`l§1Ü\§0'ö§$:z¼Ü=PeŒ‹¡²%Aü–1æÌ‡Ç«¥Köí# ¼aûçT(Ï+øíëmv@öÂË7„œ¿XûÄ.Ñà“â‰Wíìú…¡(Pà‹Â©B †(¸xËö% àôo»ó^þî{lz¢ý§Ÿ¾é.EZ °~*q¬Aôw…€æ8¼ÐÛ,s~ªôã Œ )Å@zW ×OµS}†u lÎj1 Ç„“è+Á¶*nŒJ¾<ÏÏálBæn¶,C;ÅØ/‘#ÙרýY¤æ%çòß'Ü,ùÞSßË%¨KS3gØÄ°Nn ˆáæÚÊœ8˜Ç¾}{?¸Ðàcåî*cØŸã8ùsJ܇û9º‡V¾F! ã0¬S½ê@$×H°¹Ph1½c©à)&NêƒrüÙglz¢ÍEÀÛî”÷Þ{ÐÅ¿"㟑 .rè±LSµ>ôÔ§v'ö ø©Ü;î/f‘;]Ê>€¢.2-j‹Èsï  ¯º”]JǰÎ6gùÒñrÉt h\–9}àÆ(Ñâ§ãñ|1''³7Þmº{ŸýÃÀÁÉ>'ÿŒú(<ï¹LùÓ©EÀßýËMÓ¥øÚ ÿ/àîCŽ©~)"†KP× f¾¼oÀÉÕ¯¸ùÖ2Ç_çÑÂR×ÓYDî|QPÿ¥Á§ŽSëËãÞîÛ’,QĤDÏ¡vè¿ævCû9×ßôDEǂϧð]Å}/ E\°îõw8éa™ñ9‡ã  xÏ=‡m€í.žXø>Æ|\Kì è¸ÇТrÓÄ(á €õhs1YàŠÝ2*ã>û),‡½º(ìÏ îXµuÉ4“‹§±œ­ÊØÖçh±Ux<ëÜ}èrì} Nî9ÙG[m ̽õÏÅ^~‹“§SJ¿þ„#èß^uÓãt)\BÀ8ŸÀÙÖ¾.A]‹šùÂFmµ?•Tl7ߦúòÚœüØœu¾CÖî,Áìl?Åß1\¢º6¹¹OÕÍ¥u-æ®]ø×ð°3|þ®‰Þk¹?–ûã9…ýØ^?…–xÿ„û„mÂù”x‚oÚî 1¸ÏÀžI=zÝ6q_šˆýÊ[ov`¼×o¿P Pp1¸àb`i¢@1â÷ók\‚÷UAÜÿ0þY›–ýå ý¿þ’aûk]° øƒ›Ê뺇2üÒÐïÝÐÇÁqæ-ÿà^w¿û¾øÅ«Ÿô@ɸ‹ßÑjûñ‡ï'ã  ·£"@“í+ý‘Múœ¬s’îäÓA–óas‰4îÜ%½¢±Kp²_‚í£ºi³.ÇØ~|Ýi‚~)ù¯ù»øcóÐíz1xrm®ñ¯Çc»‡r KÄpD\—¤ƒÜ>MÕÍ%b×®I­]Œ×Â#Íy}¡Â÷W¾ßîeþ8¶0ÏÛL¥%&ÏÃñ£WÚôDûÑ´ÿÐs´°wt‰ÃQˆ±¸ˆ€á9MeÍ¢€ùÀgïǨ-Rïüsž Š€\!PE€+¢p…@ §;Î*ƒ<þ$íà|‘s¿D«mÀÅ@*z[*8ù×>@+œ ò’OÊ—ÙÅèöÃíÿÅŒ®‰£ÖNѱ8©ŸLj¶OèǺc¿ñEŸ+XþáÉÓoH§IKAðÑÿºÜ>ºs s|KDl—¤ƒÜ~¥tk®¨Y“%Ö-bÔr1¼ƒ›ÂÝ_Ýq«eÛÛÌeéØJ—,TÑb[ƒÎÃñÆOÙòø Rü 髺b‚ ú/¹µ¼á“Æ>¯Ý~‡áuwØô°Ž™ò/¼ˆ§ï ¤~£¦Hýó0¿xõa¼Ø¢ÝB©p„þ)9ûÑ ¾àù£Õ @Ò¯…èm©@ò¯}0µ€Ìùpßù‚o7o·Ï;ýS¯nå¼69Zm]|–œä×À>Ñö ýX—cì7¾Yä T1üÓOø›Î™·O‹¼ì¤ÇéŽЭÌñ-±]’z,rû–Ò­¹ ·.K®YÄZ¼J|^Içz/uǪ†qLo³Ç#àýIáü€ÚvÉC’›V³ô…a.Z@ž¼MþµH©Wá£Èx@®xÏ=ëŽÛ’¼òÖ‡cr€íÔbÀáŽwÀ6/½ÙfüÑ M–øÂ¯¥ÅÇ ´@[émMâïdQph²®}ÈtË6تn$ïæêö“es°N9¦Ø•|0~À  ¶‹¶KèY^bì3¾Ip²¯E€¶àcßüÝKä׿òÿöd‡Ó/{0§hµo%â»õ˜äö1¥[{]‚ÔÚ,½f¯†ïmøµ˜G6Ä=M¾k{_KÁ÷MwŒrŒãx›%YjžwŠœŸÓ)°¶Ãúv‰D2qsú¹DL-Þz§MO´_!íá"€‹@_MG!ž"…ÁÏmÿMPS€?þÄMO´ùãL\¼ï>ãñ—æåºùší½Áý€Àc3÷ -ðïÂÊ .Ÿ¶?z¼A»w41 pá·Rã«c)œôsŸå.ñgäZœ´Ïis§§y3,¿T ¸µÂ9¢”t¬ÏÙ:à¸àäŸÛ.¡g9ãôû~ùƒ°MÛÿÉülç_.šË‹è³KþÚÁRüó¿Ú¯½>”s´Ú·ñ]rzlrkÓ*_ÌKçÊý%À8s9/@à¾ÇÃ_‚eܱqLñY‚©st8Ÿjâ°~hÓ³Á$n ôs‰Xü.ŠW è—fs¼ê6‡kŒB@á?)cþâ³7=,C E ¶qý¸kȯ¿C7Ï-ª ¢@ Ûï¼Û^ŸûÞxÇ]»â­ýQ!KŒTŸ#gÏñÐf{–iâÏ}È4éOÉÜ»¼E{”ÐW´ÑG[qûu‰=X&§Ÿ#kãs Õ+­…ä)øø·uq;œ¬U œU¸øê=¼ßòC9G‹íTb —œž©ýuòc¬ à5Zk½"n ?tÎÿcàár¯¸Ç9Ü1µvkÁãò\R”ìk.¹X¬Û{øÊÑ%!“qñ÷®€þœ¦âþ¸ë·:\ë¿ò¦Gåx1I‹€Üohk}ðÆÌ/ÿL¡ôNÙ˜Wùãÿ%ð¯ÿ¤“èr…Š.´à2v” .‚·ßEÞÈÁŽNÏ8ç Y Nü¹Ÿ*\¾Œ&ö@e)Û觘²Ÿgo¥›óí ù\xΞ·h3N6Œ£¤ý–" ÐB@“ûT¢_…@©86ñŠpúàïvÝ9£ø¡œ¢Ön.1ŽKLO‹Ô~;ù±Ö(ˆ±Ö^+Œq,Nslà^Õ ¾EæäŽ…ÊׄÇLÑâó8ù#ÄïîÖ!ˆ¶Æà~ ˆíä‡ýºgÒ%&Íh NT5YåŸ Í½3€B ¦`â£3îã3øÎ(P 0‘üÕ9~õš›§k!ŠàôŠ®)Š-4ù~sûîzª¨y'¼ýŠMOßî ÝwôÄË¡AžÛΆu)›ñ÷8ù×¾Kþµ[…{$÷)ëàϸù÷rú^Qνâr¡Póëºf%j|§ÄMÁã).Ùo-€¬cR²â8‹…@.ù_‹|hó_þ_;~§¨µ›KŒÃ áY µïN~¬u b¬µ× c7>ã|‚œŽásjÿÓÃýi–âŽÍÜŠó X§>‘컄ŸûŽõ¤í¿”cŒ)hÜ´Þ?‡ºdÔWB_ƒó \ðƒ•‰n EÀo\gð}Vâc¢?,Çà'ZAkP»¿ñ} ºŸ»Ú¦Gåsáw1Ph1Dò C!à ‚–b€©~G týlǤl4ùgúšü»v€„^q:öA›áùêœ/DjµèÚ•(ùN‰Ép|Æé—*Ü;¬Wž~­úØ)þí´N›wÝýa=N·_þ·éý|ã›ÑoõA쨵[‚K“ÀÓ&µÿN~¬µŠq7ï%Ðq–Æ9;ßÇ-þßž¹2î¸äp1çW Çá/_jRY"÷çq(&Üøµp¼”Î=—¸Ý%$»vްcœ À‚?VËÁïpÀ„ìE7ÙôÀ6x|·¶Ë”÷o?ïÿ矹é‰vK€ççso°éaÝÚð÷Rï¼nû¯ÅØj!”>ÄàËË)â£_ÙBÀ9µââgRv\ pÀ}Nøµ€\“}$ù)¹ÂósóTRûÅŽ[G‡³wþ-1b×ć<•ð³\u)¸P–ø’ÓÇÜÑþ¹¡”xæµOï\}×Ý3¶^›JÍ’Äx.Ñ;mRë òc­WŒÃk¥}&%¯q—±n¼HxµßUˆéŽG¶_ƒãg¯¶éѱ\~þHøÃ[Æn-¸˜ ž7h<‡*{ÐbÛ‡4Ä}Û÷ñ£Ñçpð—ozXÿÓW9éA? -¸x£ ;MxžüŽˆÄŸ‹î+®ȽðÍÛs [eôó¡Šžx%Ø·,gX—ÂÙr!À·µPY É>÷™‘OßÁ6JëÅø6šgîÕ÷'÷´Ü»n=™”Êkb¤ô*¡sÉ>ËX÷õ;“É#ÿð$¿ÿô–_'½6µvKã¹$ï,Z7•c͆1†kKçÈ}ȵÉáü[p1ןƒÿ7ç|Ô„8îžO|Œ¥ÄGz¦òªÛ¤ýÝÖ°,¶üŸ¿}½Múî æ›iƒK¿.Ztîœô#ñ×~ðžOÚo½ÓáÚ(­çâ R÷!kAã°Ž‹. ‹­S ^ÞÅKÁñ”¹ýÅDnm°>g‹X-ñR„ 'ú€ †m— eHýûc½FµvKã¹ï,áÖDek®Û{=ºù99ëgË8Ÿ.Ʊpó©åáþîøœ1Ÿ_™ñ%П¹J›ïÐÇXÜ|Rp æ[¶çs ~1ÐwIËÈ>ø&3Þ¯m?3…ø¾¾3 E@܃ù>ŒB ˆ" Uñó¡ø Ñ(\1À¼÷^›ôcß¶ ôÑr<’Öt \ðþÏØïŸ¯—~ ÅÀŸý³“–•x(³ I霜¶S-t±MÁ(Ù§ä²^ÞÅq@Ÿ¢æ¢? è¯ñ[G¸)}í¯þªDêW&þœiê^K]_î§àNT§ÔÚ—qEpö`j!ð…së#ŸÒíøÊ“Ö¿ën'=,;m¾ø¯×ê·Ïñÿ}ú;ý%mûÃש£Æf b\—à%ÜÚ¨l­õ⎯ÉÔS:ÆÙΖq>§…›£Jý”h w|Nž›þ9Õ¯oß!ˆ„Iÿ÷>CýGògZ%Üœ€³Wøÿ¾^~ž–ÏyÇØ6?f—èØ¤ùwn°éAÉùO^yÓ9óÁûrZ\ð¯.X® àB@÷û¯¹íÐÖ"à%7Ûì`¹#•ç”þÁ8 .@$ÿ2þ7dØ¢xÿ}÷6-L*àìtLÉqj€½óÓBEà"€Û®€®—wqlãh½ðÏ;¸HøcB5뤰¯w ŽÁ8[G«-ˆ›MÀ²^n @íÀ1ßxÛOzЯ-p3]WÔòŸ3m ùZuÔØ¬AŒë’»³†[–­µ~CÜÃkÓÍ1]N`§älXÎvgëZ¸ctZð¼P<ë:›ÖÕð¾ûì}ð»õ-¤æå(Ù|ݶ`Ñs^ûµðó‹—ßáþìë§·…”+ØîíWœô ¯€ãù7>éqº€‹€À=‡÷ÜÂÿ"”HÅ(j x1Uqv T8¢8Z!NNîÈÙò$jŸ‹áŠ€m.v²­Æ``£àn¹èÏ ¥5œKimg‡ó âfán®Ô®•þè´së½÷ÞûM)‚¹ÅÀ÷fþ|I‹€ýÏöýüÀýÚ}_»LN·&1®KìÎ"nX¶Æ1¯Q÷!sò°WœmÓ:÷5pÇè´ˆù<ûz›'Û å;/¿eÙ–c§x"} IçŸCÏy–i{¿£Í§W¸à‚€‹Æý’¿;ƒB õ.„‚g1ãì–Àü3¤ø)ÒÿÑm¶ \1ð¾ûœìˆ>Qh!ðØÂŸÖ®ÁwvóxÀý?{üeaœDJIŸ¢&f ì§1´`ØŽÙ â¡Í²µñ%Æðú¢ÍÿµPû·À>ˆáb©Îá.8Wj·ï¾GúÜ{Ç]†Ò¤ŠðscÑÏ+æxfá‰r…ø7ÿߦÇ邯<òÿðúØÄø.±[ì·Óåе*õç0ÄÚ_Ÿ Ï=ÚÜgrºð+á|ç07¦Îo)Üñ9mt~©y†ü 樦|Çà—®±é‰vj¬)ÀWcè9Ÿjƒøi¯Þ~?o‰_µAð²›oz¢ý´n}@ô\¿¼]÷/Âÿ Ié£ZÁšIþiÁ…Š™9®¼NÑF?>¶ ¢ßOÿôñ;p ¸}+9_ÄÎá8ûkW¶c4÷Sð ÔæuðÚÇÖ%û)Ø1jÉÙ‡®•ÔÍiN! ÿ2¬ücá—t¢@!À¸Bà<0§¨½NÙíÓ ÆwIÝZð8} ]¯R*Cœôuëæ–"ì[|ؾ)Øo.KÄÖSqÇä¬ãæ­û¸"àwk¤Æpã;»zÎ×ê 2jÓû§Š€%ÑùÎ ú…Ÿßþ-~I‰a;÷Ÿ ñ›þ t©à/¿ð¤‡e?C?«Z ¯ÁS âê[Hùë >;ív.†+Øé\úôÀ@/àÒE¼{Ç¡ð'Q#¹µçd?Ûjœ­¶µ¤nLS ¹ @1ð—ÇÿèyXO´ÿþÿ|XÚLåŸþcùöýý¦ýŸ¼rÝø¸—b˜-Äø.¡[ ^Ë©c×÷Áµç0Äñ×jz7·µ>9»Ð9œíTæÆwþ5ðÚ}lÎ*:gìÇ›¶_ }ó§ÞŸ»ýéÌ8v7'‡ú1zΫŒuÜâ9ń쵷Ûìˆ>>Ëÿò[lv8ÿèdû£ _èærå®Þé·øÆïÔüa)},¢`Bæ’%äñ=Jý± ÞÝçwø¹ø±+ω½Ò¸LY›ƒï@Á}–«¾†”½ÆÐq!àv.ËôꛊÃହHƒ(.iÜú£ÏÉ~ g§±RÔÚa»Kx+Ðý9ÈG>ï¤'Ú/¼ü0F!ðƒæ¿ >þ݃ýš…ÀP¸ŸÁcp].ÁÒñ¦spÉÜšðzÎ?|y?\{*C ­Sç~9ß’À.…ó™Â”ØÎ'ÖÓ­±;6gÌû†"Àñ&AS¾gkƒçÎtŽŠóQp<ÐVœóeÃ…À_~Á~mŸrÕ“žhOyw@Ù¸Fe§|”š€uQ,] @Ç>ì›zeÍʼnàR‡×_ ¹&ùгIÅcjl˜°ŸŠž¯K½#ÀŸ ä·Q¤pï|èw¿mÔG³xüGçöSW1ã×á>â]Š5bN!æáº §›ÖÔéZà5Lµ§0øûkÌ™ø:ÿ”<ì᫨ýj⇠듂×еY6Èýq:‹`ÎüÛ÷-¿/¿4nŽŒó©A•¶ñŒCa;¶ÿH¦xzæÿ Ün¨+®–)7Å¿¼æ¦Çéæðä«nzÐÆvßâ{ lZq…àB€áB ôOà ÞaŠ¿NNÎðN8û©>ú\ô}9õeR…Àh[(Ðg½Â— %äšä39}*&(é•°wç\-­¾¯yçÞþ?›äüÕ ç#à®ö°–9¢ÐB` Ͼ^þÚ¨ÅÀïÞ°­ÁµºKÇ›CÌE“9$tÀéÏ ¼–©v ƒŸ¿N™%Ö%bpœ©1ŸÆVJúðwð©LQ{Ö±|Ðùcv–ˆyr€Ÿ¾¬Å}IVß=ˆŸÕÄOkú«7ññýˆ‡›+€^mÑßË÷ãè1Ê<§â_xùŸxCîÝG¤øðçí?èp~/¦?(¦¼KÀóX $ÿZ€èçŠþù˯$¥ŽC-O¿ÖxŸDߟ+­Ks!„£“;x0•k_Q½½l{ðÝŽª?Ã…€êµÀ…†‹Í]tŠ— :ø˜)¡w‰~PÒ¹xAiLGøt´xqå˜ã[ƒ%~ïƒéqºøz–*À n<§U ´ÆZrl%b»Dï<Áë“j×2øøëTYjí"pú¦ø®1àÖ+Ûç|?ngìÿ‡0Ì7Uüî åHüE¶(°å"€ýž3·Y?îç玓ƒÐñs ϼ° ¢}_ (Püvág]×à?vk¢ÿ¶Ûà+¶‰ú¿Þnƒ/Ú(©€ ùWBÅ`>Ì‹n²_G·îÁ¯]s¼Ö)œ/X¼`x í;Ô×½|» nÇ4Fðñ‡m~G ¨y DªèuÛ"଼fµ”üX6Æc`“"l\¢¯2%»fL&컃::ß¸Ý ûéù;O#¯:‹ÿõ¯Çׂ¾ªÃEÀ3¯]ÝüÇênÊN7\ÃSi‰±ôØŽˆë¼ó¯ ÚSÖkðñת²äºE,àô5,9ŸVxþŠ[;Fmr>û˜þø617S‰/ó—‹96pï ð;î]nœA>^{§ƒžûõdzÎz.¸@!ð¼lzÏñÊ[z~·%ÞeáwZ¾ç²“ô§Â…P›¥(ŒúQ´¿põië_è^µ`tpÅÙ§ Zk[ ôúL€ Í]pL*ùÙœñB€“æ@×-GÊ> rFmaÇ >æ«2‡ŽQ;&û Î1†e°iaƒÎïÖóÄýZ@Ž_oHÒƒþgoBà÷è'Õ~ï†C»¥X ¾Ž§Ðcéñ×%wç ^#ÝÖ2ØûëÕön.­DÄâv+Kͧ…k6÷èÕålƒAïáiƒ}ýÀýÆkð†íoç+ÎWÉé\¤~>5¦—í×=¥k¾xÎ¥àqPäxéÍ6;¢EPÛJsbÞvçò_ݲ§^}stñÎÞ=úÕ®ˆa`sVábµªÂØÉkàÁ,E©RŸÇχ‹Í]\Žš´.‘UR¶§¡qtýg“óãØÀÙ9ÂVçÉý:F͘aÐóKa9û´ …€ê—"Š€ÖBÀ›µ+”O{Ëf‡ÓÿFþ<쯿ø!=lÜîµ›•+|-O¥%Îã;"¶KðÎ+X+Ý–ìüu›c‰õs1¦Æ]b>µðšE›û ô ëØ6%cö1üñúA¿Ÿ¯;÷[+(”wßc»"` /¼|^ -¸ˆ- 8Æ8ÎS‰"@ 8ß`YMÎÁv)ûêB 'gr6¬ÃËÐΩb@Û€ÇM]DŠ©b •ð§ä½ŽæÃ2î3.Éeœpzõ¯AcØSýüܼJð¸ÀáÛ8ŸR8=sVùþµßŒÎü°¬eªßÒ¸y„L“<•G°¯ØÝofÐûë´ÄœµÂÜœNi± æÌ+GÄukàä- Çi‰¹÷õÇø4(Ís®ís…oÁOÐ;¼(ƒ›Û¸=>&N–1–äíWlz¢E`›_ºÆIú?wµMÛüGZSyðv?£€@¡…Š@ v/À;AünPÀ…ÀïÒGkŸsý“ô•¹¹…æ(Üß0v'Èé[ýaϨm©Ðb ×ÓNªqõÂrÔA6Ù7:Þ?:‡³jßZÙ%Ökãñ˜h—æ?¯r;»7êIú9P\ JŒÍcò¸ ÖøØ¤Š€çuI/PÝ\ô ܧA(~\#U((^˜š|Bõ-ùGö£AlÈ2ÖA^Bm៣¶ئ·«X8’ÿ–älUW ¯Y-.ÎY zàöÁÁ¶ˆQÜ1´óÊ‘Ò#Î’üݯ=´ÇéÀ…Àã3¿r°$ZÔþIJ Å),gMbŽ.ù»PÈÓA6¾V§pZkˆýr:0wn¥5*é[HÅš2Fø ~ãc¾‹aÛ2¡Ã»ü'djP¼i»ý“ÛŸôDûe7?Ù{ …Ài/ç~Ÿ%Ð"…yé͇qô_zñO½?±ÝÖðóWÛô8]ðìëmv@öSWÙô  yð'Ûï…8^pyúx¡à_Ù ¸Ðyä@.ñ\óñ¡–\ƒmÑnú²0ãlrÀGãgßRl×ÛÒ—à`Jäì£ß5lrèš(ÎÇál5V Î?d. <¶ÚF_ã9ÔÎÅr̯²8§%Ýyá/;ÙÙ×™·V×àuwh»F~Oe©8kst à…†;®CæØû{óX`nNL_jÆuº)äbMgðŸók€µ`XǶLÊÇé\!î£!à'Ma ãåæ±&š¬ÿé½öçÿñäëî°o£àºF¢Ï1ƒ(d þ¨-õçe/ÙÎE¿›€ܽsï!”~°ƒ 7}ÊIë¼#€Bàw2´æ^€Ó<ýTŽ‘’+aÓüeṤbñ8з`d¿]ŒÔ‚,Q€”ŸÊ—B× 8;•õ­!凘©dœqzäô.SÛÙääq>9JºZ^ ?-þwzÅåNoÚ?üÑúy_é¿yÛÖB€‚SY*ÎÚÄ<]x!¢Çwh¯Ã{ß´ÞyLrsh_n_AØÔØÕ€X¹xSÇÚÇ=<ÿAil7?È”(P¼ý/½ÙØ÷iÝ}?`ár •©^ }U!î³¾Ähaj!°OŽ% ògY'õsp"¸uup ø©ì´áD½f?SrPŠë|‚’.¥‡.."%%ð¯ú-V/®1þÑ­?טÔ?]® ?ÜøíÓÇ›Ÿ[ã‡!ÚSY"ÆÒ¤ær— ^ˆÄ¾w N嬬!ö-¥srGÍú`,§k±Jñ挷x ¬M븘+ƒ"…@(‚(\!À}€ 阩±[ø–ŠüGZKÀï”@rÌ„œQè×®UžŸþJÃÿjüÊ[çöË•_bæ"€ ÇýºØäú]¦æû.Ÿà>ëÕN©úŽ€“«,ìٱ蠟SÎ/Ú']r؆ῆ\ §«Á%´¯“ƒcÀ^e§îz·O*s¸Ø©x¥˜9è\pLJØÿ¬ƒd£Äc?¶éqºø!Ç P?ç°DŒ%Ñ}T&‚2ûu8¼çP³ŽÛé–ÄS;nعýS0†ÓÍ¡sÿø8-ã†m.Ñ,Á B1ÀEoã­MüoŒþwÌo]wÓm÷j=~?,ñŸÈæ·2.þð›BÎ_4Núó¢ü±$ð2zw!xϧov°œ ðŠíŸÉ1¥w¸À;®xù-c¿æ¶CìÚï äòˆø3ü‰“ó±…”,cr:ìÙc0N·v!àŠNðkÑÇéjЄ° ÖŒa=lTæâµeRñÐkLÏ[ŽÅ±sèê[ 6lmä¸ÈøbS™Âñ–àûé3ýS¸õ+÷þ®xàÜæUõûpÛW·ï/?h:î·2×-Ró 9' 'ˆsиŠóY“¯·¥¨Ù—ÓØ_î³^ ½Û¯cRšÃsŒCœÃëa-ZÆÃü˜›©wŽÅs®_¯~hw|€Ó;Þq×Á6Wh1_.´ï¹ç^ö7_z¨Z¼q²®…Š€Ö®ò»@+jù½mÁ˜ÊRr|ñ8»ƒB „|¦˜j‡~lS°þR!¶ºÆŒ“¹XØk|î—@ àÆI±°­…Çâµq`Ë8;z$øÀÉ”>îö£i/¦?ŸIñ †·U/ôª´Ø:¦ú¼¿9\âèp¾Sqñ[HÅc™»ö¦Âcœ%°¯h«r·O§Ai.KÍ5â ±üµ±4©±0%Á÷ð 3¿v­ý85…Á“ÍONÎÉù³¿›¯|o—p‚è㻘(@ôSEû´E ÆaÞu·Aö®»®1Š‚Ò;Ì+:Ÿ@åQÕÕ€" ò‰àûÍ{<ƒÎ)eW@à.@G­­Ú¡ñµ .æB@Ñ$™[[•9ÿìÏÇ©ö \üðs±Kð¸NŸ‚ýZÑDŸûJèSßQ)ýã?:ožKpÙc7;T÷W_ÔvÓ›ó åu s|îs .<:¶£Æ>t|]òu:—ܸ§ ÖEç¸ô,AiNKÎyˆå¯‘¥á±¢=üéTî')×äÇ&~|×výAîKÃQ€èkã·ÜôDûÕÛÍ<óÚ'°O EÀ{f|d+Çšï­Z¼ðò“¶©á]w/Ïù·ŸãMä Š€T!ð˜ËNê¾,œ"‚89HéYŽÉ°žåS öa¿h£ÈéjI%ÄJΆגaŸÎï¼¢çW‰)~°m\˜@ûLï³MôŸž©Ø÷¹Å¿zä·˜ç>,ñÀEnç`¿æøÝgæ[·çÜY…“X$²)#ìÜu¦ ¦Ó¥¨Ãi‚ýBÛíÇiS3¯%çŽ5q×J ˆ3Õ³Öφ7}ê°ï.Ù› ^×ÛUžÐA´§þ‚ÐÛî¼é‰ö;·…’-@ôsE@Š»}·ä+z×䧯ÒvŒµx˧íçñÖ;¥c!?p¤t|^¸ÿp¬Z”tÀéèÏC!ŸT –ƒGÑ>¦pɹÃù–¨ñÓqàƒ­;nŽ 4n‰ðq±sÀ‡ÇU›ìSëÇvÑædm¦·ïŠýžø‡ó<ëä~;Yª±ƒýZ˜ã{,t_™GlÏ3ðHéŸU4Ñ->|áúr2'/1eN§ÁÔý;5s[zþC<íäÀZžr/!IžÂC·k"¼á“7;Xžâg®²2þ˜&äQÄb¸(ígì`9¹bàßu:}¶ýŠk¤ý˜·_±?Nñ}‚)ÿ‹pŽàtN®Åa©b?KûÛï^*L¢ÎI| ðIÅ€¬ëŒlJ¸„¸„‹“Âù—`?ÄqÇۣͱsÀ¯}×Α‹‘Bm¢Ï4Ú,ÓBàÇåd–|hMy‹òØðƒíš5`ÛZ¦ú ÝG‡ç—è¦{¾®øúròVZçsZ`íÜ>¤Xjj¨ké9í×Å_GJØ~ƒù uŽÿ¾µ‡ÿTFóÍÉr¼{û±‘×ÞnÓ¹›Ûonå§…W™_ÑyÜ•6=èÇOvâg;Ÿ”H®¹rE §t±ø*©”´p|µûÿÙõô¹pÅÿºæ¦‡e)´XúŸš•ߺî0^êOêœ<ŠY…@jdC[$xÎòcœÀ׿T–· É0ãì¼–ÀÅ«Åù‡LÃc«mô5žCýR8;7&÷aÓêçôˆƒÄ?¶ ·—B€á{î‹>kð?ó°§+1ça¾ðG›eJʶÄŸcÃû J’šwÏ.áeÂF¯)¦¤Ï9 íÆ?+ð~¶ì3ïã1¨k9í÷Õ_Ovµü¿Ÿ«Ï%°€ç;·oOëÕ€íRüõÚ¹b @ …P{…‹Õ®øé«lF°ý¢àb…€¹wüOüLéOÅæ‚\"Š]íǃŽR`0•i¢Ç6è_Ì…@^KÆÙ©=t¼þµ¤üt Gʦf.¥ø¡ÏÙ¨nj¼–1˜Ðá‚-Ú5E€âþ~ücÿãP†wðw魔г×éC)õ7ùºAÎ}È””m‰)>Ç„÷ñBÇ%¾ ôîzbjlm7þYÀíßÔ}^›–y­µCÜù×Ô×QRȤbòOYòO6òýš_U¯…ÇâÏ—³Nç2•Ô/îî§:çÀï @à"à‰Û¤NðõÝqªsÅëþoü?Bðu]ÒØžÁs®]oú”anZ8ðËTA|ä,Ø!tU ì«íTܧ>æb/xMÜ:*ì Ÿ”/ÛéqH‘³E,7VPÒ•b;¿ §Îcª¤t)¿\¬~Z@ž»™ëß/ÎwíçÇLyW æá”²a¹ÃÙÖø)S|Ž ïg ß>Áç¬Q›;ÃéjIÍÁ85¶KÛ§œî4i™×Zûq‡Ø‡×S|—F¿OSºæX?åúLñ#•…Á’c¦øë/ÉÏ%õ»ý5üõ—œìˆ¾+.´èå>€ý¿ßÊÿÛuŒ?.°A£ÄG)ÝO›ñŽ*ÞUÅG¶´øÆí±àBà›·ºïíúA´×,?A®ˆ"@ ØŽÞ€’Ñ Ì;¶¯ñ —ô¡ Î{!m£·&n-û¶äÀžÇsÔÚ¤Æpr&ßù†¬&f³KéJ±U_ƒÑ yÎþcß0Äúø7Æø¾Ì+µ|ìÚbľ(5vNæP»Z?ÐjÄþ¬-Χ)¿ÖqÖiI„­öŒ_Á-cžÆü¦ÀëéøÎÂ9w1Â×®5í;;%l\r~,jæè˜ê·­ó9Öü‡qüuWCø;^t“!v‰Úï(˜ûyá÷ÛÏEЮ€î¥7?9ãÞøëlzTþ¡nF„, }W àBÅ@ŽÖ? Ëb‚‹œO\üÐvë AÒíÙ?A\?¶ªKvš8râw©8\›Îk¬ëނƼ–FÇ=µcŸæ[à5u\l…Þ–/¡×dÚ/v.I_›Úù¥˜ë¿4­ó9Öücœa,ýå€/øÕí«þZpòèøñ+ov8½Ãý‹81ö¬¢…@ð‘Ï;éa;.þèVÃV‹€—ÞlØ>ÿÆ';¢^zóºõÐ"@õAîø6µ…@lã߃c;è†"`v!€€N®}gÇ„>—Ô^*×&‡úcuÝõQœ;Çiã¡Í2…ý56Æeœ}Óƒ~ÿ Ù|Âþ×xjŠ÷‚œã:¹êÖDÇ=µcŸæ[áu½D=¸Þz]¦[—¨¯IËür,g ¦Ìå˜ó±†ñü5¨ÀüÔö‹¬àׯ½éaÙÅÈŸý³Í§GÀ…€ZômSh! ¼õNc}ªðúà6=ÑN)^qË“žh¿àò“žhÿúµOzØ6^ÕX6.ø]¦(dQp10ØíûM…œœ.Héà—Ó»Ä1X»`› |-ìãâ°l º.9œ î˜8Ø6Ún)ZÆ 07õËÅa†õ%Û@mÐÏ‘²ÛÇŸÇ Š€ÔÆuJNÇh¼_ñ¿òë“Ã} jÆ>ÍùM×õËà®Ñaïö5h[‰¥ãÍaÊ\Ž1ÿ#GËõ˜û5›ø^ ˆ~í»y¥qùuqN ñ9›Ñ#ýÔ%£Eý¶+Rï¼ P ÷?(¸ȽKà’xØ.RÉ? ƒ”Þñ¢› qS3Ë¿sƒ“è‚êB Œ\)Ùa`•iÒÎr! ö.˦ÀëÂ8[‡Úòº·¢þˆ_CËØ°Mù´Ær8[†mj|œ~އuÉÀ2~èÔRëÇã7‡5©ó4æ5^ÓK´¡× ú|æ[—´/MËœZX+î¦ÌeÍu ð‘žz¾ën‡ö£‡™ò‘¾%ïøòòo~úô˜üÍ—îçÂE E€ÑŽ" ¶~ñêC\~g`Ê;.yÏ 'ÿŒ³-ÄÉý³®S¿ XÀÐéµ¶7¶HµÝZ°ó‹öy*Rp’­¨¶=58?ÄCü5c"ÚªgÔ6…úð6‡³Iù¹qrhàà‡P‰’½ÆÎñoÿ¡<ÿÔ«‡ÉŸÏ”Æ;ö|–ë{‰<ß kÅ×$“Ó)aËçõ´Ì§•5c·0ukÌ?b*î²Z®¿§o:ô™Û¹/©÷»îg•ÚÏÈÿ×Ä3áÏ?s3"d~а}§)¬\ (¸xæ„D˜ù‹ÏÞìpú9 Ùר=`ýûî³·Ó" ˆB@ö‹W?éAŸ}~óº™ïÀAå5´øaœ@ÇàR!0ÀkÓŠóG\wLRäìKs,Åúšy… pzEíJ~)½“³,Ú9jŠ…“B¥ÆVm>þ¨ò<§àœÀÍiiJãkkµ¼D|29vz^/Ií<æpŒ1j˜:¥çñ˜'g>Öð«6Á«n=´ß|Çaû‚{ÿ( PÄŸáÈN«xõmü<[‰w5ðÎFê§2-R…À;ïz2"doù4¿V\¤ §]sÚ:¯U(\p¢Ÿ³ƒ,ŠHè±å"@‹´¹p°…”|á´Òê1Çàb,x]t4Á.QòA\Œ“£d‡X©qr>Üg½ÂöºÍálR~¥xªG?¶9¦K A­Ú¬…KtèÝÜ–¢íñ×놹sÿñÇ@Ú|{fmø:UJzvKíøKp̱R̙ÒóXŽ¥ÿŒ‹ÞÎáOn¿ñ›™wJ<¿+^§[ \ 0ZQ0lZ ß¹Á¦'Úq¼k¹ûíýà«äËâà+»â°ü+¶ßëøWôq2—è3%=\ ðE€¾3F…@ô¢™BKg‹É[! ëÀ}È—l;jmWÇcJzàÆt¾*KÅ9P¹k;Rz'/Å Âf .É+G­Ú8þã?Mß'à’vnŽKнæ˜Kƒ5rsfÝ%<1ëä®_PÒaãÎç9ÔŒ»4§1¦2gKÎ?bH†‘´—À+Åo½“·Ç/ßà‹¯Jê³ùüŽÃšD!ÁÅ„ò“ ?eÚÂ>«—‹€wÜeØjðæ;Û?¹ýÉŽè;¢àb@Íi©Âïkº"!@ÿ«©Bૺm¹RS°LÿùE €ßÈ¿Åï„À]0S©‰—³Á$/ãu°×„[©±a75¦“;t\öuc¸ØÎŽ©‰‘“§dÀÇqB? ÊïLMêØO©±U›Q ” ‚}ïC­Ü%;)ÂÞÍs.©¸k·X?àl€Ú^bÿæÜÿ ¸ë—©± ½;—§P3§µ8ͱƒ9ã/9÷ˆ¥¤ôoúTo¯ä’àôw½¿îõþú³¦g(\Að¶mQÅE€ÑŽ" ¥X‚/¼Þ¦ÇéQµ ¾e{~}íÿ¿½óŽ—îªÊ¿´ ôN‚ éM:HAAñ$Aª`( äNè†^&éņÞ!ÔP„^#Hîï<çÌ3óÌ3k—sæÌÜû¾¹|?çìµ×^{Ÿ:ë™ÓNµ5ƒuLø¿íŶ)‘@rB@Å@$@ñaá¡ xdì<ª#ôÙ­B òõ8˜F}äðu å¶Ó¤[ÉÕå`\ïKË%ƒñh‹ü¼ùEÔ´íK}Y®E€%u:U»£õŽûEþê±ýȲO‰(áÉÁv>ÖUHÅ»ŸUá²÷—¶Û£=Æs”|QíË}è3žu±ÓcX¥ÿMŒ}¼¹IþæÉ7®´XÆ3|N€|À>fõ¡©8ȉ€/_jÒÕýJïþˆ‹˜R¸Àü'/ÜMÉQ’Xß¾çž>³pÎkMf |Öô_ÏwlDˆêø…b@hS!ð ±GüôO'-QÝ*àMG W]y}Iµ¯Ë1ì/B Z¶÷Ór¶z·õqAÔo ¹jKùäHù{\­SØgDä"_=Jêtêu¹¶9JñR¬*¢¤§¶÷1!Š3VìUár¶ßc™¡Ï 89ÔEûpúŽg]ìô8VécGlçµr Éç.ÖÍG"P@PwLïM‚ /T^¥PV騠%O7AÀí @PvÀéYþh2ån7}ûAùaÓ© ~Z…@J äDÀÇ{kØø6~ƒDW À‚ð‚+͉üR¸Ÿöì¯ðú¨æwRpž~ }Ü·Œ¥‰¼&ö50ÆØDcÕ1{} ¹v—óŽûkÙñ¶|ãI]4¯¤ì5Dý aû1ñm@QÒÓÆÑq÷%j¿jÌ¡pyHäÓ·ÇœÇÖOt,çȵA]´ÿÖ0d,ëd'dzjßë;â‚×V~ öv$á$ªÏÑçjÀ:¿×Å —LYE€ L)\¬D€ ÌtÓIK;³f~ Û¥H‰L!(…Å?À¦üôí'·˜/³‹ÐG€¥+ÑÁ¡hc%åÍ+#b3{f¹u½ÐÇmµhܾI~*ŽÚka;Á²Ú†kß·ÚX„"€_ÎáI]4ïäêrDý ¡VDIÏPOÇÞ‡¨í*ñúÂõ±Ž>5öõDÇr ©¶°Gûm‰UƲ.vzLµýç¶Ed â`ÿòë½ýz{EÛ*ï=ϲmU>Óã''îOßÀ—‡S_&*úh›— "€ Š@!àb€óD@$E€_à<¦*ÞvÖnú¦,]@¥®¨ZÐÎIÙMRÖï+B Šƒ)û¨]_îã¶>xü¾ñÔHÛ¨=íZ· ©8j¯í/+Å*" *;¥úÚó)xKÐö£ò~9¢ÄgW—§o3$F_8Öu÷¥ýìQOt<×’j{´ß¦Xuëd'ÇVÓ7|”¨ÞmCð~ðŸUß䃺sÿvï˼õ¬éåúõÝW?_¹øÔE¶ZÔTð¡Xrèi—ýsÛ¼û\“–¨¨ÀôóÓq¦þiW\ô!zXøn6ïO…€Šª( ® -q”(áOÁ6§$!áíjaÛ!1¢¾ûÄɵըœWèW‹·ÉÅÉÅê«OÚ4‘Óº\Ù)Õ§`;Lsè³ÛŽzþ͓ڣäg ß—-…ûöi[ ÇD"ŸuàýîQÆç!D±PŽö׈±Æ±NvrŒ¥¾Q¯¤|"{-hÿƒëvÓ/&w}W½¶}a €H ¥vû½ï¼ÞÀ½… "€ \’{%òQÜG…  ze  )¸’ÜÖ¶×8ìDÉ¿B¿Ý("¿(¦Q\GºÎÜ^ƒÇë#å_ÇûV»Ï§â1†ù­/ù‚”ÛQîl‹û_k«| 8Â}kÚö‰¯plŽþû ¾D И°Ÿhõ«mS‚ý¯/Úÿuè±<åh_UÖ1Žu±ScÍõ‹:%ò!¥úÞÀwø­€/_j~ –ÚmÏ/èòcVü Õ}c phá•¡GO¿{ÕîN¡·ZE¨à»ùk–Ðþ_æ]ýJjû}šy?*j8ÏU—Ïå.tþ³ÓÓkP@!@@!(T€âÑ=kYëÕ®ìïB ´üjSÎ×ùׯð¾Rœš¶êSЧÀWñ:Öùjœn~ù -á œùÔ´µ~ ÇUKJl?>ý¬@”­ ô-§BŸß\¾Uã€1bÓiüØ ùh%ëǺة1§ú…DõÎñ3>ßÛþƒë,ö«Díœݰ«S@Ô"@…xÅéÓq÷èÐWo’»Ÿº¼Þþuú6ŸZž`o¯>p«Åí¹78sÆø¼}Þ«Ìí.T¨xq#rËc’N‘ÝaÀÈî¶¶›˜÷$^“û‘_óµB å㶈T{ÖEveŸ\ß„õîWj—‚}FDþêËùyŒøà-ቛùÔ´#}| Ƕ.¢$h°ßhYër>Œ«D~}+žÆÙ#Ë,…ÆÃ|´‚±ûÝ;5î\¿}Æ4dühãp"ú*˨B°[xMðæ£Ý*6>u‘n\Ÿ>dÒâõ ŀ扵üË4‘Î%Ô¼*@1ðÁóOZÔÉ?AùK¿WwŽ>ÓÍÓ~.ïóN3iQÛ*…€cd Õ\] ƵB ª‹Úa~§…€ú­W¿È®”|rõ¹¾È¯o[÷¯m¶$eO‘òõ¤K_ ZB“¶ˆ”OM[eˆÿº‰¡uþ£åÕiÆp_µGõ›"Ç1¹cŸÇûX0&¦©}ÓÛìKìÄøÇêsh´ß»f7ÿýëlµÐžòw~p½tâß w1¹+Á/ßÞ_Þ0¤_Åeýß7S€ùܲ¯“Ôs*ð¦¦ÔÛšxE %^ÜV]ß¾ÚÜ·Ï÷Îr£.Ä@N¤Ðg(tÜC¿&ýÔfÛV €56§Æ'‚ƒÜ_„@‰Ô:ˆì ×N;Býkû&9ÿ>q€ÇêÛ0†’K¾JoÒä-Eʯ¶=â¿N˜øx2´)8_^] ëk}”ÈwDcØ#&}\Çç€UalL}tßëߪìÄØÆês•8hëÔøŠ€÷øÕؼTnñoDI>D€â¾˜§P1PZ}ùÄ…ºcçîbȤE}ÈG/¸ÕâöÒ+[!(ÈK¤ü¢Ónµh=ùpB¸ eˆp \À¼ätÃâ¶Bà!ÿxøÂÆMœr>GO ö±'êíî›ë/Û m›jW/£¶}D×v1éJ]H%g´—Hùö‰Aú¶áXû²ýØüw<Òò¦Aÿº¬©e§½„·ëÓ¶–\\íw2~\»m°Lçû`ìK86’òÉ•7Ŧû³¿Ub¡íw®Ç€ {Žù|Ž×)ïÇ{À‡$p÷¬¸7Ü£ñQ] )1 x{r¿i;rÇàßkŠåã¿]7n|öŸÁ(‰ÿ:ñIWœÌP{ŽÏÿn~Û¦DÁ‰—™´`B„¸ß´Bà±~h¸Qoù(5>)ØÇP! m´ó«”Oó³~l¹]võõrÊ7…ú÷mKØï*í#;ÉÕ—ú2¦yÌtÒUó} É[Šœ_m §O;޵–íÇÔÝ剸–wˆÖG_ÆŠ||LJ~{䉎óMÐg ê«Ôø¹Ï¦Øtßcö·J¬Ôz§]y×9çöVܔГ»ç›·}àþøèÙ·É{ýÿ³9§Ì—À#›X¨{øtªäÄ€ûöá×ÏXn_+ÀV!Àù¼5å÷wkÛ+/?ý²ÝEoUZeùºi£t…ÀE@ôF 8ßòùV¤V<áqøñYܨœ#›Õ»Íñξ*0Õ~fuÁ2û:!Z—óË‘êGí›BûWRu¹6¤ÆG™e¾_ùU€¾ +‘óïKéÓ–ãVj_ú›'/_H%â‘}“è£õ°“èØRÐOÿ!¼â^Õ=æDÇú&è;õOµKùDösÆŽ—c·ëwîúmò+-úz¬!ÑÄQ%øÄëS>øâmê«·c, ˆÄ@Š7žyùœ˜@Epð_gßšr$œ!B zÎP œÿŠË>œºx÷¹â¸_¾Ôâ¸øêZB!påË_~û·žò¤GÌÆaƒ¨Î¡/ýµÖ)¬wX¿¿hÙˆÖ)}}úÅrÜ¿¶¢m4žÇŠü´>E­˜Ç¥äÃ䮆œßXNŸö»¢b Qru›€ãÓåõõP‚í""ÿZƒo xÿô$üúƒæûæÈŽ÷uÂ~ýu×5c©õéËmN?iq{¿/cÅ©aì¾Æ\ÀßwùÔÀÛÆºÝÃßlCrI>}õKùP äDÁªP |¬òjÀ7¯<™²&ÿà¸swç]н" SÊ+¦‚à™§î¦ü¦Dêáåˆï_»Î¯„_B %j¸âüÁöo=ý¨G/ì̺C»½í`h´É%ôŽ×¥Úa^tÇ|'åã10D—M‰lµxlRã“CÛ¥ækÈù£."òÍQj3;?Pú¼Èñ/GÉ¿oŒÃImì¾ÆZ~M¶Õq¯é-46Ÿ¨ÍXb<¬‰¯D>9\Ô¹X— ¨Å… ´éUH`zl …@ 'ߤì«©‹8ã-ºú \!öƒ (œÞ.t]Üô¬zÜl§æNªåPÉAË_.¡w¼.Õó›5ø²GöZØnHŒ¨M©œ£Æ—}*‘_Šœÿ<^ú@©}€x‚—£äß7^DŸ\†!hÒ]¢¯ÿªx(GË­¶úˆ ‚|s^÷ɯ,úE”b+Ç­ðONÄ[ÎSû3ѱ?샿k)Üå(¦Cßx½$Aù.͸_J4D}÷aŒ$7¶1û!«ÆL³Þn p¬üžKþŸÛì+9¢691à¾còòfQðä|ë*[-,«p (D…o=J}L)í ß»V9FÅЇSüwó;Ôö2~Þ&Ää_iŸ8úYOXX.Xiõ$‘òÑÞA].¡W"{ªæ7-¢eS¼.š¯Aãù´†”od¯‰[òA=}Ü—unˆ|´} ¥dhbW¢Æ¿oÌ}âÐÓ4Á®eh»¡DýÁ-»ÚY¦MË5<ÿWó6ïüþV Ëì#ê |ýò‹û顉W×­Ê=zü›µ/âÇþhüè7,‚¾Þå¨À>þvúPç½O5™Á:¢"À…@$îÓÄP´.K-«¶:ù¸mUÆŠ©ãÆqô­8ÿØÔÌÿ­wå«öµa…WJoJÁ¯ÐØô=ó)ðÏÍ~0ÿ˜fÛj_'Ñ;þÉ·®2™Ñ•;!à‚€†ãÇájÉ ncàûÄ*t³yŸ*¾xÉ­´€b '®{kmÿÖs~òR…¢'µ>Ô´Õ~ü@Ë%ôJdOµÃüP!«÷˜ö:¯~ZΡ¾©ùðÉù¥êÆlWŠSª÷r‰HxÂæö¾ÔÄ£R«v\žX÷eŒ5¤úI-'ìÊ«~¶xÐ#¶§m›)к(RýþÏMëöÑ_(¼–¼ýlýÇ¿¯¡Çþª0fô[UBÛy Æõ~ Ê*4¡ô7ŨP»þó 6õóºÜ}£½’ò‰ì«²j\wJ¯‘%ØrBÀÅ@$ œ»OÛŒ gÛþ‰­'.¾p‰­(ãÕ¥åws1ΊãªX•74iÁ¼Šò•Kwu.>sÑ­´)ze ¢}FàùÏyJ[Ð×ô©¹„^‰ì©v˜ßmB ò¡_dW¼½·)Ũí#²“¨>eKÅ*õØÞ}µ¬>%ÆGŸX%_ÔGÉu_ÆŠ“¢?ZNØœ‡7 ?À<„€ŠL_ô«nßzÙ/÷±Ã³ï(+—ú D@JœüS´?£ç‚!h¬èw©#Ч}´S¨Pèü+°ñê”Ø b”bŒÑ‡³JL´%GM×éS¦S”i‹ü×Å ¦‰²&ð%!àb@Û+°»( ‚MðÓ?´`žB€è3ß¼rw.¤àTEP\¬ÂIWX^_üXš¿Õ'‡ L9þœ(±=éb^ãjWÝþ­<÷©K;­ŸÀ†°J´Í%ôJdOµÃün^OruÀë#ÿT ØKñIŸûh¹¦¯š>Éù>h‚¶jû{,}â•|Q%×}+ND)¶/#ÊC€ ™ …" V œ|ãåO\ñU¡CïGÝ—ñsC-lýþ Åã¥â³oG@Jx›”ØWÄ@ŽuÅmøVÝÀñ™´`>Jàs"€ >'êjÀš},êSAÓ}ÝÁ÷ô „ V`Ê«4ûínJ¢[mÿ‚3Ñý&" HΙ §P!CÀ·Èâ˜?|ò2´Ï¼à¹G-ìðÑ࣓Y‰¡íÚæz%²§Úa~7 ¯SRõ©¶«ØrÔú«æ‰ú¤¨õsæ},îì©ohR¦äê†Ð'ÞNõ]òC}”\÷e¬8Nm\øåxøö-j»ÉÉ“j¯åé,s}‚£åG-‡>¼¶Gšè¼BÛE¿;«ÅÍõ…ºh|‘`Ýc›y€y>Z+0¯B`,1бjl0FŒˆ>q¹Œ}|×A”¸¯JÓ……Æ“§û•‰Åïï)<ùÿé-ºòOåÁZ"€B€èíZ.rðU¥*¾}õy{ÝTœ€¯þ¾ú qßÛ]nCôu¦.¾²–p\­xáó–…€££ZD_ms ½Ù£v˜Rì”ðrŽÈ7վƎù”_Š!þ›èh_þ6 Ot•ŸZúÆ«_¥6fÎuQb=„1c>ñ¸Œ˜^çûÝÇÑ¢äŸÜâ'ݾå"àÛMâÔÀò ÔÅ$w+ÿòËI æõÁ?¿×u§{ñê1öu¢ó‚£þÑoÍØDýäúæØRc&."1€2…€ŠL]í¿h{Õé71¢:·õeŒ)úÝrs,ÛÜ_ËŠ·SºY¾~Úï±Í¸ëð‘)ýД~¥ØÑ[Ž(ˆ‚H©+ä&gž´DuHþIWÞZ@}sÏ 8‘8rºÎj¶ˆ„€¶ûÁuçóZÏïÔ|ÐÌÉ}×àÙ§ÉÇk…Àáw=laÐ%4@tb#¥zEc’TBïDö¨¦*<§-"W<¦*fuÍ|-êŸkŸ‹ËºœOŽR;ÔGD¾9ú¶éü»›ÉžÒG€Z¿úÆ«_§v¹#;A½'ÖCÙÉXð‡ (÷áoÝís*ˆ…vŠ€?¸n7>òÖ³.–ûò éò¦8öì±Ú׈ΠŠûG¿;ë ÕWi gj9\äÄæUP 8ÞW_¢˜@ë¼ÍÆŠQ›ËRÂÛhYñv)"ÿ Y_(Þ1ýG›"€ÿl»ðäß“ÿ”ˆ€ Q}^O(jÅÀª”„€SªwrWRj;„1c•#(­¿¦<`š‹3Ÿùå¾t¹¼ŽB@ÀãÍB@0V›ú–P Ïð–5>ÇÂ28Çu–û¸ù™ÏÕ)! Œ%HN¬‚ÞæC!ÀÄ=‚"à;rEâe,/ÿKN7EPno ZUhG)¢]´I%ôJd£ÝÛaššØ;5õŠö³ Ñú&©úT[ÚXï¸?}#{ÄÐ5}ÀÇÑ‚ûÞ ´.†ô½îñÖÄÏù .J²‡²J¼¾má¯W (€‹€[ýlkÊÿ›ù¾Çu•‰½ø—[-,Š€ÔU÷Ÿoîÿó¿ØjÑúZÞ| üŠpDô²“”Æ”ª×eŠ8\™Òè<:&èÃ…Ñq(F_ÆŠ¢X´qÌï<ǤóÇ»›zâîžùhŸ ªy.Hû|¯zÁxüÛÿØ_Ÿi€P! ¼>ø‚Š^BÀ‘”¯—•è$¨À'•Ð+‘vo‡éN]%õù%ßUc¥lÀ“ºO\wŠ¡cÙÔ2”úÉգΓí> }£6nŸþÙרp=€¿úE7ï" †O\hÒ‚y|°&õÑšüÒ7W('\¢ÿXwšHïvRã岤’üR½‚zMþÔùyu ŸœÐ2‰âDD¾}Ú§ÈöOOï»ÿÜÅ'-ô‡ xåÝr© _‰?äóÏh’dà>€âƒãªÁ—‡D¾µükâv¯±Ä@ \älן—)>xþEŸ]p¹ÏcÎ4YÀëu åWŠû²¿~ù:ß%! ­ÊÐx L$ôJd£ÝÛaºÛ„€Ö»oÔ6çƒy’ªç|TN‘ó«¡ ¶óyKèÆ¾hŒ8«´cj)õ•ª‡Ýî1¨‰Û·oø“Ô?þ×ûá3P>ìW[3Ü·Äí3¯ýöÕÒuÊq"ô-GïÖ¯QrÛœRˆëÝŒŽ™ËÀxRŸBýÔµ~%8ΔPû•Î?¯b)ô‹ˆük)ÅÐ~r”|ï|šÉ‘ÏØø²(‘ ‘oŽ—5mˆÚõ9—Ò­n9\€Oo/")ð¥ß_<—Rœ©øÉô•¥5Dë<ÚþzÓ“®ÐÍõ²ñqBñï* a&ôD´ã!¬íS ½&ûZV¢v˜î!@?-k}ds–u^q[ODʧ¦m¶×)ðdŽø«AgöÆß“V·åHÅéÃ*íWí»/¥þ¢zØ<á‹Rì¾}Ãÿ"Ÿ:¢óD“u.î4Âo&-´®çMgŽíµD_—ä?9n]ᳯÄz_‚ãöe‰x\ãGP~ätÊï8)1€y=Ïæ`¬¨nŒÇ¤ß…íµb€>9Rí";ɵ¨Ó÷õójÍT›{N¯ ~ª­Ì7 ΣD̓®:®šØ¯·‡’?ñnŒxf€Ï DB€h[¢I|ô•¬N$ ^}à¤Em߼ʤ…e$þ lŸ¼ð¤…>}p!P+rë?µ= (À—/ÕÍG1ˆ €“o2iQ[Äëäaë!à'0…©eHíS ½&ûZV¢v˜î!0ÄÍcµc]öTèÓG_Ø7ÐDnKÞ" hªåM±JŸ»m¼©:Ø5á“Tì¾}Â_¹îŽ˜áu*^Gt”8ùÆËqÞ+¯WôÏÞ—Ð+/ž¾.âòf¢ýÿÚípÜ÷ n‹ÐÄ_ADA™ S4–ÂóªŸkSh»1`¼®pnâoSK‹ôñq"_¢~.0¥¸ÑYæuQ ò ©½ô‘{KRàÛˆ˜(»ˆÈ%þøfAùßN¿è €:ŠHDWT¨hËWîÊc‰€±ˆ¶E´]”Hx ò“›7¥ó?¾Qÿ=ç™ïs¸-$…€£8˜µ~ì'•Ðk²¯e%j‡é:„€Æ ‘`.+ínS»NõURu¹6 O»R¬h¯h"—¹Lë8¿ VíoÓã%¹~£:Ø4é?¤?´¹À‡æû ‡>›ä ™ûôù¦N?$ÿšî1'ú}Úø¸ùŽöG7S€ù’(‰>Q¿Ñùשñó¸$å{×Ól…°ŽíKbu·k’FÂv5Dñ@©žÀç3´¨?ÛoT¸ Ñ•ÅÊA‘ ·œ= ²íP4ñwP! °]ID‚ t«ÐIWìê!ˆû€ã/2i‰êjx÷¹Ž íc“Ûö©º”øáõâ}Œ ·P4 æäêˆÆQX—Jè5ÙײµÃt§„§NÊKçsþ W_j "·Õĉ@;²&™ %4!Uÿ™ŸÕo’Uûß©ñçúê`‹’ï1Ñ>úöˆ€H°¬\ï‡[-,_á¤ù>zù.À§Wîöë¹ ¼òg‹ûtŠ_þõb;%u¢Þ#Oô»´›Ð±B¸H‰”#!P €ºÜü\¡~Ú–Ü·IÐÊ÷²„-ÂE€Î+:E}TÜò “êC¢X T¯h<%ò¬såAÓóÈÝ*ÅyLc˜¨ÔC¤Ä@ç]çœÛ¾ôyè…Á­H‘ ¨w!@ؾ$@Í«F•H0ù_U¬JiÊöËÛ " %\AB@ÑN€î¼œO­­wPŸJè5Ùײ²Øf¾2ú ”]ñ˜j?­=±Œ‘°m.†R/²;îW*ç€/q“Ën>ým”æê7Éýïä2äúŽê`‹’ð±`ü!ý  rðG»z@ B€"àò__Ügäå?O·Iq+»ÏuU5]~çíg‹íûÑïÑn€ã£H‰B >5"@al=/§ ¦¸Ioir@P¾Gãç°]J¨íŠ…gXç¨àüMí6—\¼¨.¢h½¶Hþ¯w¢˜,§Ä€ã툊€ûíe}Ûé+€¶HüÝ6¾)G¯ ôüË‘ú–K º=|›¬‹ï_{ÞO$ÀÊBÀÑ(¾J 'ô´i²¯ee±Í|ãî„H-_dWj|Ⱥã±\Šz%ª×¤²+w‰[̓ÀÚ®–(ÆXŒÝc,‘ê?²Ã%á)à?¤Md/v*ü+°¥D€^ ¸âIóqŠ€Ã~ÕùÝq:C„Àn÷ñNêû¢ŸN¯ßè7h'Á˜ŽœNA$XWCI `>‡Ãx~>Ž ¯ E…Åpð7ònJО°=¤™*ô%zeb@ÇcÌÈ®Dísí"ßG4û5`¬H àaÿÔÿOãæP¿ÿÛ'¾màP(Z_#Ô?Å«œ´DuøR3¿Ö܇oÚI¸rÛ§ô`ø¯ï×{Ì’XIhG„v¯×…®m<¡§M“}-+‹mæؾ f±¦ó^ïÔø€Z?¢þ˜Oµg]ªÌë';š˜8êWCc,ƈ¿î1ÖƒÛQŽ’ððÚ¦O;øRœó]]ÙE@à*ßZ,ˆ*jØ~ÐVKT7&úðñ‡¤ûãöä¼nãÝÀï~¾<ý=Úi0ˆÅÇ øQ)ý¸Ôsš„`ÞorT `%BcDçh >$#§ßãßÔ¸RBàÁÍ> XVn6©˜‘0Fª®ÆŽ2…@$0ý³é›Â"1 ±õÙ$‘PÔ7—ôëüLúúò» œ»nÓ!Û6º¯hLï-ØÐ‰|ATçm} |<¡§vÎG,¶™\*¢$ÞIÙiND62†Š>¾„m0Õö,«-Eç³x‚Súˆ ¾%¢öc1VüT]ùE?e‹’ñ1`lö[ÛüRBóúøÖ°rüâ¾ þbú/ÿ•¾Ñù ':ÓPnµÁ×úö%^‡ò]þo¼q1fŽèjÀ?X;ÿ­Ù 0Ž>É¿‚z H 87Km ü<ý͸Ûâ+°ú%X¾â‘ÐN \ Üát[!¨Óñ8¨Wðé~@!ÐW D6¶QIÅŒp1 ‚P ¬Jn c ùw®É°Q¸Ðv«òÕËNfDõ›äo9lÛÖnËÔUí›ZN :+¬«¥¦Æ×Á. ÒzÚhç|Äb›ù†X·CDÛFu O¬}ý ǦD~qÛùíŽ&9Rí8ïöØÆ‰|A®®ïgU¢>úŠáv”£d|U4®öYÓ|Eð+9!p‰/lµ`"€B\ú+ݼ_`ý¡Í<`¹–Wœ~q|;‰nßêÿ˜íÅrêÜñ„ÿ“H°)ÚD­ßPt,ú®s}Ýbè#¢qÔ€¶lÏyB!*\økjÅìÑoA½Š˜§HŒn¿‰â¹öTC?¶Y•” ð>žyêI‹ÚÀ±|ãJq›ã™´¸=•ô+žü5b÷ã¯{ÇÙâqì†ä?‡¾.úy—Š>ÛôCò.µkó„¶™ ÁOCè‡} 'ô´ÑÎùˆÅ6󕽓BÀË%»Ãøœ÷ú¶YÆñØ9Û×ììÜã$$BÛFÔÄcŒ¢¶n+á1×IÔ‰¨]Ê%ä«Àqs¾¶?¶#7ÿÉÃÚ)…À>Üí5"€SB@Åíwþ¿nÞ…ßíÏD¥GÙ+߸âÊJè:.ÿÛþ<=žÜy=ÂÏÎù>×krG¼o§ÖoŒM ”€-uc‹‚CɉÌCP DÏ Db€>þ;¢Ð‡"€Ç—Š‚²‹(^d‹ì„õCÁCý‘ïµÎÛû oçÊó§Ôzµ]¥<ñ2ó¸_ü½nþÄ& ˜§xes,̧„@ ½àdm*8ŸÑ9m]sƺøµb µÿýü6s{J(Œ¥1GX pd¯Aì =m´s>b±Í|E÷‘-Bc€Hè¼Ú"{¶©%j§ñjèÛFûªAJ=HW!ÕGª¾lï1Sxû WŠÈßm(GIùP8NEûcŸ Õ€"€PÄ/S¨ *Ô!ûЗóÎslµ¸ýƒ+|Gàÿî\×Ö×qDÔüãöârçÎåÊ{^8ïû:ÿÒíVÞÿ&`ß%‰ÌG@OPª'ðSž<Ý&Ïj÷ú•ÞîB Wübàb@ë@ô»Üb¤„æ8z¬\YAݪp =]·;`î§bàŸ›uXŽÀzåºÝ.T P¨5Dç5ùöa¬8µ¤öÇŸßvÑ–ÛoY§,]щ£cÅð„ž6Ú9±Øf¾¡v‹ðrÆ%‘O o7¤}dXìkùàˆÞ ÔÚå`â|R±"ru¼¿WDËÁ¾""ÿÝ@4Ö÷Êž¯‚ÇË5òu¢„] ~ty{»Pàå!œx™n,ï*üë÷áé?<ääÍË©eïC´~ }ôœq”|ÙÏá5ø¦®(1íÝ ?¼cïY/‰Â±F‰¿¿¾BÀ©ñˆÄëŸÖÔÌS ð}ï‘8 Ð+‘ øÂ®~e¤~c¼L"!€)ð’ð:µ¯ŠÆÑ±€1àüK#"ØrÛvPô êKɼ.ßûÏ;iqŸ”]á¹,u~ƒ±ã•Ð} "À…@Ý¿ÉL¨ÑêI¤†!mÄð„ž6Ú9±Øf¾‘vBpªë–åúD¾¥¶ÄÛr¾¶=éß_|¥Da¶ïƒÇê ÷·ý@KÄØcÙ>n'ò¡Mã(šœ÷!j ›÷¯x”OÿŠxlýtlW~W®DÉTÕåÓ¯ “¯_¾¬Q⯼ ³o8hÒâöš¤:¸Ï’P8 :Ù8µ~Ú—'ô´ÑÎùˆÅ6óxÓBèzÔõªÐ·äÙ•(†–kb~ý-'³º‚lË8}ðX$W—ãˆi;¾¦Üzïö}ìnPÇn†cÐzo—Cô9Ôéxïe’¸ €äŸÐî ¾–9¯¶¯•ûDsïw!PËG/˜o÷«CûäzK¯Ëø¼ P@!p?¹ÐW ƒ?ÒÅ<ïû»² €‡gâh2E´_ÏX ¶ ŠKúqõƒ ÅÞÎ}½\ƒÇÿxšŠ b€6ÞÆB1ðG&þÖøïO m«Iwä£6…õJäG"z“T D’‹èáÝG4}Ìßy*&I4Vo;kWOðæÄv¡H••ç7c˜‡PÜ7¿ÐÜöÆéw À_f®œ Eχcð£tã}Ϲã¸5ûЯKé'7Ÿ´¨- hŸ J(,:Ù€\Ñ8ŠÖ{B¯6Mú#ÛÌW⦅€®³Ôzôº%¿¨ÞmcõàÓù-&9J~Œ5„\­›ûtËÀ[r ‰„Àþ€¯¯Ô:ëƒ&õ)r~¨‹Æåh öMÎtÌV æ5éO‰×„_Ë´‘Ûýâ å>à=ÿ©wýïšý»×GP°–àz#znN¡þ„b %RíJ¨è‹öécÄM‰€þ‹~Ÿé´DÔgD__|–h5ðj—ÅQ!@1ôb¢W\ ‚’(¨¾©¶¥XQ›ô%G[òÁ¯~¿mš€¿Å–9'€¿ºóÈêC¢±ê¼Š€’xýA[-,ë•À¤ßA‹Â¶»?gæ8DZý–I·n—¾ðY³šÚ_o! x`=éøIÈÑúøxB¯6Mú#ÛÌ7অˆÖ—®ÇZRír1Ý^Ûwɯ«Ÿ'bcÁ˜câ}ôù‡æQS_N‰þpí/¤ÖWŽÒzÐÄÞ)ùÁ®Û1ch<ÎS€H(©„?*cª"à'Äëâ_ØjÁüÓ+õŸÿEÙ§©‡£ón´Ñ/2½*Ríj8ûu¾)ÀÛ'JDc ÄÏ%þ|b.)sn=msÃiæDã ¥zOþS~‘hÛ9!‰Ò¹#zn€D¿INä7$NõÜ&ùj#þÌp! ·èëOEù3Æýl‚œøÔEºi`ûŸ¼ðdFTï|ùRËë.;jÑß›1x´Åò}Ë÷1åÓMCc¤ XI8Qg :±”@;OèÕ¦IÄb›ù «^Ρ1€ ­³Z¢ö¥¸©ºÒXJ1»úq¸cõáB€Wøcõi»!ÿœRðöšÜ“ZŸh›¦HÅ¢¤D}Åë|PÌ^EˆŠ…Imî :?»õr;çÿ¬ì“":ïæ@|k‰® hýXø6u´ÿ±ñ>´ß½b E—ž=rt N®¾6©õئ Ôj…À¼~k ÷q1pàò$õ{Eþ8ñªFoWC‡¼ô€IKTçP½EçØsLZX§@µ×Ž‘uÚÐ+*D¡MEm_&(¿¢™õÉ €šåKá¿)Û¼²çó[¾í¼ j¾PŸ[^7¬\ÕyTJ 'ôjÓ¤?b±Í|¥mZø:ŠÆb?ZïäêW©ëêÓLíCÁ);c÷á<²Â‡ðŠ@) Ùá8ß^âðà_oM̹ÝæÀ'Ú®%R±9pæ7M€I¾&úJ$\”H]xˆÏùñuõÑ¿…}¸™ý€û9WËê)nð£nJ1ðd¹2àmjàÕ€³½½¾M íÝ ¿—7É ðq8ÑÛ‘À=O=iaù°&i˜Ç£|h4꟔êkáRv‡ÿ€G‚–‚ ô§A$X¾qâ;91ø{u_D¡ ðþ{—ƒm±D\ßtãè3gàk—ÛjQ¡H‰èŠ€ŽËñqCQàb€h⯠Ž" )rË»¯=ã¢eË-ï.QGA=X¸" }ˆ§êŸd"àç ½Ú4éXl3_I›)¢õ”Býsm5~É/²ƒ¨n1fú¤‘ž¬1N®¼*Ú?áT9ôðKÄ9¥Pú'Lrô‡×Ñ„\ôð¶m‰T ‰Ä€ûPÔ½"ð‹Ûå÷ÚËã}ø·_+öó®ÛÖ»PÜWíZ>û;–Ç ‡Û-ûàÖöýŸgš´`þyM‚ ´žàŠ$¡Bà®ÒæöÁÛc¢1€\]_¼/–Ôm0%n$o¢‰€ÄQ_pµót±®¼Mç"âuc\ˆÚ+š¬ë«XINÔÀ1¼5óþ¦H €Ï\t^®„íÈ›ånߣÝou_^Yh›ÚöЂ:OèÕ¦IÄb›ùÁ¶i!-?ð6¤äëeEýuêô±w¶nýqêQq †>¾5ø8.ÿ¹âû§#è{J…·O­r»qOÎsÀ?Ú¶5h¿¬Ï‰€‹îá³ú[ÿlq}¤ž 9¸®ß1ùõÝûü‹„Xày×m~^†  Úž´h­§Ýmg{{'u%€‚¼í›óëÄûwðÌAùé’RhwlD#À¼äêúÂ1š/Ôæns+½š¸ ¨SpÐÍâ8*T¸¸EBýý+}‹MÄ;·÷¤ ˜Tø&öÙë>w±ùúÂ[ÊüMe.Ž?dÒ‚y‚rN°ý¾È[DÜìº_DoBêËѧÉï·}á~–žp‡¬¶Ã8ÀODžÐ«M“þˆÅ6ó¸i!¢åN¡qRD픨 a}Ô&¶åw¾±Dèë_ÂÇ’Cïk|ƒˆNÉô¹… DzR¢¤<üsÛ6ªsR}2¸ä [-j9!páO¹à«·]ï‹u9^'‰ÉÓvø­TQH»Ö©øÛ_wv¬S4¯”„@_ûqÛ:@?¯‘W8þ×Ù——E…€Š qjоR} m¯}–8JmâçÔM‰‚z œ ðßÂô?îÜ“ÇÑ‘_—.Á÷êk2éý}ïÿ·UÞîÊçæo Ú ß„i$@$\ h;ò¦f½Úx õ!:­‡ú›Ài‰ü„]]$0å²ôOèñPóò‰Ü ȧ¦] ŽxB¯ö‹þó•µn!@À~xB–·Æê"èŸBý¼Î×@ÀƒË,µ×0¤M á¿VO˜NÞ»¹—ø×ñ¸éz”óµ·QEIy ø×lWà~ ê£ØÎA¯Ÿ,›‹„í•H cÉÇ{Ï“^žž6]WÃS2?¹DOë^üËù|ªM€ÍícŠÀ>””}LØ?AÙ_侮ÇJáí•È×mŽÇpr>Çœi2eýn‹‚>‚à~Í>ë¸þN=¸™Ö ½•óÏÎî§„·#¯o’?À²?Oü¡ßÚ7Mí4ù¯Š&þ}ƾÈt>Gª¶õ±{y ~uèV‹ÛWKB€;¶–ÕÕ¥üW1£¤^í9ýWR*‰W›ú”БàI5ZÎÚ¦¶=ür¨_z~y'Wô*Š1XG¼)üu¡{@$³N%4FJðÄ-k ÷/µ×zÌ+Q½O»ùü».@†ÆÚqœ)ôx¼*ðŠv{,Ã:£{ºý#WžŒç€í6U¿ôÕøýô|ÿ?ëÛºÄý"Ÿzx í*\Ð''r_ÝüÊ¥çãzkÐ}3ížø›­–¨ÎÏOjײBÀi­ˆì½!¶×¢ãOQë7Ä„’‚2¿-@Ü?Š­ÐÓ;Èm%·“ä‡àB@ ÷¸û¿Üë"ºP_„çWáS"ÀË*_þŽ„áï&‰|úP§$”H |²ç×Ê)(>;F"à{לÌ@ÙE€ú²Î…@$؆¯ÜÕçJðœ¡m'ˆ~S¾|©É ”SoñéË7¯ÇùÙoKàUÕ|]õ«ûøLР;¨î¨´;¹ºU@Ü(©W{ŽEÿÅ…O%ñjSŸ#'x–×IùåÚ×ĦN»ùÅDiò[GÌæý9=Æfh|_-Ñ{°÷È£oTJQ@aºÕJ“ýðOmgݼÞëõeŠ$÷LðU¶u¿c¼ªüæ‰q¬û&’þ~~R;¦ ’{½" ¸¸í/æå³¾uq\›¤¯tLïŸ>°šêO4ŽÇ'ZG_EÎÕDŠ·í¤þ±w!à÷¥+:®ˆ¨ƒÛ4y«ftuàÞS1ÀiÞ@D¼Î“~-«ÝYEœx™E›îxc]ê­u›Ø/|’§6§VPèU@!¡B€b@Ñä?%\ h{ b@×AI<3±.#¢ß%UÏßÖ«c‰¿¾g¹ŸÒÇÃgÝéRý´ï(©W{ŽEÿÅ•JâÕ¦>%4FIð$-»’òa?‘Ým)c+NŽ"ôXCúð1öb`O¬Nê=éQŸþ¹í«#ꣾ*JBDB€>ô;û±GΠóžs¯¶ßÖp—ÿÛjÁ¼‹}ï?Ñó“Ú´LTÜ^ž#ˆ®xŒ3¿q±õ[ÛÕÒ§Mßøð‡ c„mS£e%e'lËÄÉ(šˆ+z|ïCûжcÁß.ÿˉ‰B½:qIV} 'ßdÒÂ2„MêÖ'ßµh›œx÷9'-Qø» ­ßàB€WÆÀÛ¯Š ½ªÒw}×Àã„"À¯pú©‹,®Ë±q1}Ä2GöÖ N#ru}á`4&棤^í9ýWJ*‰W›ú”Ð5B´}4ÓQ=ûP´N}S,·ŸŸôwê*€2¤/g_öÀ0¢}Éá,“yÅ“ýðÏmó”]Qu}„H Ì—À:‰Î1ÎÝä6žoËùè{©«¼ "à ÿžnÏq8¥ú5mÙGm?ðˉ&þ ìe©eÚ"»ú¯´&“‘ ©ø©:B¾-Iy‘-¿×§à9GÏü<¤‚à†•WßT Œ –•Ë«¢ p;èÃÎ䨳OZÜ®¤îw!ð‘ƒóqúâà;×èæ¿sõI æK"€mÁg/Ö•ݬ uCQ1À}<Õ®.ùoÁ*”® Èr«¾"… çL_;šûË‚ Q0Î;¹ºØW‡ö(©W{ŽEÿÅJâÕ¦>%4F­l-¿Ûh`]?_['»@€UúÓ1k·ï1>}®€(áOÝÎ%¼¯È‡ > |&À…¦*.yÂ|þw>3Ÿÿß[u}~ì‚[-´¯Jt~QèG!pxpE ÛGb@¹O˜:6EÇ>6¥ø}Æ‚úÒ€ÄcG6/G¶H¨À4z\­}°Î}X· ÿPˆ£¿uú{çB€bà1Í2¥`[r«;§Î›Ä Du9t›D¨  àW…ßq¶I ëAN`šºêˆéGȾí­(몋íð Ÿcrà"@Å pü“¨¾ö÷äI™õáBDûü¨€ˆ„€âÓ÷å¹Ó}’•L]àoª²ðŒ@tp¹-g/ÁNsqY‡iœÔ/'ýsÿ­‘JâYÖú4†Š€¶Ü,K øùzв¸%rm}ǧ€ØIÖÕ§.Ó〬ý³ù ô 'ú%Ð&Ú¦cø)!€éyÞ»¸<ú€pD€ ë":¯¤€ (?>ñ/¨‰JBà ¯éê!TD±i_¹>|,)_­ÿÀùæe<Èˇyk}Àº»?öúÁ±TZöz-«½P1"ê#ªS»^ð«µWnsúÉ ¯KýÆED"°ÎýAJ D¼¼À<’ºTb‡ï¨ž@P(þžÿãÎ5iQˆ€HPä¾Fœ€ 'T Müõãþ >©¿óóñ¾EÖU þ¸M#¼Îm?¸îÜöÝk”ûÔ×îF|æwº'^f9êXO \ Dð7U o RàTcK¡EõÄëQö¤^m%æþ»_øFëAaL…v÷uæþó{·\PÖÕ·.Ûã¢ßÐW¦ðD¿ÚDÛtLЇ  B€o ʉŠ€«}ûít"øù$…žjÉÅý“Ÿö‹—»%ˆè²8‘¿µ‰ÈùzÌÈ6) ØîÔLúyD}Ôó^"!@1JüùÚAùí—ãI¥ÞûÞçvèwÎI]P›úßZÀÍå•¿×èùl~#à_$ñW! ÏÔ|¹=úà—B BàsÓ„ÛÀëÎ4™¡vð­«tí)\¤DÛƒo]µ+GÐ/ÿdJýáT"¯íñ¶è7¢ ï\½›žt…­õŠNU¨(}•¸·ðr„vÕ+)?Ø<©W[‰¹Z¨v­¯Ác¸]7Ñ|ŠyûùM01ÐÕ-›dýûrî±y¢D¿´¶éX >EŸ8DZG†WTœû¸Åó“^ X‡È%[µÉ˜Ÿî1½]èÞvuàå?_ŒÃ¸·«)1pÆÿèwÜê©i9š½"´;Œ“¢ä“ŠÛ‰—×ßsš`ãAL…õŠ !b ²¥P ¼ì€­´¥„@jŠÖ¿dšär xEàE Ðxu õì]šD†Dõ$úÝ.hgÙí*RWnoË¡B€h}ê¡bG¿U(Nºb“d6h]Mº£àŠ€^ ë%"!@¡àô:ïhШ>¢Ï“zµ•˜ûï¬Ðh ¶‰ÖGŠœ?ãu>óu "À…€'H›fcÐåÝcgˆ’ýhmË1Ññé•€Ó>2ƒõ‘à-A*Æ&:_Du^¯¶èü@(HJ (}¯hœë€ý9¹ºøCP@”Uܯ™ÌÞLæ»5I7P[Ô7Pç¾Óø÷n¦Àë/Ÿ&*8õþ¯oI))¯„Q{IýíSX¯» ¬*®| üPyàó§[¬ç­B%¢çE^ª¯õ+']¡kÏðõvžo±7.½ÙÊÀÅ@; €‹À…ùO'jÒ©¶ZÔ6”u‹€”Àôk—«ëûy²?¥ž+ˆ¾~}ÏÅuçß P! û{Q8êTíDí%jÚ Þ“zµ•˜ûï[B€Óh89¿®®[nOrZÛ.dScÑeßcóDÉ~´‰¶ã˜ø&ÿD€_PR1WÁÏ©ºðå9B¹gáBÚæî_ÂçÆ„¯Dw’ùˆ»&pöõ¡åð׫)("1 ‚€"€Bàï›:€ùTÿDDA™b@EÁý›)À¼ï)!àb€þ5è¸sÐ×Ûç¸kBð7P‰ür0IRB…p10&9¸ÛïéW¢+CÀ…@Tä„ñöÇL¯¢ôùp–¢ ôG+ÖÙºH Þ‚UÃÿÝyqýq] œ¯û³—BàU…ý¸Zg¹/µíàçI½ÚJÌýë…€ÖÕâíUøÉ.‡û£­%ò­Än`“ãÑu°Çf‰’ýhmññqÜ&XVpÚç9ƒõ51û¢çž#Ru9àŸ;Wä¶Ë‰_Ý-w_!pê§Ï××_þb>›Ÿoµ°<”h}€\?Š€‡OËk¦ lJ$0ÿóM‰ ýßmšÌ¥D@$0O B@”„À]ív&píàÁVÀv%Ô_§Jê Ú×8עݗËÇ)xhslF°ž¤nñÊáâ|µ Ÿ>í'•¬Gä®8D™æÐ«þ‚h;‘!"€ÿþø“Ú!Ê‘àW¼S»#|w¿ ÿ¶ýŒyŽü’~j}9)!Zç.¿*ª…@T¹Nü uàãI½ÚJÌý7'(†\ˆ|a‹Ö ñú®Ü-k´sïf@6=.]{¬‡(±ï âDÛoøø‰ L5ù}âõ%:?äêsx[ÀsámBGÞ´Iþð»‹c¹ñÉóòmì6&-DÉõ*"!€òã§S|£$õˆ‚ò=§É¶ „¶TäÄa»œ ôÍ¡ë1G©-ÊŠûƒh™€Öa¾Fô"€BWô Á1ÓoÅ!¬#©g:Æ‚Ïm¤Ö÷RBÀýxûPRÝ#b"€B¼-óö£uàûb‰¡ëXûaŒT,®sP+^4Ý'yÌ„€w¬h€¨¾vÌÎ mŠÖ+QÒ1÷ß9!ÀåˆÖ…’óaÇí]™wqy[Û> ÀNM×Íã I¼&õC@Œh»­]–Q{ù÷%:7€Z¿o x.qž)ÿþ§|úp¡OÌ×Ë/‹×ÑOÞš±hŸÌP;‰–µ–\{íƒB@ŦeŠ‘  ."¸-t<Šû׊Ø)\ 0¹Ç´îîÓ鵂“u¾DÉu.þ.©åò²‹ÚݮܶŸ>dÒ‚yW…€Ú!(ÖÁK§¯¤,½šrU¸Ž>[ø20Åë?xþI æ#!@!ðÅß[¬‡è#ðúQÕ×¢û¡Ú´¬öT] ¶eûÚX*>|ðÃê…) 8qÊï>}`¶M»X’þˆ¹`™u5hû5묦>Zgœvó‹Ë˜Ã•ÝÄNŒÏ×Ï«ãI¼–‡‚8ÑöÛ$Ñ2ÖŒKÛõ%:'(µ~Žö‘ãRï;W8©~}E˵*¹¸¨ûÊ¥ãõ%‹.üÖ¡H ¸ G6~eý-H‰õàt rb€>%!@P† p´Ë9r¾Z hÐåÒåórt%À·§£¾.”¿n’.àvþ³­W“À,¶£RâBißWV<ß#úÂuçxòOP÷.‰ä}ÁÇù"!ð¹‹ÍÇvÂ%çvõÁ­Nz»S$x‹Ò*ø>©ø>›ó‘?Ëœ×úßÜ¿›ÿîÆÛÊ…ÀëäU¸§·Ðï¾5h‡q!b`î»(R‰<ËZŸCÛ¶í&Ýþuw¢õru>ºžæÓúDC“ÝÊNŒÓ×ÓÃÐýSx&ËnëK×G¼ w]¦ÔØ`ïüºõÒ? % vÝn«rÀKçË NûŸ—îM‘ëu‘P8~Q’Y“|¦ˆ„@]J øûé]ðõ¢©uRBäÚ•l);Ê‘pr9†Š€”ð6 ú ð÷®5DQ¢·ªèë;ÿùÔ“–•o#©+«òïg˜Ç|Fáf|½˜_0&.(tžb@@NŒÍëŠûÒ[‡žUñ·î—¾Ÿz½â6ú¹ʾý¸å˜}XYèæþ)¢8ŒQÂÅ@k[³p¿Ö·‡ º¬\¾^"¢Dˆu‘ ôÝ×H}ˤëkáø±¬ ¼SªOÑõoÇÝ×…ÓC#c8¥zð¼Ä»÷Ç"%tü»…Ò¸tüÑ•€/HâCj…ÑM=wúç³›i„¶#%1€²Š~…µ ¨§p"à>9ÿ¨.çXï¸PÜI ÷­ÁEAÙE¾¤KP† êG>tþ­–k¿Ä[B€Dõ}€P!àõCxïyº8úJÕ7O¯<§96íëÀ÷9/«eÚ´¬¤üÚU œ|“ùö÷« Ÿý …*´¬ Nô•\;Çã \K˜ÛWîÓú 5DÉ`½'.t\š ìkDãçr­cÙ4öÃðc9ÚI©>G×W¼w®‡nÙâsÞ¦Ñ1ù¸P~äö|ÜO/¼"ôÕ?›×¿õGÝüG¿–oCÎû¾­–¨NÇ4ëˆ[ý"ñ÷äÿ1M½B»Š&ÿ.rBvükÉ.ÝĘ'.0O˜‡ È¡ëâoN³Õâõ)Ô¯Ö×çSÐg "!p³&©˜¿yâT^H]!ˆPàB€>_ýƒúx9ð /æÅ³Äýjøúå'-jó·þì>q¡ò>ÝÝߢý/UV[ ÚNÛB øÕH¼xz;RRÀ¨8¨×}§Ôžx”ûPsÛ0!àudàË%:μí<áØŸnŠH-ÇlYƒºU`Ü=†Ówß®ñ‰èúŠ·ãNÀå÷s›–wo‰£§Wþõ“¯ïƒŠ€+~c½ë‡ýŒÝGM<øPø}Ô*ÒLëE€þãš)1…€‹H¾B@“Þ]©ºµ¾ê×Çÿ§Ÿ„°·ƒð–^½Qèç¸PÜ—¼õ¬“"Ÿ_—ÛnN¼L7ÿÅßÛjÁü§.²O}>”û w*ÔN>yáEÿ¾{ÍI Ë5¢àÅÓïôácÓÛ£|}~é÷Ç͇!úˆß—rè¾§m8ïõ´+‘M‰ÚFWrW@o!à£?üƒGm‰Ç`›UC¸}UæIúâòF‰YhoåÖÆ˜ûÉUe“ËÂu·ÇjôÙ·I­ŸÒõoËMÓ?}~‹ì;Æ’âAÛ]}³å–ê"îßããbg~S||qÑxw+:^Ž¿°’B@Ýo½H‰€H `^E@JÔá+«üÒªŠ‚rꊀ ÿ7ðÇõ/µ©ñeÝû¦·Ž¤D@I(Œ]â¶M@m¼§?Ÿ¼pW~ç9& ¨ JtÛ mL¢¿|©nJ1P# (TŒA4^ˆ ãW! B€vp\s<µ­Šï‡nw"µõ¡ö¡!;Î?ýáOQЧq0ßdµí´/Þn!à¶Ö¾ÊU€¦­ ÌGIYh?-ïϤØä2ùºÜcÜ·köo¥/èúŠ·å¦à2Gç4¥ÆgÝ` ÷ùÍâ~Ž/ó«ÁëàÌo\í¸Š–c·ÀñaÊÛB|ߊ ЉBu‘5BP¸(­3µçð6¥v)Ø ØTu¹Äÿ‰§šÌ@ùvÁ󑈀 (§øî.Ö}áw·ZÔ¦WðÑ.¢>Š'Ù.…€ €|ãJé>>þÛ]?€¶)((@ß«úô8ŒÐ}1²G¸_ªú)©çÀG^^Öµ ‹©q0Ï„ÞûRmúe•äÌ’ÿžB`Ö¾™÷nV·s9QÙ×ÙärézÝc8Ü·KûwDÿ®¯x[n‚n¬ñùÌéã»п €{­Q¬J´\; Æå÷ˆë¾OüŸ~ÌëÇÅðá(~<Ê“ÿ¾D"€ Þ…EÀP! ë‚ü‘´‰ ?ÛæP?¡¨¿úiÙE…‰’E}&þð¹s“ÌßU’ÄH ܦ™,„W†úBðùß´`^EÀûÏ;ia™àËÄþub¥+$ª¯åÙÓçLüÍBc@ÐGôÅ÷OµåPÿT»È‡ø³?½EzgBï$üõÇ?;ËÅÀ|“ÝŽ.†&ÙC™%éÓ„}ž´wãK%8„ G„ŽÍ“”ý…M-×ã«Ãã8·§èãßõoÏuÂåôsX‰!mÆ€ã›ÿrœØGȃʵD˹i0.0ÕÛ}†ðàiÛ{5I<ðzpÛŠR#1À: ¾>tžÜ5ó:OmŸBý¼½ãíH*ù &þ^¦P1à‚€ó€bÀ3T ô%9žbë¸øöÕËŸ»xWŽW z[ðæ¿íþçàÏè-5<ÆûíŸºßæ(µÑzÇňnZzF 4ÖÿÐ&Ó&Ë] ôšda!éŸÎ/ئË%7šä`1'+û ›ZF]·{¬Æòq¾¸—èÓ¦ë/Þ¦ë Ûây««¶ï úËÑÇ—Ûs· cß ¢1å@’ÄDé>’0=¬‰:‘(¸{S˜?lš$Þþt“õsT¸pnt–I Ë\º>8ÏrލM„û°½&ÔŽû*ÿ}®I æ?tnªoÆáñ:ø!.>¯¡Ð'"."îf¯^Í}8Láþâð!ôãI·çk71å|$jk_«ò®é·Žk¶À¼~8ÆË1ãCjú1µ'5ó€e½RWâIÓ¯ñ‚÷_?N¡û&ç¹Ïæ`m[ò‰ð[„” ÀŽ=¦M¦»mlS‹¶©L²‡²ðOç•Ö>]NMhXæ¼Ã¶³ò49ÙŸÙÔrêzÝc5üç>Þ‡Úv]ñ6.›ž÷†2VœsÍØÝw,ZñoÿÓša€yþ{þøfJÔ7zz´<ëýò>q&þ¥V&þê ýsB l("1€éßHÒySù`R”øß¥ &¯«äºÐ©Û_ÛÃÃ$ÕÆqÿ¾0ñW`‡ (3qõä@-)Qº* $ÿ l÷“}„<½±·Úžß·Ðï\hÒ¯eµ|ãx–H­Sð½éCßýnú•KwÓÜU~¬/Ç+œ´`þÐ龪…ÇéS§S¼’“ϦB”ÞÈáûxmù{} Þ"ôYyNb°  @ÐVã€&ë]@mô©eÖ¾Bx²Ý‡¥d_Ê ý5™ÑùQ¢²¿²©åõu¼Çp–íÅä=‡ú×´íú‹·éXtãX>ç­Â:bcQJõÎC· í)þešœþS“´­ó[i(üýéŽy ¿ÜC£$u*\ ÅÅ€×+B€¨_‰{4ýµQPtppÞñ:-§Ú8Þþðf}ÆKQ)! ‰?q!€ùlÆDè‡ß m‘`ÝßËrÔŠþ¡»èÕ*rÿ¶¿æ “–¨n¼çÜ“–ù 2E€ãW1 (€>ÛÕœûËOŸn 9x#‡î×ZŽÐvî«6Î?ZƯl?f9Ù1!Оq@“1/¡vúõ!%ÚyKÒû≾–¶a"£ICÿÙ´ñ;%±©ef?˜î1œø¸^Nà#4ŽÚÔÇA½o˱˜%>ç­Ê:c×ÂeÌ-«û å…M⢺*T ÜÙ¾|lЋ¾u†W7x…#E$õÕg½RàPP ¸ˆ–ɹ¯ƒDB€14f ÆñùîÃvàͱ Ô¦¨.ˆ¶¡pÔhò¯b@…€ € |Ïi‚ Šç7Û” ñ(éçIò¥&ù˜ç{ü]è-7¥«o8hÒ²_¥ñžxÙIKTGN¸ä¤ó5W"øg0T€H ¹ DûyDªçY~Ðtì}ÄÞ"´£B耚Ì7DëÔ¿–”Š&øš´çÐöšÐ´måÕ î%+û;›XníC×÷NàÇÁ¾FtLs¯ÁýKí»>—·éªtýÆçº1ÙT?è[‰|øôÙ?·W•*/9ݤóOá#š~Ë}ˆÆ>Þ_= ÅÛõEFVQ@!poëï€N÷kP³l%ôV$%Š­¸_m›È¦äÄH%ý«B À‰€: ê\ `žB ue BÅ p >$º÷~è›zx¬ç„ÑÚÉ3ƒ}ŒPøvM½ÚV…ÀPž#¿e· AsˆïëŠû¥Ú¨_²B j°Nš,8Äë¼]-;-4‘qÜW”S›X~öÁõ½ÇpV¹]Ÿñv—#:®‹M÷¸œ}ûÖvCàmÑÕ‚2…À1gšÌ oîí"Ѹǂ}0ñÏ úÞJÂÛIô9 ‰ž‚:ÞN !àb@ ˆ– xrý³MZ¢:lÛ$êx}ΗD1»òâ¹ –è>øO\¨›÷«OðÓq’ ß#§ó9!ÐG DÇR ò…é«D _-š»-H¿?ÐçM?Ïm’hÀò3§ËüÍVŠ&ßøb7¿Ú !»:𑃻º7žyÒ¢uo<óV Ëÿ~†­–_|º­´”øÂ%ý>}ÑŲóoS±’ú "ºÏû>§¸ŸµÑ«|^`&X¡Døy"P‹öÅr“ ‡x¶­e§¯(~@}}'9¥±‰uÀ>¸Î÷†Ó<ŽõÇz(¹8]ßñ¶íC×G|n[7›îý é“íú¢Ér_TðîL>–÷µxÜN_ÿ©eÓä_A…@IÀ¦Ï¤„@Ž¿$|nh_·íß˺ˆb{]ÊWIùt¶ù¹[ep‹3Îç5ùW@PŽÂXËc˜×Ebó„¾ %T `í¯ Âúõá£O3iqBE@_Þ‘Š*ôaH¼5ù®€ ¼Š`™äÆâbDíJ¡û¯ï˾ÏE¨ODÔ†b`IDJ €ž”ûÀ¶å&+ñ:”7&öš´Gv…í“—´èêçIÊ)•u¯¯ë~þ豫Ç0÷ùUIÅêú^Þ¶µpüÑymSl²ÿU——íW%ú§0ñeòKT¨ˆˆÆ XŸûª«û¾SÝq?‰€:„m5Ù#º>ôêû7vÀr„.—/BÛ¤.¾n“·;¹Ø9r¾Ó}ý˜VJ" $`ú¬Ã4BE…Àƒš)À|I ÑþQ‹¾cŸ"@Àg.ÚÍ?¯ñ´G|lúUàïhÖˆêÿÎnM¼ùA1ðù‹OZ0ÿþ÷çs[RpJ ‚€BÀÁ›D@”è#÷_î˹}ø>XÂÛ+¿øËzF@ÛE1`k2ä%";lëD{MÜ#;Ñöž¸Ðî¾¾œ’Y÷úðøÜ{ôÇ]‚:MÜW!ŠÕõ½¸]kéâÅç´M³‰± UûaŒ>ðJþKùŸÓ{uU¼èt“Ì»(áï¸'>Þ??pÒ¢¶;M“óC›)Ð:%'^7]$Y„u¤V oëP€Ðö‰ Íçß¾­–Á'/<™r$TP¨HÝ"¤¼eú'§¯:p«E}†’ûýRtÿóý2ÂÛ™˜ÿxÇ"àï @ŠÈ·ÔõMÆ&þ‘m,4±Wru€í5YQè3›ÊFÞc‘u­Ÿ\\ÔíÑ踨ÓÄ}U<^×w¼#ºöñyl7°Žñ±ú!@1З¯þA×Îq!àðÝíúP+ÿ!ÏÝRƒdÚꔨl^e‰í‘Í:Í¡¾·kÆ0ÿWÍh=È &œ@nUP÷€é”‰i&ÿNäëWc“y.ú½r‘Ú_‡ì»ŽÇv¢6JNäÄÛžWs”„€‹€¾ðaáˆo^¹>vJ¨~ø.%úÀ«BcA@Tà FD}Þœùa³hûêï§n'ѾéÐOÛ!0ÿƒ(ðc›ì(²»-~Mæ¼”ô»öUФÞÉÕk &)­¿Î›/7ä1ëZG¹¸Ü6{Ô³uš¸ÆìúŽ·£ÂqFç°ÝÆn'×ãüø&-˜ÇÇŽøÁ#‚²_( €åH P0¡Ö™DB .•ü+°ùÕ"P½¦“Üá´“–¨N·Y”tªà2BƼu¥FDð¶,½=ëfMZÜWAI¤Hí³¼m$Bý"4¦ƒú?9ã¤ÅÛúäÄ€ú§®ðœ ðU^~™÷ËÓ/óê}œÔǶÀ‡Ñ@Pæ¿è¯?h«E}ÿ:û¼^EÀIWH÷ \÷œ{«Em?¸®ö=Ÿ÷†#>xþ­–ß}έ´éòëx¾v¹..§àXY|+‹€H8ºÿ=óß8­ó}4ýÁ’˜ÿˆÇ |´MDΧ¦=o“E/%ýn£}šØ;¹ú¶nº˜ ¨­_­ß#Í:ÖQ.¦n›=ꉎW€:&íc¢q»þãí :ßøüµ[ÙcƘƂ"@ÅÀXx²¥¸ÀÔ߯ &ʵxò¯ žBÀp!(îÙLí@Å@T¯É¦Âú”P1àBàÖÓåà¼Ã:%@Å@$ €Š€Û0™¡>þí„Ô¾;D§D¾9RB@· `’_" %Ž?¤››½ Ê¿2 T¨PŸà[WéÚ–„@o?ÛV‹ú” øÜÅ&3P~ÿTt¤„Ë*jÖP!€é+¤ ¾ZyUô7O‰ö[…~¡˜ÿÇê½ að¨äêR M“M/%ýn£½šØ;©úYÛY±¼R¾ 7à‹¬cÝ”bêvÙ£LtœÔ3aÛ!½£óÖ¾Àn;×éP¸ODàv‡uú¥¢íù ­&ZŸNÛL} E…€þãº*ðê&!%´ED" Î…€Âö*ú‰\ÖûÕMøûŠõ¼J h "àN§™Ì@™S‹Dç#€ûÖõÞõ?óðf½õ¿åË×”$“¬*R@µ» ¨·æèí9…À›Ï²ìC1pâeºº/;÷9®‰ X©ï"¸àkHõÛúJR'%têBä„À×/ßÅùúå·Z0ü!Ë~*0}eâ%¬þަH=ÃÐç·õI!ÀADêRm"»RãvMf½”ô»öšØG¤|Z»­hG}ÛòÒ†É'3§tÆ^/µñ¸}vîã»?.#àÇ}|l»Ëòö‹ÎWû»m90žZ¸ý#Û¯?™òoÔM]|㊓Ì—D€ L!\¸ˆ„€þó üj€ ¾!…oIyM“üú€>B€h{_—÷jÆGÔî9оɰ~-+S„&ö)ŸÖn+—I ¡_;nˆ®¬‰  ïÝ:‰ìC©‰§Ûó{,—ü¸¯ƒùX·Ÿ§öevÛòp—Ð}ÀË.\`ž" (“£-i.0¾SP %RB@a;’Jø•‡OǸÞt} O†yÛ„@I  NoEÒ+*%R"€B€bðçÔƒÎDÀßJ{Χޡ ”õV¯¾èÃË t ô9>"ô©"@¾´Ïë@K0YŸ¼ªÓ…€ƒ¤9—8GB€è‡Åü#co™ ŽL“]Ào <Í^#K!Dí}„À×.·Õ²þ}âÂ[3h.ô{*ÿqÆ­–uŸ(]µJ½:–¿ŠÖs¿- ÂFlèuZŽ€Ï˜4ÙöB¯eÅÛybùÍÚ+3E¯'7lsJgìuQÛ„¾ZÞcNt|;ðÓ}{tcé¦<7íOìÆå˜rDû‚B?Š@E€&9.j š»`'u‘PÀL®w¶É µ=Nny†­­WrÇ•3<>8í+nwÀVKTRB€óà£L·ÿáõæu—·ý .c#áWèãB`üþüH8*jМÁÀ‡/°Õ¢¶|I‚oÿTÂ_‚9ŽÃúj!Ѐ;-ËœWŸ÷Ñr_³ÉÐ~-+ô÷ä>"ò›µ—•ÇDdV'~myê«+;"Jn€¶?%2æ:苾Ü{ÄDÇ¥߷džcáéþÈn]>®{%Úœ¨]_ž! ߈ò´&á´;)!ÀØù·ÌWˆûo«øúL­ÛÔº»ÜöqÇÓNf ¬I´“ Ÿ9òÜ 1€úë7É` …B %T¨¨$Z÷ä.§™´¸=ÜŽ/ºU(òSJÇLôào}—>Ð7•sÂ%ç¾.N¾ñ¤ó*"ôç(ñþtæÔyÇôý'½iÖ/ˆêjy’\Ðܯ9å«Nû ç£Ü9 äÞ¶¤9ND/!¢N”¨MD_‡m1m2ðY²Ïy§õ·ä>ÂýPnmӕŲ&!Ž®\%òžÜÔEqN)Œ¹üCbqûì‘ÆKõÑ~=&:ýQÝߨ͡±EÛ?·—?+ÀKïx ¡Ã6z€ œÚ'è#J¤„€ûåðu©ó5¨p! x;-;“~}sɸC1\ v&ÿ)!Àö¼²CrB $ €Â:bµDb š¾ïFèëwsð£Z*¢oÔˆˆ€Hä® ¤àÛŽT$þÄmêWÃë§·œõý2°£ ?xŒüyÝý§åÒ7xN¯Ü•x±}|‘Œ"¢Æ%ô?„!1¼ ÊMÖ>Kø9¯´m$Áp”[ÛtE±œCWlú3™ñ‡ô»?1ærׯâúÞ£z<êqíÓcÁø:&Qû#»yù0¶hˆà¶rôWrɶöá}2!P!À:ÀËñü~Ëàgž´ø|ÄÕ ÷óúì¾.u^¹MæÁ’H‰¢I¾&ýŠ·Ñd\òzuÓ›ÚƒÁ*€'Û.0åsDëRbÓZ1ãË ‚Ç6ç(€ù[›¸º|@Ë·?ícáWx,¸p¸ž¢uåb %¾íØ …I”ü3éåàW¢çŠÞÚl+‚²ÿy Ï8)!p”Øe¿IäÃoµ°C×´,s¿!/ ¿‚·6EùŽÒûÖ .èrçî[Kß¶‘?lMö>Kú9¯6Mò¯G¹µ5+ˆóŠú´e[©%ÐÆšCûÙ—kykâpýî±~LFûòX0~7íú#üQÝߨ͈±éöO¡Û PDb€>¼$þîsuÓèŸ÷T|µ!ùa¤ðCe.ÔG¸£ñ§ZB¡_V®IÄ}]¾UG€¿5_Qæ—”A$Xý£ê‰¾—•hŽ7‚²Š§«ŸŸ[ÿ®™,+.ì\’ \¨à8@NðmH9(@(Bj¡P1 ‚ Úî:?&Ü÷£cp¤€Ï×åáØÜíA}øÐôMN|£Sôv'ÞSº=f(ÑüŸ´ûü!jÄ@„ år¥B…@-¯žîO_™¾ª5G”ÿ€™Øc^ø¼£xÁsŸºýüçøö‹u¸Çö­ÚÍû YòOqûíGíRËCfËUÝ—õ›[Ïs}°·ë(W×sÑ· ÙÜ^U”÷™Õáú]Üç¸îÖ×ï”ðXJìÿ³m;_ÍëÊxü•—·eàù*ÜAÝ9gß¡ð»`„ëLÖUýyb„~÷Øc‰koÿ(#Šªß]®IEND®B`‚tinyobjloader-2.0.0~rc5+dfsg1/loader_example.cc000066400000000000000000000352771364105447200215020ustar00rootroot00000000000000// // g++ loader_example.cc // #define TINYOBJLOADER_IMPLEMENTATION #include "tiny_obj_loader.h" #include #include #include #include #include #include #ifdef _WIN32 #ifdef __cplusplus extern "C" { #endif #include #include #ifdef __cplusplus } #endif #pragma comment(lib, "winmm.lib") #else #if defined(__unix__) || defined(__APPLE__) #include #else #include #endif #endif #ifdef __clang__ #pragma clang diagnostic push #if __has_warning("-Wzero-as-null-pointer-constant") #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" #endif #endif class timerutil { public: #ifdef _WIN32 typedef DWORD time_t; timerutil() { ::timeBeginPeriod(1); } ~timerutil() { ::timeEndPeriod(1); } void start() { t_[0] = ::timeGetTime(); } void end() { t_[1] = ::timeGetTime(); } time_t sec() { return (time_t)((t_[1] - t_[0]) / 1000); } time_t msec() { return (time_t)((t_[1] - t_[0])); } time_t usec() { return (time_t)((t_[1] - t_[0]) * 1000); } time_t current() { return ::timeGetTime(); } #else #if defined(__unix__) || defined(__APPLE__) typedef unsigned long int time_t; void start() { gettimeofday(tv + 0, &tz); } void end() { gettimeofday(tv + 1, &tz); } time_t sec() { return static_cast(tv[1].tv_sec - tv[0].tv_sec); } time_t msec() { return this->sec() * 1000 + static_cast((tv[1].tv_usec - tv[0].tv_usec) / 1000); } time_t usec() { return this->sec() * 1000000 + static_cast(tv[1].tv_usec - tv[0].tv_usec); } time_t current() { struct timeval t; gettimeofday(&t, NULL); return static_cast(t.tv_sec * 1000 + t.tv_usec); } #else // C timer // using namespace std; typedef clock_t time_t; void start() { t_[0] = clock(); } void end() { t_[1] = clock(); } time_t sec() { return (time_t)((t_[1] - t_[0]) / CLOCKS_PER_SEC); } time_t msec() { return (time_t)((t_[1] - t_[0]) * 1000 / CLOCKS_PER_SEC); } time_t usec() { return (time_t)((t_[1] - t_[0]) * 1000000 / CLOCKS_PER_SEC); } time_t current() { return (time_t)clock(); } #endif #endif private: #ifdef _WIN32 DWORD t_[2]; #else #if defined(__unix__) || defined(__APPLE__) struct timeval tv[2]; struct timezone tz; #else time_t t_[2]; #endif #endif }; static void PrintInfo(const tinyobj::attrib_t& attrib, const std::vector& shapes, const std::vector& materials) { std::cout << "# of vertices : " << (attrib.vertices.size() / 3) << std::endl; std::cout << "# of normals : " << (attrib.normals.size() / 3) << std::endl; std::cout << "# of texcoords : " << (attrib.texcoords.size() / 2) << std::endl; std::cout << "# of shapes : " << shapes.size() << std::endl; std::cout << "# of materials : " << materials.size() << std::endl; for (size_t v = 0; v < attrib.vertices.size() / 3; v++) { printf(" v[%ld] = (%f, %f, %f)\n", static_cast(v), static_cast(attrib.vertices[3 * v + 0]), static_cast(attrib.vertices[3 * v + 1]), static_cast(attrib.vertices[3 * v + 2])); } for (size_t v = 0; v < attrib.normals.size() / 3; v++) { printf(" n[%ld] = (%f, %f, %f)\n", static_cast(v), static_cast(attrib.normals[3 * v + 0]), static_cast(attrib.normals[3 * v + 1]), static_cast(attrib.normals[3 * v + 2])); } for (size_t v = 0; v < attrib.texcoords.size() / 2; v++) { printf(" uv[%ld] = (%f, %f)\n", static_cast(v), static_cast(attrib.texcoords[2 * v + 0]), static_cast(attrib.texcoords[2 * v + 1])); } // For each shape for (size_t i = 0; i < shapes.size(); i++) { printf("shape[%ld].name = %s\n", static_cast(i), shapes[i].name.c_str()); printf("Size of shape[%ld].mesh.indices: %lu\n", static_cast(i), static_cast(shapes[i].mesh.indices.size())); printf("Size of shape[%ld].lines.indices: %lu\n", static_cast(i), static_cast(shapes[i].lines.indices.size())); printf("Size of shape[%ld].points.indices: %lu\n", static_cast(i), static_cast(shapes[i].points.indices.size())); size_t index_offset = 0; assert(shapes[i].mesh.num_face_vertices.size() == shapes[i].mesh.material_ids.size()); assert(shapes[i].mesh.num_face_vertices.size() == shapes[i].mesh.smoothing_group_ids.size()); printf("shape[%ld].num_faces: %lu\n", static_cast(i), static_cast(shapes[i].mesh.num_face_vertices.size())); // For each face for (size_t f = 0; f < shapes[i].mesh.num_face_vertices.size(); f++) { size_t fnum = shapes[i].mesh.num_face_vertices[f]; printf(" face[%ld].fnum = %ld\n", static_cast(f), static_cast(fnum)); // For each vertex in the face for (size_t v = 0; v < fnum; v++) { tinyobj::index_t idx = shapes[i].mesh.indices[index_offset + v]; printf(" face[%ld].v[%ld].idx = %d/%d/%d\n", static_cast(f), static_cast(v), idx.vertex_index, idx.normal_index, idx.texcoord_index); } printf(" face[%ld].material_id = %d\n", static_cast(f), shapes[i].mesh.material_ids[f]); printf(" face[%ld].smoothing_group_id = %d\n", static_cast(f), shapes[i].mesh.smoothing_group_ids[f]); index_offset += fnum; } printf("shape[%ld].num_tags: %lu\n", static_cast(i), static_cast(shapes[i].mesh.tags.size())); for (size_t t = 0; t < shapes[i].mesh.tags.size(); t++) { printf(" tag[%ld] = %s ", static_cast(t), shapes[i].mesh.tags[t].name.c_str()); printf(" ints: ["); for (size_t j = 0; j < shapes[i].mesh.tags[t].intValues.size(); ++j) { printf("%ld", static_cast(shapes[i].mesh.tags[t].intValues[j])); if (j < (shapes[i].mesh.tags[t].intValues.size() - 1)) { printf(", "); } } printf("]"); printf(" floats: ["); for (size_t j = 0; j < shapes[i].mesh.tags[t].floatValues.size(); ++j) { printf("%f", static_cast( shapes[i].mesh.tags[t].floatValues[j])); if (j < (shapes[i].mesh.tags[t].floatValues.size() - 1)) { printf(", "); } } printf("]"); printf(" strings: ["); for (size_t j = 0; j < shapes[i].mesh.tags[t].stringValues.size(); ++j) { printf("%s", shapes[i].mesh.tags[t].stringValues[j].c_str()); if (j < (shapes[i].mesh.tags[t].stringValues.size() - 1)) { printf(", "); } } printf("]"); printf("\n"); } } for (size_t i = 0; i < materials.size(); i++) { printf("material[%ld].name = %s\n", static_cast(i), materials[i].name.c_str()); printf(" material.Ka = (%f, %f ,%f)\n", static_cast(materials[i].ambient[0]), static_cast(materials[i].ambient[1]), static_cast(materials[i].ambient[2])); printf(" material.Kd = (%f, %f ,%f)\n", static_cast(materials[i].diffuse[0]), static_cast(materials[i].diffuse[1]), static_cast(materials[i].diffuse[2])); printf(" material.Ks = (%f, %f ,%f)\n", static_cast(materials[i].specular[0]), static_cast(materials[i].specular[1]), static_cast(materials[i].specular[2])); printf(" material.Tr = (%f, %f ,%f)\n", static_cast(materials[i].transmittance[0]), static_cast(materials[i].transmittance[1]), static_cast(materials[i].transmittance[2])); printf(" material.Ke = (%f, %f ,%f)\n", static_cast(materials[i].emission[0]), static_cast(materials[i].emission[1]), static_cast(materials[i].emission[2])); printf(" material.Ns = %f\n", static_cast(materials[i].shininess)); printf(" material.Ni = %f\n", static_cast(materials[i].ior)); printf(" material.dissolve = %f\n", static_cast(materials[i].dissolve)); printf(" material.illum = %d\n", materials[i].illum); printf(" material.map_Ka = %s\n", materials[i].ambient_texname.c_str()); printf(" material.map_Kd = %s\n", materials[i].diffuse_texname.c_str()); printf(" material.map_Ks = %s\n", materials[i].specular_texname.c_str()); printf(" material.map_Ns = %s\n", materials[i].specular_highlight_texname.c_str()); printf(" material.map_bump = %s\n", materials[i].bump_texname.c_str()); printf(" bump_multiplier = %f\n", static_cast(materials[i].bump_texopt.bump_multiplier)); printf(" material.map_d = %s\n", materials[i].alpha_texname.c_str()); printf(" material.disp = %s\n", materials[i].displacement_texname.c_str()); printf(" <>\n"); printf(" material.Pr = %f\n", static_cast(materials[i].roughness)); printf(" material.Pm = %f\n", static_cast(materials[i].metallic)); printf(" material.Ps = %f\n", static_cast(materials[i].sheen)); printf(" material.Pc = %f\n", static_cast(materials[i].clearcoat_thickness)); printf(" material.Pcr = %f\n", static_cast(materials[i].clearcoat_thickness)); printf(" material.aniso = %f\n", static_cast(materials[i].anisotropy)); printf(" material.anisor = %f\n", static_cast(materials[i].anisotropy_rotation)); printf(" material.map_Ke = %s\n", materials[i].emissive_texname.c_str()); printf(" material.map_Pr = %s\n", materials[i].roughness_texname.c_str()); printf(" material.map_Pm = %s\n", materials[i].metallic_texname.c_str()); printf(" material.map_Ps = %s\n", materials[i].sheen_texname.c_str()); printf(" material.norm = %s\n", materials[i].normal_texname.c_str()); std::map::const_iterator it( materials[i].unknown_parameter.begin()); std::map::const_iterator itEnd( materials[i].unknown_parameter.end()); for (; it != itEnd; it++) { printf(" material.%s = %s\n", it->first.c_str(), it->second.c_str()); } printf("\n"); } } static bool TestLoadObj(const char* filename, const char* basepath = NULL, bool triangulate = true) { std::cout << "Loading " << filename << std::endl; tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; timerutil t; t.start(); std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, filename, basepath, triangulate); t.end(); printf("Parsing time: %lu [msecs]\n", t.msec()); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } if (!ret) { printf("Failed to load/parse .obj.\n"); return false; } PrintInfo(attrib, shapes, materials); return true; } static bool TestStreamLoadObj() { std::cout << "Stream Loading " << std::endl; std::stringstream objStream; objStream << "mtllib cube.mtl\n" "\n" "v 0.000000 2.000000 2.000000\n" "v 0.000000 0.000000 2.000000\n" "v 2.000000 0.000000 2.000000\n" "v 2.000000 2.000000 2.000000\n" "v 0.000000 2.000000 0.000000\n" "v 0.000000 0.000000 0.000000\n" "v 2.000000 0.000000 0.000000\n" "v 2.000000 2.000000 0.000000\n" "# 8 vertices\n" "\n" "g front cube\n" "usemtl white\n" "f 1 2 3 4\n" "g back cube\n" "# expects white material\n" "f 8 7 6 5\n" "g right cube\n" "usemtl red\n" "f 4 3 7 8\n" "g top cube\n" "usemtl white\n" "f 5 1 4 8\n" "g left cube\n" "usemtl green\n" "f 5 6 2 1\n" "g bottom cube\n" "usemtl white\n" "f 2 6 7 3\n" "# 6 elements"; std::string matStream( "newmtl white\n" "Ka 0 0 0\n" "Kd 1 1 1\n" "Ks 0 0 0\n" "\n" "newmtl red\n" "Ka 0 0 0\n" "Kd 1 0 0\n" "Ks 0 0 0\n" "\n" "newmtl green\n" "Ka 0 0 0\n" "Kd 0 1 0\n" "Ks 0 0 0\n" "\n" "newmtl blue\n" "Ka 0 0 0\n" "Kd 0 0 1\n" "Ks 0 0 0\n" "\n" "newmtl light\n" "Ka 20 20 20\n" "Kd 1 1 1\n" "Ks 0 0 0"); using namespace tinyobj; class MaterialStringStreamReader : public MaterialReader { public: MaterialStringStreamReader(const std::string& matSStream) : m_matSStream(matSStream) {} virtual ~MaterialStringStreamReader() {} virtual bool operator()(const std::string& matId, std::vector* materials, std::map* matMap, std::string* warn, std::string* err) { (void)err; (void)matId; LoadMtl(matMap, materials, &m_matSStream, warn, err); return true; } private: std::stringstream m_matSStream; }; MaterialStringStreamReader matSSReader(matStream); tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, &objStream, &matSSReader); if (!err.empty()) { std::cerr << err << std::endl; } if (!ret) { return false; } PrintInfo(attrib, shapes, materials); return true; } int main(int argc, char** argv) { if (argc > 1) { const char* basepath = "models/"; if (argc > 2) { basepath = argv[2]; } assert(true == TestLoadObj(argv[1], basepath)); } else { // assert(true == TestLoadObj("cornell_box.obj")); // assert(true == TestLoadObj("cube.obj")); assert(true == TestStreamLoadObj()); assert(true == TestLoadObj("models/catmark_torus_creases0.obj", "models/", false)); } return 0; } tinyobjloader-2.0.0~rc5+dfsg1/models/000077500000000000000000000000001364105447200174575ustar00rootroot00000000000000tinyobjloader-2.0.0~rc5+dfsg1/models/catmark_torus_creases0.obj000066400000000000000000000065271364105447200246300ustar00rootroot00000000000000# # Copyright 2013 Pixar # # Licensed under the Apache License, Version 2.0 (the "Apache License") # with the following modification; you may not use this file except in # compliance with the Apache License and the following modification to it: # Section 6. Trademarks. is deleted and replaced with: # # 6. Trademarks. This License does not grant permission to use the trade # names, trademarks, service marks, or product names of the Licensor # and its affiliates, except as required to comply with Section 4(c) of # the License and to reproduce the content of the NOTICE file. # # You may obtain a copy of the Apache License at # # http:#www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the Apache License with the above modification is # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the Apache License for the specific # language governing permissions and limitations under the Apache License. # # This file uses centimeters as units for non-parametric coordinates. v 1.25052 0.517982 0.353553 v 0.597239 0.247384 0.353553 v 0.597239 0.247384 -0.353553 v 1.25052 0.517982 -0.353553 v 0.517982 1.25052 0.353553 v 0.247384 0.597239 0.353553 v 0.247384 0.597239 -0.353553 v 0.517982 1.25052 -0.353553 v -0.517982 1.25052 0.353553 v -0.247384 0.597239 0.353553 v -0.247384 0.597239 -0.353553 v -0.517982 1.25052 -0.353553 v -1.25052 0.517982 0.353553 v -0.597239 0.247384 0.353553 v -0.597239 0.247384 -0.353553 v -1.25052 0.517982 -0.353553 v -1.25052 -0.517982 0.353553 v -0.597239 -0.247384 0.353553 v -0.597239 -0.247384 -0.353553 v -1.25052 -0.517982 -0.353553 v -0.517982 -1.25052 0.353553 v -0.247384 -0.597239 0.353553 v -0.247384 -0.597239 -0.353553 v -0.517982 -1.25052 -0.353553 v 0.517982 -1.25052 0.353553 v 0.247384 -0.597239 0.353553 v 0.247384 -0.597239 -0.353553 v 0.517982 -1.25052 -0.353553 v 1.25052 -0.517982 0.353553 v 0.597239 -0.247384 0.353553 v 0.597239 -0.247384 -0.353553 v 1.25052 -0.517982 -0.353553 vt 0 0 vt 1 0 vt 1 1 vt 0 1 f 5/1/1 6/2/2 2/3/3 1/4/4 f 6/1/5 7/2/6 3/3/7 2/4/8 f 7/1/9 8/2/10 4/3/11 3/4/12 f 8/1/13 5/2/14 1/3/15 4/4/16 f 9/1/17 10/2/18 6/3/19 5/4/20 f 10/1/21 11/2/22 7/3/23 6/4/24 f 11/1/25 12/2/26 8/3/27 7/4/28 f 12/1/29 9/2/30 5/3/31 8/4/32 f 13/1/33 14/2/34 10/3/35 9/4/36 f 14/1/37 15/2/38 11/3/39 10/4/40 f 15/1/41 16/2/42 12/3/43 11/4/44 f 16/1/45 13/2/46 9/3/47 12/4/48 f 17/1/49 18/2/50 14/3/51 13/4/52 f 18/1/53 19/2/54 15/3/55 14/4/56 f 19/1/57 20/2/58 16/3/59 15/4/60 f 20/1/61 17/2/62 13/3/63 16/4/64 f 21/1/65 22/2/66 18/3/67 17/4/68 f 22/1/69 23/2/70 19/3/71 18/4/72 f 23/1/73 24/2/74 20/3/75 19/4/76 f 24/1/77 21/2/78 17/3/79 20/4/80 f 25/1/81 26/2/82 22/3/83 21/4/84 f 26/1/85 27/2/86 23/3/87 22/4/88 f 27/1/89 28/2/90 24/3/91 23/4/92 f 28/1/93 25/2/94 21/3/95 24/4/96 f 29/1/97 30/2/98 26/3/99 25/4/100 f 30/1/101 31/2/102 27/3/103 26/4/104 f 31/1/105 32/2/106 28/3/107 27/4/108 f 32/1/109 29/2/110 25/3/111 28/4/112 f 1/1/113 2/2/114 30/3/115 29/4/116 f 2/1/117 3/2/118 31/3/119 30/4/120 f 3/1/121 4/2/122 32/3/123 31/4/124 f 4/1/125 1/2/126 29/3/127 32/4/128 t crease 2/1/0 1 5 4.7 t crease 2/1/0 5 9 4.7 t crease 2/1/0 9 13 4.7 t crease 2/1/0 13 17 4.7 t crease 2/1/0 17 21 4.7 t crease 2/1/0 21 25 4.7 t crease 2/1/0 25 29 4.7 t crease 2/1/0 29 1 4.7 tinyobjloader-2.0.0~rc5+dfsg1/models/colorspace-issue-184.mtl000066400000000000000000000002621364105447200237670ustar00rootroot00000000000000newmtl default Ka 0 0 0 Kd 0 0 0 Ks 0 0 0 Kt 0.1 0.2 0.3 map_Kd -colorspace sRGB -o 0.1 diffuse.jpg map_Ks -s 0.1 0.2 specular.jpg map_bump -colorspace linear -bm 3 bumpmap.jpg tinyobjloader-2.0.0~rc5+dfsg1/models/colorspace-issue-184.obj000066400000000000000000000002311364105447200237410ustar00rootroot00000000000000mtllib colorspace-issue-184.mtl o Test v 1.864151 -1.219172 -5.532511 v 0.575869 -0.666304 5.896140 v 0.940448 1.000000 -1.971128 usemtl default f 1 2 3 tinyobjloader-2.0.0~rc5+dfsg1/models/cornell_box.mtl000066400000000000000000000003141364105447200225010ustar00rootroot00000000000000newmtl white Ka 0 0 0 Kd 1 1 1 Ks 0 0 0 newmtl red Ka 0 0 0 Kd 1 0 0 Ks 0 0 0 newmtl green Ka 0 0 0 Kd 0 1 0 Ks 0 0 0 newmtl blue Ka 0 0 0 Kd 0 0 1 Ks 0 0 0 newmtl light Ka 20 20 20 Kd 1 1 1 Ks 0 0 0 tinyobjloader-2.0.0~rc5+dfsg1/models/cornell_box.obj000066400000000000000000000043651364105447200224710ustar00rootroot00000000000000# cornell_box.obj and cornell_box.mtl are grabbed from Intel's embree project. # original cornell box data # comment # empty line including some space mtllib cornell_box.mtl o floor usemtl white v 552.8 0.0 0.0 v 0.0 0.0 0.0 v 0.0 0.0 559.2 v 549.6 0.0 559.2 v 130.0 0.0 65.0 v 82.0 0.0 225.0 v 240.0 0.0 272.0 v 290.0 0.0 114.0 v 423.0 0.0 247.0 v 265.0 0.0 296.0 v 314.0 0.0 456.0 v 472.0 0.0 406.0 f 1 2 3 4 f 8 7 6 5 f 12 11 10 9 o light usemtl light v 343.0 548.0 227.0 v 343.0 548.0 332.0 v 213.0 548.0 332.0 v 213.0 548.0 227.0 f -4 -3 -2 -1 o ceiling usemtl white v 556.0 548.8 0.0 v 556.0 548.8 559.2 v 0.0 548.8 559.2 v 0.0 548.8 0.0 f -4 -3 -2 -1 o back_wall usemtl white v 549.6 0.0 559.2 v 0.0 0.0 559.2 v 0.0 548.8 559.2 v 556.0 548.8 559.2 f -4 -3 -2 -1 o front_wall usemtl blue v 549.6 0.0 0 v 0.0 0.0 0 v 0.0 548.8 0 v 556.0 548.8 0 #f -1 -2 -3 -4 o green_wall usemtl green v 0.0 0.0 559.2 v 0.0 0.0 0.0 v 0.0 548.8 0.0 v 0.0 548.8 559.2 f -4 -3 -2 -1 o red_wall usemtl red v 552.8 0.0 0.0 v 549.6 0.0 559.2 v 556.0 548.8 559.2 v 556.0 548.8 0.0 f -4 -3 -2 -1 o short_block usemtl white v 130.0 165.0 65.0 v 82.0 165.0 225.0 v 240.0 165.0 272.0 v 290.0 165.0 114.0 f -4 -3 -2 -1 v 290.0 0.0 114.0 v 290.0 165.0 114.0 v 240.0 165.0 272.0 v 240.0 0.0 272.0 f -4 -3 -2 -1 v 130.0 0.0 65.0 v 130.0 165.0 65.0 v 290.0 165.0 114.0 v 290.0 0.0 114.0 f -4 -3 -2 -1 v 82.0 0.0 225.0 v 82.0 165.0 225.0 v 130.0 165.0 65.0 v 130.0 0.0 65.0 f -4 -3 -2 -1 v 240.0 0.0 272.0 v 240.0 165.0 272.0 v 82.0 165.0 225.0 v 82.0 0.0 225.0 f -4 -3 -2 -1 o tall_block usemtl white v 423.0 330.0 247.0 v 265.0 330.0 296.0 v 314.0 330.0 456.0 v 472.0 330.0 406.0 f -4 -3 -2 -1 usemtl white v 423.0 0.0 247.0 v 423.0 330.0 247.0 v 472.0 330.0 406.0 v 472.0 0.0 406.0 f -4 -3 -2 -1 v 472.0 0.0 406.0 v 472.0 330.0 406.0 v 314.0 330.0 456.0 v 314.0 0.0 456.0 f -4 -3 -2 -1 v 314.0 0.0 456.0 v 314.0 330.0 456.0 v 265.0 330.0 296.0 v 265.0 0.0 296.0 f -4 -3 -2 -1 v 265.0 0.0 296.0 v 265.0 330.0 296.0 v 423.0 330.0 247.0 v 423.0 0.0 247.0 f -4 -3 -2 -1 tinyobjloader-2.0.0~rc5+dfsg1/models/cornell_box_multimaterial.obj000066400000000000000000000044021364105447200254120ustar00rootroot00000000000000# cornell_box.obj and cornell_box.mtl are grabbed from Intel's embree project. # original cornell box data # comment # empty line including some space mtllib cornell_box.mtl o floor usemtl white v 552.8 0.0 0.0 v 0.0 0.0 0.0 v 0.0 0.0 559.2 v 549.6 0.0 559.2 v 130.0 0.0 65.0 v 82.0 0.0 225.0 v 240.0 0.0 272.0 v 290.0 0.0 114.0 v 423.0 0.0 247.0 v 265.0 0.0 296.0 v 314.0 0.0 456.0 v 472.0 0.0 406.0 f 1 2 3 4 f 8 7 6 5 f 12 11 10 9 o light usemtl light v 343.0 548.0 227.0 v 343.0 548.0 332.0 v 213.0 548.0 332.0 v 213.0 548.0 227.0 f -4 -3 -2 -1 o ceiling usemtl white v 556.0 548.8 0.0 v 556.0 548.8 559.2 v 0.0 548.8 559.2 v 0.0 548.8 0.0 f -4 -3 -2 -1 o back_wall usemtl white v 549.6 0.0 559.2 v 0.0 0.0 559.2 v 0.0 548.8 559.2 v 556.0 548.8 559.2 f -4 -3 -2 -1 o front_wall usemtl blue v 549.6 0.0 0 v 0.0 0.0 0 v 0.0 548.8 0 v 556.0 548.8 0 #f -1 -2 -3 -4 o green_wall usemtl green v 0.0 0.0 559.2 v 0.0 0.0 0.0 v 0.0 548.8 0.0 v 0.0 548.8 559.2 f -4 -3 -2 -1 o red_wall usemtl red v 552.8 0.0 0.0 v 549.6 0.0 559.2 v 556.0 548.8 559.2 v 556.0 548.8 0.0 f -4 -3 -2 -1 o short_block usemtl white v 130.0 165.0 65.0 v 82.0 165.0 225.0 v 240.0 165.0 272.0 v 290.0 165.0 114.0 f -4 -3 -2 -1 v 290.0 0.0 114.0 v 290.0 165.0 114.0 v 240.0 165.0 272.0 v 240.0 0.0 272.0 f -4 -3 -2 -1 v 130.0 0.0 65.0 v 130.0 165.0 65.0 v 290.0 165.0 114.0 v 290.0 0.0 114.0 f -4 -3 -2 -1 v 82.0 0.0 225.0 v 82.0 165.0 225.0 v 130.0 165.0 65.0 v 130.0 0.0 65.0 f -4 -3 -2 -1 v 240.0 0.0 272.0 v 240.0 165.0 272.0 v 82.0 165.0 225.0 v 82.0 0.0 225.0 f -4 -3 -2 -1 o tall_block usemtl white v 423.0 330.0 247.0 v 265.0 330.0 296.0 v 314.0 330.0 456.0 v 472.0 330.0 406.0 f -4 -3 -2 -1 usemtl white v 423.0 0.0 247.0 v 423.0 330.0 247.0 v 472.0 330.0 406.0 v 472.0 0.0 406.0 f -4 -3 -2 -1 v 472.0 0.0 406.0 v 472.0 330.0 406.0 v 314.0 330.0 456.0 v 314.0 0.0 456.0 f -4 -3 -2 -1 usemtl green v 314.0 0.0 456.0 v 314.0 330.0 456.0 v 265.0 330.0 296.0 v 265.0 0.0 296.0 f -4 -3 -2 -1 v 265.0 0.0 296.0 v 265.0 330.0 296.0 v 423.0 330.0 247.0 v 423.0 0.0 247.0 f -4 -3 -2 -1 tinyobjloader-2.0.0~rc5+dfsg1/models/cube-vertexcol.obj000066400000000000000000000010431364105447200231000ustar00rootroot00000000000000mtllib cube.mtl v 0.000000 2.000000 2.000000 0 0 0 v 0.000000 0.000000 2.000000 0 0 1 v 2.000000 0.000000 2.000000 0 1 0 v 2.000000 2.000000 2.000000 0 1 1 v 0.000000 2.000000 0.000000 1 0 0 v 0.000000 0.000000 0.000000 1 0 1 v 2.000000 0.000000 0.000000 1 1 0 v 2.000000 2.000000 0.000000 1 1 1 # 8 vertices g front cube usemtl white f 1 2 3 4 g back cube # expects white material f 8 7 6 5 g right cube usemtl red f 4 3 7 8 g top cube usemtl white f 5 1 4 8 g left cube usemtl green f 5 6 2 1 g bottom cube usemtl white f 2 6 7 3 # 6 elements tinyobjloader-2.0.0~rc5+dfsg1/models/cube.mtl000066400000000000000000000003141364105447200211110ustar00rootroot00000000000000newmtl white Ka 0 0 0 Kd 1 1 1 Ks 0 0 0 newmtl red Ka 0 0 0 Kd 1 0 0 Ks 0 0 0 newmtl green Ka 0 0 0 Kd 0 1 0 Ks 0 0 0 newmtl blue Ka 0 0 0 Kd 0 0 1 Ks 0 0 0 newmtl light Ka 20 20 20 Kd 1 1 1 Ks 0 0 0 tinyobjloader-2.0.0~rc5+dfsg1/models/cube.obj000066400000000000000000000010411364105447200210650ustar00rootroot00000000000000mtllib cube.mtl v 0.000000 2.000000 2.000000 v 0.000000 0.000000 2.000000 v 2.000000 0.000000 2.000000 v 2.000000 2.000000 2.000000 v 0.000000 2.000000 0.000000 v 0.000000 0.000000 0.000000 v 2.000000 0.000000 0.000000 v 2.000000 2.000000 0.000000 # 8 vertices g front cube usemtl white f 1 2 3 4 # two white spaces between 'back' and 'cube' g back cube # expects white material f 8 7 6 5 g right cube usemtl red f 4 3 7 8 g top cube usemtl white f 5 1 4 8 g left cube usemtl green f 5 6 2 1 g bottom cube usemtl white f 2 6 7 3 # 6 elements tinyobjloader-2.0.0~rc5+dfsg1/models/invalid-face-definition.mtl000066400000000000000000000003141364105447200246430ustar00rootroot00000000000000newmtl white Ka 0 0 0 Kd 1 1 1 Ks 0 0 0 newmtl red Ka 0 0 0 Kd 1 0 0 Ks 0 0 0 newmtl green Ka 0 0 0 Kd 0 1 0 Ks 0 0 0 newmtl blue Ka 0 0 0 Kd 0 0 1 Ks 0 0 0 newmtl light Ka 20 20 20 Kd 1 1 1 Ks 0 0 0 tinyobjloader-2.0.0~rc5+dfsg1/models/invalid-face-definition.obj000066400000000000000000000005431364105447200246250ustar00rootroot00000000000000mtllib invalid-face-definition.mtl v 0.000000 2.000000 2.000000 v 0.000000 0.000000 2.000000 v 2.000000 0.000000 2.000000 v 2.000000 2.000000 2.000000 v 0.000000 2.000000 0.000000 v 0.000000 0.000000 0.000000 v 2.000000 0.000000 0.000000 v 2.000000 2.000000 0.000000 # 8 vertices g front cube usemtl white f 1 g back cube # expects white material f 8 7 tinyobjloader-2.0.0~rc5+dfsg1/models/issue-138.mtl000066400000000000000000000006041364105447200216360ustar00rootroot00000000000000newmtl test1 Ns 10.0000 Ni 1.5000 d 1.0000 Tr 0.0000 Tf 1.0000 1.0000 1.0000 illum 2 Ka 0.0000 0.0000 0.0000 Kd 0.5 0.2 0.2 Ks 0.0000 0.0000 0.0000 Ke 0.0000 0.0000 0.0000 newmtl test2 Ns 10.0000 Ni 1.5000 d 1.0000 Tr 0.0000 Tf 1.0000 1.0000 1.0000 illum 2 Ka 0.0000 0.0000 0.0000 Kd 0.2 0.5 0.2 Ks 0.0000 0.0000 0.0000 Ke 0.0000 0.0000 0.0000 tinyobjloader-2.0.0~rc5+dfsg1/models/issue-138.obj000066400000000000000000000015331364105447200216160ustar00rootroot00000000000000 # cube.obj # mtllib issue-138.mtl v -0.500000 -0.500000 0.500000 v 0.500000 -0.500000 0.500000 v -0.500000 0.500000 0.500000 v 0.500000 0.500000 0.500000 v -0.500000 0.500000 -0.500000 v 0.500000 0.500000 -0.500000 v -0.500000 -0.500000 -0.500000 v 0.500000 -0.500000 -0.500000 vt 0.000000 0.000000 vt 1.000000 0.000000 vt 0.000000 1.000000 vt 1.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 -1.000000 0.000000 vn 1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 usemtl test1 g test1 s 1 f 1/1/1 2/2/1 3/3/1 f 3/3/1 2/2/1 4/4/1 usemtl test2 g test2 s 2 f 3/1/2 4/2/2 5/3/2 f 5/3/2 4/2/2 6/4/2 s 3 f 5/4/3 6/3/3 7/2/3 f 7/2/3 6/3/3 8/1/3 s 4 f 7/1/4 8/2/4 1/3/4 f 1/3/4 8/2/4 2/4/4 s 5 f 2/1/5 8/2/5 4/3/5 f 4/3/5 8/2/5 6/4/5 s 6 f 7/1/6 1/2/6 5/3/6 f 5/3/6 1/2/6 3/4/6 tinyobjloader-2.0.0~rc5+dfsg1/models/issue-140-zero-face-idx.mtl000066400000000000000000000000251364105447200242570ustar00rootroot00000000000000newmtl main Kd 1 1 1 tinyobjloader-2.0.0~rc5+dfsg1/models/issue-140-zero-face-idx.obj000066400000000000000000000002751364105447200242440ustar00rootroot00000000000000mtllib issue-140-zero-face-idx.mtl v -0.5 -0.5 0 v 0.5 -0.5 0 v 0.5 0.5 0 v -0.5 0.5 0 vt 0 0 0 vt 1 0 0 vt 1 1 0 vt 0 1 0 vn 0 0 -1 usemtl main f 0/0/0 1/1/0 3/3/0 f 1/1/0 3/3/0 2/2/0 tinyobjloader-2.0.0~rc5+dfsg1/models/issue-161-inconsistent-f.obj000066400000000000000000000010571364105447200245540ustar00rootroot00000000000000o cube mtllib cube.mtl v -0.500000 -0.500000 0.500000 v 0.500000 -0.500000 0.500000 v -0.500000 0.500000 0.500000 v 0.500000 0.500000 0.500000 v -0.500000 0.500000 -0.500000 v 0.500000 0.500000 -0.500000 v -0.500000 -0.500000 -0.500000 v 0.500000 -0.500000 -0.500000 vt 0.000000 0.000000 vt 1.000000 0.000000 vt 0.000000 1.000000 vt 1.000000 1.000000 g cube usemtl cube s 1 f 1/1 2/2 3/3 f 3/3 2/2 4/4 s 2 f 3/1 4/2 5/3 f 5/3 4/2 6/4 s 3 f 5/4 6/3 7/2 f 7/2 6/3 8/1 s 4 f 7/1 8/2 1/3 f 1/3 8/2 2/4 s 5 f 2/1 8/2 4/3 f 4/3 8/2 6/4 s 6 f 7/1 1/2 5/3 f 5 1 3 tinyobjloader-2.0.0~rc5+dfsg1/models/issue-162-smoothing-group.mtl000066400000000000000000000006041364105447200247720ustar00rootroot00000000000000newmtl test1 Ns 10.0000 Ni 1.5000 d 1.0000 Tr 0.0000 Tf 1.0000 1.0000 1.0000 illum 2 Ka 0.0000 0.0000 0.0000 Kd 0.5 0.2 0.2 Ks 0.0000 0.0000 0.0000 Ke 0.0000 0.0000 0.0000 newmtl test2 Ns 10.0000 Ni 1.5000 d 1.0000 Tr 0.0000 Tf 1.0000 1.0000 1.0000 illum 2 Ka 0.0000 0.0000 0.0000 Kd 0.2 0.5 0.2 Ks 0.0000 0.0000 0.0000 Ke 0.0000 0.0000 0.0000 tinyobjloader-2.0.0~rc5+dfsg1/models/issue-162-smoothing-group.obj000066400000000000000000000015551364105447200247560ustar00rootroot00000000000000 # cube.obj # mtllib issue-162-smoothing-group.mtl v -0.500000 -0.500000 0.500000 v 0.500000 -0.500000 0.500000 v -0.500000 0.500000 0.500000 v 0.500000 0.500000 0.500000 v -0.500000 0.500000 -0.500000 v 0.500000 0.500000 -0.500000 v -0.500000 -0.500000 -0.500000 v 0.500000 -0.500000 -0.500000 vt 0.000000 0.000000 vt 1.000000 0.000000 vt 0.000000 1.000000 vt 1.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 -1.000000 0.000000 vn 1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 usemtl test1 g test1 s 1 f 1/1/1 2/2/1 3/3/1 f 3/3/1 2/2/1 4/4/1 usemtl test2 g test2 s off f 3/1/2 4/2/2 5/3/2 f 5/3/2 4/2/2 6/4/2 s 3 f 5/4/3 6/3/3 7/2/3 f 7/2/3 6/3/3 8/1/3 s 4 f 7/1/4 8/2/4 1/3/4 f 1/3/4 8/2/4 2/4/4 s 0 f 2/1/5 8/2/5 4/3/5 f 4/3/5 8/2/5 6/4/5 s 6 f 7/1/6 1/2/6 5/3/6 f 5/3/6 1/2/6 3/4/6 tinyobjloader-2.0.0~rc5+dfsg1/models/issue-235-usemtl-then-o.obj000066400000000000000000000006741364105447200243200ustar00rootroot00000000000000mtllib issue-235.mtl v -1.000000 1.202466 1.000000 v 1.000000 1.202466 1.000000 v -1.000000 1.202466 -1.000000 v 1.000000 1.202466 -1.000000 vn 0.0000 1.0000 0.0000 v -1.000000 0.000000 1.000000 v 1.000000 0.000000 1.000000 v -1.000000 0.000000 -1.000000 v 1.000000 0.000000 -1.000000 vn 0.0000 1.0000 0.0000 usemtl None o Plane.001 f 1//1 2//1 4//1 # Following geometry is ignored without fix for #235 usemtl None1 o Plane f 5//2 6//2 8//2 tinyobjloader-2.0.0~rc5+dfsg1/models/issue-235.mtl000066400000000000000000000001221364105447200216270ustar00rootroot00000000000000newmtl None Ka 0 0 0 Kd 0 0 1 Ks 0 0 0 newmtl None1 Ka 0 0 0 Kd 1 0 0 Ks 0 0 0 tinyobjloader-2.0.0~rc5+dfsg1/models/issue-244-mtl-searchpaths.obj000066400000000000000000000007361364105447200247150ustar00rootroot00000000000000# .mtl is located at tests/assets mtllib issue-244.mtl v -1.000000 1.202466 1.000000 v 1.000000 1.202466 1.000000 v -1.000000 1.202466 -1.000000 v 1.000000 1.202466 -1.000000 vn 0.0000 1.0000 0.0000 v -1.000000 0.000000 1.000000 v 1.000000 0.000000 1.000000 v -1.000000 0.000000 -1.000000 v 1.000000 0.000000 -1.000000 vn 0.0000 1.0000 0.0000 usemtl None o Plane.001 f 1//1 2//1 4//1 # Following geometry is ignored without fix for #235 usemtl None1 o Plane f 5//2 6//2 8//2 tinyobjloader-2.0.0~rc5+dfsg1/models/issue-246-usemtl-whitespace.mtl000066400000000000000000000000441364105447200252750ustar00rootroot00000000000000newmtl 1 Ka 0 0 0 Kd 1 1 1 Ks 0 0 0 tinyobjloader-2.0.0~rc5+dfsg1/models/issue-246-usemtl-whitespace.obj000066400000000000000000000006221364105447200252550ustar00rootroot00000000000000# .mtl is located at tests/assets mtllib issue-246-usemtl-whitespace.mtl v -1.000000 1.202466 1.000000 v 1.000000 1.202466 1.000000 v -1.000000 1.202466 -1.000000 v 1.000000 1.202466 -1.000000 vn 0.0000 1.0000 0.0000 v -1.000000 0.000000 1.000000 v 1.000000 0.000000 1.000000 v -1.000000 0.000000 -1.000000 v 1.000000 0.000000 -1.000000 vn 0.0000 1.0000 0.0000 usemtl 1 o Plane.001 f 1//1 2//1 4//1 tinyobjloader-2.0.0~rc5+dfsg1/models/issue-248-texres-texopt.mtl000066400000000000000000000003511364105447200244700ustar00rootroot00000000000000newmtl white Ka 0 0 0 Kd 1 1 1 Ks 0 0 0 map_Kd -texres 512 input.jpg newmtl red Ka 0 0 0 Kd 1 0 0 Ks 0 0 0 newmtl green Ka 0 0 0 Kd 0 1 0 Ks 0 0 0 newmtl blue Ka 0 0 0 Kd 0 0 1 Ks 0 0 0 newmtl light Ka 20 20 20 Kd 1 1 1 Ks 0 0 0 tinyobjloader-2.0.0~rc5+dfsg1/models/issue-248-texres-texopt.obj000066400000000000000000000010641364105447200244500ustar00rootroot00000000000000mtllib issue-248-texres-texopt.mtl v 0.000000 2.000000 2.000000 v 0.000000 0.000000 2.000000 v 2.000000 0.000000 2.000000 v 2.000000 2.000000 2.000000 v 0.000000 2.000000 0.000000 v 0.000000 0.000000 0.000000 v 2.000000 0.000000 0.000000 v 2.000000 2.000000 0.000000 # 8 vertices g front cube usemtl white f 1 2 3 4 # two white spaces between 'back' and 'cube' g back cube # expects white material f 8 7 6 5 g right cube usemtl red f 4 3 7 8 g top cube usemtl white f 5 1 4 8 g left cube usemtl green f 5 6 2 1 g bottom cube usemtl white f 2 6 7 3 # 6 elements tinyobjloader-2.0.0~rc5+dfsg1/models/issue-92.mtl000066400000000000000000000000731364105447200215550ustar00rootroot00000000000000newmtl default Ka 0 0 0 Kd 0 0 0 Ks 0 0 0 map_Kd tmp.png tinyobjloader-2.0.0~rc5+dfsg1/models/issue-92.obj000066400000000000000000000002151364105447200215310ustar00rootroot00000000000000mtllib issue-92.mtl o Test v 1.864151 -1.219172 -5.532511 v 0.575869 -0.666304 5.896140 v 0.940448 1.000000 -1.971128 usemtl default f 1 2 3 tinyobjloader-2.0.0~rc5+dfsg1/models/issue-95-2.mtl000066400000000000000000000000711364105447200217150ustar00rootroot00000000000000newmtl default Ka 0 0 0 Kd 0 0 0 Ks 0 0 0 Tf 0.1 0.2 0.3 tinyobjloader-2.0.0~rc5+dfsg1/models/issue-95-2.obj000066400000000000000000000002171364105447200216750ustar00rootroot00000000000000mtllib issue-95-2.mtl o Test v 1.864151 -1.219172 -5.532511 v 0.575869 -0.666304 5.896140 v 0.940448 1.000000 -1.971128 usemtl default f 1 2 3 tinyobjloader-2.0.0~rc5+dfsg1/models/issue-95.mtl000066400000000000000000000000711364105447200215560ustar00rootroot00000000000000newmtl default Ka 0 0 0 Kd 0 0 0 Ks 0 0 0 Kt 0.1 0.2 0.3 tinyobjloader-2.0.0~rc5+dfsg1/models/issue-95.obj000066400000000000000000000002151364105447200215340ustar00rootroot00000000000000mtllib issue-95.mtl o Test v 1.864151 -1.219172 -5.532511 v 0.575869 -0.666304 5.896140 v 0.940448 1.000000 -1.971128 usemtl default f 1 2 3 tinyobjloader-2.0.0~rc5+dfsg1/models/leading-decimal-dot-issue-201.mtl000066400000000000000000000000711364105447200254040ustar00rootroot00000000000000newmtl default Ka 0 0 0 Kd 0 0 0 Ks 0 0 0 Kt 0.1 0.2 0.3 tinyobjloader-2.0.0~rc5+dfsg1/models/leading-decimal-dot-issue-201.obj000066400000000000000000000002311364105447200253600ustar00rootroot00000000000000mtllib leading-decimal-dot-issue-201.mtl o Test v .8e-1 -.7e+2 -5.532511 v .575869 -.666304 5.896140 v .940448 1.000000 -1.971128 usemtl default f 1 2 3 tinyobjloader-2.0.0~rc5+dfsg1/models/leading-zero-in-exponent-notation-issue-210.mtl000066400000000000000000000000711364105447200302740ustar00rootroot00000000000000newmtl default Ka 0 0 0 Kd 0 0 0 Ks 0 0 0 Kt 0.1 0.2 0.3 tinyobjloader-2.0.0~rc5+dfsg1/models/leading-zero-in-exponent-notation-issue-210.obj000066400000000000000000000002521364105447200302530ustar00rootroot00000000000000mtllib leading-zero-in-exponent-notation-issue-210.mtl o Test v .8e-001 -.7e+02 -5.532511 v .575869 -.666304 5.896140 v .940448 1.000000 -1.971128 usemtl default f 1 2 3 tinyobjloader-2.0.0~rc5+dfsg1/models/line-prim.obj000066400000000000000000000004551364105447200220530ustar00rootroot00000000000000mtllib cube.mtl v 0.000000 2.000000 2.000000 v 0.000000 0.000000 2.000000 v 2.000000 0.000000 2.000000 v 2.000000 2.000000 2.000000 v 0.000000 2.000000 0.000000 v 0.000000 0.000000 0.000000 v 2.000000 0.000000 0.000000 v 2.000000 2.000000 0.000000 # 8 vertices g g0 usemtl white l 1 2 3 4 l 5 6 7 8 tinyobjloader-2.0.0~rc5+dfsg1/models/map-bump.mtl000066400000000000000000000001611364105447200217110ustar00rootroot00000000000000newmtl Material.001 Ka 0 0 0 Kd 0 0 0 Ks 0 0 0 map_Bump bump.jpg newmtl Material.003 Ka 0 0 0 Kd 1 1 1 Ks 0 0 0 tinyobjloader-2.0.0~rc5+dfsg1/models/map-bump.obj000066400000000000000000000561461364105447200217050ustar00rootroot00000000000000# https://github.com/syoyo/tinyobjloader/issues/68 # Blender v2.73 (sub 0) OBJ File: 'enemy.blend' # www.blender.org mtllib map-bump.mtl o Cube v 1.864151 -1.219172 -5.532511 v 0.575869 -0.666304 5.896140 v 0.940448 1.000000 -1.971128 v 1.620345 1.000000 -5.815706 v 1.864152 1.000000 -6.334323 v 0.575869 -0.129842 5.896143 v 5.440438 -1.462153 -5.818601 v 4.896782 -1.462153 -2.744413 v 1.000825 -0.677484 1.899605 v 5.440438 -1.246362 -5.818600 v 1.000825 0.852342 1.899608 v 4.896782 -1.246362 -2.744412 v 1.160660 -0.450871 -2.356325 v 1.704316 -0.450871 -5.430513 v 1.000825 -0.351920 -1.293797 v 1.000825 1.000000 -1.293794 v 1.160660 -0.877888 -2.356326 v 1.704316 -0.877888 -5.430514 v 1.000825 -1.219172 -1.452514 v 1.000825 1.000000 -1.452511 v 1.000825 -0.351920 1.759410 v 1.000825 1.000000 1.759413 v 9.097919 1.221145 -6.212147 v 8.356775 1.221145 -2.021231 v 1.864151 -0.109586 -6.334325 v 0.575869 -0.398073 5.896141 v 9.097919 0.943958 -6.212148 v 8.356775 0.943958 -2.021233 v 1.061916 0.113661 -1.797961 v 1.000825 0.161258 1.899606 v 1.000825 0.324040 -1.293795 v 1.803060 0.113661 -5.988876 v 1.000825 -0.109586 -1.452513 v 1.061916 0.776753 -1.797960 v 1.803061 0.776753 -5.988875 v 1.000825 0.324040 1.759412 v 0.000825 -1.219172 -5.532512 v 0.000825 -0.666304 5.896139 v 0.000826 1.000000 -6.334325 v 0.000825 -0.129842 5.896140 v 0.000825 0.852342 1.899606 v 0.000825 -0.677484 1.899604 v 0.000825 -0.351920 -1.293797 v 0.000825 1.000000 -1.293796 v 0.000825 1.000000 -1.452513 v 0.000825 -1.219172 -1.452515 v 0.000825 -0.351920 1.759409 v 0.000825 1.000000 1.759411 v 0.000826 -0.109586 -6.334326 v 0.000825 -0.398073 5.896140 v 0.152918 1.000000 -5.815708 v 0.152917 1.000000 -1.971130 v 0.940448 1.168419 -1.971128 v 1.620345 1.168419 -5.815706 v 0.152918 1.168419 -5.815708 v 0.152917 1.168419 -1.971130 v 0.921118 1.091883 -1.050430 v 0.921118 1.091883 1.516050 v 0.080533 1.091883 -1.050432 v 0.080533 1.091883 1.516048 v 0.613003 -0.553430 5.546911 v 0.963691 -0.559956 2.248834 v 0.613003 -0.396857 5.546912 v 0.963691 -0.070362 2.248835 v 1.499370 -0.994317 3.966028 v 1.850058 -0.997914 0.667950 v 1.499370 -0.908021 3.966029 v 1.850058 -0.728071 0.667951 v 1.601022 0.760960 -6.334324 v 1.601021 0.129454 -6.334325 v 0.263955 0.760960 -6.334325 v 0.263955 0.129454 -6.334325 v 1.334809 0.760960 -7.515329 v 1.334809 0.129455 -7.515330 v 0.530168 0.760960 -7.515330 v 0.530168 0.129455 -7.515330 v 1.192720 0.649445 -7.515329 v 1.192720 0.240971 -7.515330 v 0.672258 0.649445 -7.515330 v 0.672258 0.240971 -7.515330 v 1.192719 0.649444 -6.524630 v 1.192719 0.240970 -6.524631 v 0.672257 0.649444 -6.524631 v 0.672257 0.240970 -6.524631 v 3.851026 0.431116 -1.883326 v 3.851026 0.946662 -1.883325 v 4.592170 0.946662 -6.074241 v 4.592169 0.431116 -6.074242 v 4.995714 0.561404 -1.918362 v 4.995714 1.016394 -1.918360 v 5.736857 1.016394 -6.109276 v 5.736857 0.561404 -6.109277 v 3.975454 0.471731 -2.162156 v 3.975454 0.919244 -2.162155 v 4.618796 0.919244 -5.800034 v 4.618795 0.471730 -5.800035 v 4.969088 0.584825 -2.192568 v 4.969088 0.979775 -2.192567 v 5.612430 0.979775 -5.830446 v 5.612429 0.584825 -5.830447 v 0.864214 -0.673890 3.184381 v 0.864213 0.489129 3.184384 v 0.864213 -0.018552 3.184383 v 0.000825 0.489129 3.184382 v 0.000825 -0.673890 3.184381 v 0.850955 -0.557858 3.309075 v 0.850955 -0.175321 3.309076 v 1.737321 -0.996758 1.728192 v 1.737321 -0.785920 1.728193 v -1.864151 -1.219172 -5.532511 v -0.575869 -0.666304 5.896140 v -0.940448 1.000000 -1.971128 v -1.620345 1.000000 -5.815706 v -1.864152 1.000000 -6.334323 v -0.575869 -0.129842 5.896143 v -5.440438 -1.462153 -5.818601 v -4.896782 -1.462153 -2.744413 v -1.000825 -0.677484 1.899605 v -5.440438 -1.246362 -5.818600 v -1.000825 0.852342 1.899608 v -4.896782 -1.246362 -2.744412 v -1.160660 -0.450871 -2.356325 v -1.704316 -0.450871 -5.430513 v -1.000825 -0.351920 -1.293797 v -1.000825 1.000000 -1.293794 v -1.160660 -0.877888 -2.356326 v -1.704316 -0.877888 -5.430514 v -1.000825 -1.219172 -1.452514 v -1.000825 1.000000 -1.452511 v -1.000825 -0.351920 1.759410 v -1.000825 1.000000 1.759413 v -9.097919 1.221145 -6.212147 v -8.356775 1.221145 -2.021231 v -1.864151 -0.109586 -6.334325 v -0.575869 -0.398073 5.896141 v -9.097919 0.943958 -6.212148 v -8.356775 0.943958 -2.021233 v -1.061916 0.113661 -1.797961 v -1.000825 0.161258 1.899606 v -1.000825 0.324040 -1.293795 v -1.803060 0.113661 -5.988876 v -1.000825 -0.109586 -1.452513 v -1.061916 0.776753 -1.797960 v -1.803061 0.776753 -5.988875 v -1.000825 0.324040 1.759412 v -0.000825 -1.219172 -5.532512 v -0.000825 -0.666304 5.896139 v -0.000826 1.000000 -6.334325 v -0.000825 -0.129842 5.896140 v -0.000825 0.852342 1.899606 v -0.000825 -0.677484 1.899604 v -0.000825 -0.351920 -1.293797 v -0.000825 1.000000 -1.293796 v -0.000825 1.000000 -1.452513 v -0.000825 -1.219172 -1.452515 v -0.000825 -0.351920 1.759409 v -0.000825 1.000000 1.759411 v -0.000826 -0.109586 -6.334326 v -0.000825 -0.398073 5.896140 v -0.152918 1.000000 -5.815708 v -0.152917 1.000000 -1.971130 v -0.940448 1.168419 -1.971128 v -1.620345 1.168419 -5.815706 v -0.152918 1.168419 -5.815708 v -0.152917 1.168419 -1.971130 v -0.921118 1.091883 -1.050430 v -0.921118 1.091883 1.516050 v -0.080533 1.091883 -1.050432 v -0.080533 1.091883 1.516048 v -0.613003 -0.553430 5.546911 v -0.963691 -0.559956 2.248834 v -0.613003 -0.396857 5.546912 v -0.963691 -0.070362 2.248835 v -1.499370 -0.994317 3.966028 v -1.850058 -0.997914 0.667950 v -1.499370 -0.908021 3.966029 v -1.850058 -0.728071 0.667951 v -1.601022 0.760960 -6.334324 v -1.601021 0.129454 -6.334325 v -0.263955 0.760960 -6.334325 v -0.263955 0.129454 -6.334325 v -1.334809 0.760960 -7.515329 v -1.334809 0.129455 -7.515330 v -0.530168 0.760960 -7.515330 v -0.530168 0.129455 -7.515330 v -1.192720 0.649445 -7.515329 v -1.192720 0.240971 -7.515330 v -0.672258 0.649445 -7.515330 v -0.672258 0.240971 -7.515330 v -1.192719 0.649444 -6.524630 v -1.192719 0.240970 -6.524631 v -0.672257 0.649444 -6.524631 v -0.672257 0.240970 -6.524631 v -3.851026 0.431116 -1.883326 v -3.851026 0.946662 -1.883325 v -4.592170 0.946662 -6.074241 v -4.592169 0.431116 -6.074242 v -4.995714 0.561404 -1.918362 v -4.995714 1.016394 -1.918360 v -5.736857 1.016394 -6.109276 v -5.736857 0.561404 -6.109277 v -3.975454 0.471731 -2.162156 v -3.975454 0.919244 -2.162155 v -4.618796 0.919244 -5.800034 v -4.618795 0.471730 -5.800035 v -4.969088 0.584825 -2.192568 v -4.969088 0.979775 -2.192567 v -5.612430 0.979775 -5.830446 v -5.612429 0.584825 -5.830447 v -0.864214 -0.673890 3.184381 v -0.864213 0.489129 3.184384 v -0.864213 -0.018552 3.184383 v -0.000825 0.489129 3.184382 v -0.000825 -0.673890 3.184381 v -0.850955 -0.557858 3.309075 v -0.850955 -0.175321 3.309076 v -1.737321 -0.996758 1.728192 v -1.737321 -0.785920 1.728193 vt 0.135351 -0.558072 vt 0.003035 -0.363507 vt 0.092282 -0.976844 vt -0.081322 0.947351 vt 0.100058 1.958891 vt 0.050091 1.852185 vt -0.092752 1.055565 vt -0.251711 1.059474 vt 0.075587 0.041384 vt -0.086008 0.279003 vt -0.086212 0.249830 vt -0.276044 1.968137 vt -0.246101 1.859467 vt 0.009828 1.911388 vt -0.133014 1.114769 vt 0.413322 1.261595 vt 0.299103 0.624605 vt 1.243955 0.407183 vt 0.515404 1.111487 vt 1.358173 1.044173 vt -0.081553 0.914324 vt 0.080042 0.676706 vt 0.401185 0.474498 vt 1.295541 0.331328 vt 0.365315 1.568841 vt 0.299111 1.575740 vt 0.143401 0.707357 vt 0.629403 1.011947 vt 0.449192 0.167251 vt 1.409760 0.968317 vt 0.986264 1.738667 vt 1.573373 1.877873 vt 1.417663 1.009490 vt 0.237182 -0.196235 vt 0.721785 1.030226 vt 0.830554 0.870285 vt 0.877494 1.898608 vt 1.351399 1.106930 vt 0.183935 0.557301 vt 1.507109 1.975312 vt 0.241636 0.439088 vt 0.114297 -0.045011 vt 0.140593 1.808834 vt -0.015118 0.940452 vt 0.156405 -1.071134 vt 0.164119 -0.998223 vt 0.040336 -1.068281 vt 0.104459 -1.162571 vt -0.165787 1.882802 vt -0.014821 1.660811 vt -0.287852 0.283965 vt -0.293374 0.366508 vt -0.289630 0.900550 vt 0.035337 -0.191272 vt 0.247348 0.172213 vt 0.253300 1.021193 vt -0.283166 0.952313 vt -0.283398 0.919286 vt 0.039792 0.444050 vt 0.314806 -0.339851 vt 0.112962 -0.334889 vt -0.288056 0.254793 vt -0.023788 -0.973990 vt -0.155922 -0.359599 vt 0.220528 -1.165425 vt 0.108710 -0.748730 vt -0.286364 1.918670 vt -0.291973 1.118678 vt -0.119962 0.896379 vt -0.123707 0.362337 vt 0.162891 -0.598569 vt 0.467532 -0.853353 vt 0.201549 -1.053262 vt 0.161663 -0.198915 vt 0.267667 -0.752638 vt 0.278705 -0.371021 vt 0.526390 -0.542053 vt 0.483821 -0.479457 vt 0.488162 -0.883689 vt 0.500110 -0.105561 vt 0.564618 -0.200418 vt -0.110331 2.127229 vt 0.040636 1.905238 vt -0.010786 1.578087 vt 0.104092 1.876168 vt 0.255058 1.654176 vt -0.054992 2.087323 vt 0.203048 1.901245 vt 0.052081 2.123235 vt 0.042658 1.943733 vt -0.056437 1.881175 vt 0.147710 1.941151 vt 0.050060 2.084741 vt 0.146264 1.735002 vt 0.041212 1.737584 vt 0.048615 1.878591 vt 0.663065 1.872485 vt 0.786311 1.691257 vt 0.507355 1.004102 vt 0.630601 0.822874 vt 0.955144 1.689498 vt 0.860727 1.828333 vt 0.725565 1.074543 vt 0.819981 0.935708 vt 0.674594 1.805657 vt 0.539432 1.051867 vt 0.646413 0.894554 vt 0.781576 1.648344 vt 0.240127 -0.712141 vn 0.994400 0.000000 0.105700 vn 0.000000 1.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 0.984700 0.000000 0.174100 vn 0.211800 0.976600 0.037500 vn -0.103300 0.000000 -0.994600 vn 0.103300 -0.000000 0.994600 vn 0.911400 0.378700 0.161200 vn -0.157300 -0.987200 -0.027800 vn 0.113700 -0.993300 0.020100 vn 0.030600 -0.000000 0.999500 vn -0.061100 0.998100 -0.010800 vn -0.030600 0.000000 -0.999500 vn -0.000000 -0.000000 1.000000 vn 0.000000 0.000000 -1.000000 vn -0.755400 0.655300 0.000000 vn 0.000000 -1.000000 0.000000 vn -0.000000 -0.180000 0.983700 vn 0.000000 -0.395500 -0.918500 vn -0.000000 0.688500 0.725200 vn 0.000000 -0.585700 -0.810500 vn -0.000000 0.974900 0.222500 vn -0.000000 -1.000000 0.002800 vn -1.000000 0.000000 -0.000000 vn -0.000000 0.935500 0.353200 vn 0.755400 0.655300 0.000000 vn 0.000000 0.935500 -0.353200 vn 0.673800 0.724900 0.143400 vn 0.872300 -0.000000 0.489100 vn -0.872300 0.000000 -0.489100 vn -0.518300 -0.853500 -0.054200 vn -0.975500 0.000000 -0.219900 vn 0.975500 0.000000 -0.219900 vn -0.913200 0.000000 -0.407500 vn -0.436900 0.896200 -0.077300 vn -0.995300 -0.000000 0.096600 vn -0.297300 -0.953400 -0.052600 vn 0.473900 -0.876600 0.083800 vn 0.913200 0.000000 0.407500 vn 0.342200 0.937700 0.060500 vn 0.995300 -0.000000 -0.096600 vn -0.519200 -0.853000 -0.054300 vn 0.722400 0.676400 0.143800 vn -0.994400 0.000000 0.105700 vn -0.984700 0.000000 0.174100 vn -0.211800 0.976600 0.037500 vn 0.103300 0.000000 -0.994600 vn -0.103300 -0.000000 0.994600 vn -0.911400 0.378700 0.161200 vn 0.157300 -0.987200 -0.027800 vn -0.113700 -0.993300 0.020100 vn -0.030600 -0.000000 0.999500 vn 0.061100 0.998100 -0.010800 vn 0.030600 0.000000 -0.999500 vn -0.691900 0.713200 0.112500 vn -0.872300 -0.000000 0.489100 vn 0.872300 0.000000 -0.489100 vn 0.518300 -0.853500 -0.054200 vn 0.913200 0.000000 -0.407500 vn 0.436900 0.896200 -0.077300 vn 0.995300 0.000000 0.096600 vn 0.297300 -0.953300 -0.052600 vn -0.473900 -0.876600 0.083800 vn -0.913200 -0.000000 0.407500 vn -0.342200 0.937700 0.060500 vn -0.995300 -0.000000 -0.096600 vn 0.519200 -0.853000 -0.054300 vn -0.714800 0.690100 0.113700 vn 0.974400 0.089700 0.206200 vn 0.870400 0.288400 0.399100 vn 0.691900 0.713200 0.112500 vn -0.518000 -0.853700 -0.053400 vn -0.519700 -0.852700 -0.053600 vn 0.714800 0.690100 0.113700 vn -0.974400 0.089700 0.206200 vn -0.870400 0.288400 0.399100 vn -0.673800 0.724900 0.143400 vn 0.518000 -0.853700 -0.053400 vn 0.297300 -0.953400 -0.052600 vn 0.519700 -0.852700 -0.053600 vn -0.722400 0.676400 0.143800 vn -0.000000 0.962300 0.272000 usemtl Material.001 s off f 103/1/1 102/2/1 6/3/1 f 20/4/2 5/5/2 4/6/2 f 20/4/2 3/7/2 52/8/2 f 36/9/3 22/10/3 11/11/3 f 39/12/2 51/13/2 4/6/2 f 4/6/4 54/14/4 53/15/4 f 14/16/5 13/17/5 12/18/5 f 18/19/6 14/16/6 10/20/6 f 20/4/3 16/21/3 31/22/3 f 17/23/7 8/24/7 12/18/7 f 25/25/4 32/26/4 29/27/4 f 10/20/4 12/18/4 8/24/4 f 1/28/8 18/19/8 17/23/8 f 19/29/4 17/23/4 13/17/4 f 25/25/4 14/16/4 18/19/4 f 18/19/9 7/30/9 8/24/9 f 92/31/10 27/32/10 28/33/10 f 16/21/3 22/10/3 36/9/3 f 31/22/3 36/9/3 21/34/3 f 90/35/11 89/36/11 28/33/11 f 91/37/12 90/35/12 24/38/12 f 33/39/4 13/17/4 14/16/4 f 23/40/4 24/38/4 28/33/4 f 33/39/3 31/22/3 15/41/3 f 21/34/3 36/9/3 30/42/3 f 5/5/4 35/43/4 32/26/4 f 5/5/4 20/4/4 34/44/4 f 33/39/4 29/27/4 34/44/4 f 91/37/13 23/40/13 27/32/13 f 103/1/1 26/45/1 63/46/1 f 26/45/14 50/47/14 38/48/14 f 39/12/15 71/49/15 72/50/15 f 48/51/16 60/52/16 59/53/16 f 15/41/17 21/34/17 47/54/17 f 19/29/17 46/55/17 37/56/17 f 39/12/2 45/57/2 52/8/2 f 20/4/2 45/57/2 44/58/2 f 19/29/18 15/41/18 43/59/18 f 9/60/19 42/61/19 47/54/19 f 22/10/20 48/51/20 41/62/20 f 25/25/21 1/28/21 37/56/21 f 6/3/14 40/63/14 50/47/14 f 104/64/22 40/63/22 6/3/22 f 2/65/23 38/48/23 105/66/23 f 55/67/2 56/68/2 53/15/2 f 3/7/14 53/15/14 56/68/14 f 51/13/15 55/67/15 54/14/15 f 52/8/24 56/68/24 55/67/24 f 57/69/2 59/53/2 60/52/2 f 48/51/25 22/10/25 58/70/25 f 16/21/26 57/69/26 58/70/26 f 16/21/27 44/58/27 59/53/27 f 107/71/28 63/46/28 67/72/28 f 26/45/1 2/65/1 61/73/1 f 9/60/1 30/42/1 64/74/1 f 101/75/1 9/60/1 62/76/1 f 108/77/1 109/78/1 67/72/1 f 61/73/29 65/79/29 67/72/29 f 62/76/30 64/74/30 68/80/30 f 62/76/31 66/81/31 108/77/31 f 71/49/32 75/82/32 76/83/32 f 25/25/15 49/84/15 72/50/15 f 5/5/15 69/85/15 71/49/15 f 25/25/15 70/86/15 69/85/15 f 76/83/15 75/82/15 79/87/15 f 72/50/17 76/83/17 74/88/17 f 71/49/2 69/85/2 73/89/2 f 70/86/33 74/88/33 73/89/33 f 80/90/3 79/87/3 83/91/3 f 76/83/15 80/90/15 78/92/15 f 75/82/15 73/89/15 77/93/15 f 74/88/15 78/92/15 77/93/15 f 82/94/15 84/95/15 83/91/15 f 80/90/2 84/95/2 82/94/2 f 77/93/17 81/96/17 83/91/17 f 77/93/24 78/92/24 82/94/24 f 35/43/13 87/97/13 88/98/13 f 35/43/12 34/44/12 86/99/12 f 34/44/11 29/27/11 85/100/11 f 32/26/10 88/98/10 85/100/10 f 92/31/34 100/101/34 99/102/34 f 90/35/35 91/37/35 99/102/35 f 89/36/36 90/35/36 98/103/36 f 89/36/37 97/104/37 100/101/37 f 95/105/13 99/102/13 100/101/13 f 95/105/12 94/106/12 98/103/12 f 94/106/11 93/107/11 97/104/11 f 96/108/10 100/101/10 97/104/10 f 88/98/38 96/108/38 93/107/38 f 86/99/39 85/100/39 93/107/39 f 87/97/40 86/99/40 94/106/40 f 87/97/41 95/105/41 96/108/41 f 106/109/42 108/77/42 65/79/42 f 66/81/1 68/80/1 109/78/1 f 101/75/1 106/109/1 61/73/1 f 64/74/43 107/71/43 109/78/43 f 101/75/23 105/66/23 42/61/23 f 103/1/1 107/71/1 64/74/1 f 30/42/1 11/11/1 102/2/1 f 212/1/44 135/45/44 115/3/44 f 129/4/2 112/7/2 113/6/2 f 161/8/2 112/7/2 129/4/2 f 145/9/24 139/42/24 120/11/24 f 113/6/2 160/13/2 148/12/2 f 162/15/45 163/14/45 113/6/45 f 123/16/46 119/20/46 121/18/46 f 127/19/47 116/30/47 119/20/47 f 140/22/24 125/21/24 129/4/24 f 121/18/48 117/24/48 126/23/48 f 138/27/45 141/26/45 134/25/45 f 117/24/45 121/18/45 119/20/45 f 126/23/49 127/19/49 110/28/49 f 122/17/45 126/23/45 128/29/45 f 127/19/45 123/16/45 134/25/45 f 117/24/50 116/30/50 127/19/50 f 137/33/51 136/32/51 201/31/51 f 145/9/24 131/10/24 125/21/24 f 130/34/24 145/9/24 140/22/24 f 199/35/52 133/38/52 137/33/52 f 200/37/53 132/40/53 133/38/53 f 123/16/45 122/17/45 142/39/45 f 137/33/45 133/38/45 132/40/45 f 124/41/24 140/22/24 142/39/24 f 130/34/24 118/60/24 139/42/24 f 141/26/45 144/43/45 114/5/45 f 114/5/45 144/43/45 143/44/45 f 143/44/45 138/27/45 142/39/45 f 136/32/54 132/40/54 200/37/54 f 212/1/44 216/71/44 172/46/44 f 147/48/14 159/47/14 135/45/14 f 181/50/15 180/49/15 148/12/15 f 168/53/26 169/52/26 157/51/26 f 124/41/17 152/59/17 156/54/17 f 146/56/17 155/55/17 128/29/17 f 148/12/2 160/13/2 161/8/2 f 129/4/2 125/21/2 153/58/2 f 155/55/18 152/59/18 124/41/18 f 130/34/19 156/54/19 151/61/19 f 131/10/20 120/11/20 150/62/20 f 134/25/21 158/84/21 146/56/21 f 159/47/14 149/63/14 115/3/14 f 115/3/22 149/63/22 213/64/22 f 214/66/23 147/48/23 111/65/23 f 162/15/2 165/68/2 164/67/2 f 165/68/14 162/15/14 112/7/14 f 163/14/15 164/67/15 160/13/15 f 164/67/3 165/68/3 161/8/3 f 166/69/2 167/70/2 169/52/2 f 157/51/25 169/52/25 167/70/25 f 167/70/16 166/69/16 125/21/16 f 125/21/27 166/69/27 168/53/27 f 216/71/55 218/78/55 176/72/55 f 135/45/44 172/46/44 170/73/44 f 118/60/44 171/76/44 173/74/44 f 210/75/44 215/109/44 171/76/44 f 217/77/44 174/79/44 176/72/44 f 176/72/56 174/79/56 170/73/56 f 171/76/57 175/81/57 177/80/57 f 217/77/58 175/81/58 171/76/58 f 185/83/33 184/82/33 180/49/33 f 134/25/15 179/86/15 181/50/15 f 180/49/15 178/85/15 114/5/15 f 178/85/15 179/86/15 134/25/15 f 189/90/15 188/87/15 184/82/15 f 183/88/17 185/83/17 181/50/17 f 180/49/2 184/82/2 182/89/2 f 182/89/32 183/88/32 179/86/32 f 189/90/24 193/95/24 192/91/24 f 187/92/15 189/90/15 185/83/15 f 184/82/15 188/87/15 186/93/15 f 186/93/15 187/92/15 183/88/15 f 192/91/15 193/95/15 191/94/15 f 191/94/2 193/95/2 189/90/2 f 192/91/17 190/96/17 186/93/17 f 186/93/3 190/96/3 191/94/3 f 197/98/54 196/97/54 144/43/54 f 144/43/53 196/97/53 195/99/53 f 143/44/52 195/99/52 194/100/52 f 194/100/51 197/98/51 141/26/51 f 208/102/59 209/101/59 201/31/59 f 199/35/60 207/103/60 208/102/60 f 198/36/61 206/104/61 207/103/61 f 209/101/62 206/104/62 198/36/62 f 209/101/54 208/102/54 204/105/54 f 204/105/53 208/102/53 207/103/53 f 203/106/52 207/103/52 206/104/52 f 206/104/51 209/101/51 205/108/51 f 202/107/63 205/108/63 197/98/63 f 195/99/64 203/106/64 202/107/64 f 196/97/65 204/105/65 203/106/65 f 205/108/66 204/105/66 196/97/66 f 174/79/67 217/77/67 215/109/67 f 175/81/44 217/77/44 218/78/44 f 170/73/44 215/109/44 210/75/44 f 173/74/68 177/80/68 218/78/68 f 151/61/23 214/66/23 210/75/23 f 173/74/44 216/71/44 212/1/44 f 139/42/44 212/1/44 211/2/44 f 26/45/1 103/1/1 6/3/1 f 3/7/2 20/4/2 4/6/2 f 45/57/2 20/4/2 52/8/2 f 30/42/3 36/9/3 11/11/3 f 5/5/2 39/12/2 4/6/2 f 3/7/4 4/6/4 53/15/4 f 10/20/5 14/16/5 12/18/5 f 7/30/6 18/19/6 10/20/6 f 33/39/3 20/4/3 31/22/3 f 13/17/7 17/23/7 12/18/7 f 33/39/4 25/25/4 29/27/4 f 7/30/4 10/20/4 8/24/4 f 19/29/69 1/28/69 17/23/69 f 33/39/4 19/29/4 13/17/4 f 1/28/70 25/25/70 18/19/70 f 17/23/9 18/19/9 8/24/9 f 89/36/10 92/31/10 28/33/10 f 31/22/3 16/21/3 36/9/3 f 15/41/3 31/22/3 21/34/3 f 24/38/11 90/35/11 28/33/11 f 23/40/12 91/37/12 24/38/12 f 25/25/4 33/39/4 14/16/4 f 27/32/4 23/40/4 28/33/4 f 19/29/3 33/39/3 15/41/3 f 9/60/3 21/34/3 30/42/3 f 25/25/4 5/5/4 32/26/4 f 35/43/4 5/5/4 34/44/4 f 20/4/4 33/39/4 34/44/4 f 92/31/13 91/37/13 27/32/13 f 107/71/1 103/1/1 63/46/1 f 2/65/14 26/45/14 38/48/14 f 49/84/15 39/12/15 72/50/15 f 44/58/16 48/51/16 59/53/16 f 43/59/17 15/41/17 47/54/17 f 1/28/17 19/29/17 37/56/17 f 51/13/2 39/12/2 52/8/2 f 16/21/2 20/4/2 44/58/2 f 46/55/18 19/29/18 43/59/18 f 21/34/19 9/60/19 47/54/19 f 11/11/20 22/10/20 41/62/20 f 49/84/21 25/25/21 37/56/21 f 26/45/14 6/3/14 50/47/14 f 102/2/22 104/64/22 6/3/22 f 101/75/23 2/65/23 105/66/23 f 54/14/2 55/67/2 53/15/2 f 52/8/14 3/7/14 56/68/14 f 4/6/15 51/13/15 54/14/15 f 51/13/24 52/8/24 55/67/24 f 58/70/2 57/69/2 60/52/2 f 60/52/25 48/51/25 58/70/25 f 22/10/26 16/21/26 58/70/26 f 57/69/27 16/21/27 59/53/27 f 109/78/71 107/71/71 67/72/71 f 63/46/1 26/45/1 61/73/1 f 62/76/1 9/60/1 64/74/1 f 106/109/1 101/75/1 62/76/1 f 65/79/1 108/77/1 67/72/1 f 63/46/29 61/73/29 67/72/29 f 66/81/30 62/76/30 68/80/30 f 106/109/72 62/76/72 108/77/72 f 72/50/32 71/49/32 76/83/32 f 70/86/15 25/25/15 72/50/15 f 39/12/15 5/5/15 71/49/15 f 5/5/15 25/25/15 69/85/15 f 80/90/15 76/83/15 79/87/15 f 70/86/17 72/50/17 74/88/17 f 75/82/2 71/49/2 73/89/2 f 69/85/33 70/86/33 73/89/33 f 84/95/3 80/90/3 83/91/3 f 74/88/15 76/83/15 78/92/15 f 79/87/15 75/82/15 77/93/15 f 73/89/15 74/88/15 77/93/15 f 81/96/15 82/94/15 83/91/15 f 78/92/2 80/90/2 82/94/2 f 79/87/17 77/93/17 83/91/17 f 81/96/24 77/93/24 82/94/24 f 32/26/13 35/43/13 88/98/13 f 87/97/12 35/43/12 86/99/12 f 86/99/11 34/44/11 85/100/11 f 29/27/10 32/26/10 85/100/10 f 91/37/34 92/31/34 99/102/34 f 98/103/35 90/35/35 99/102/35 f 97/104/36 89/36/36 98/103/36 f 92/31/37 89/36/37 100/101/37 f 96/108/13 95/105/13 100/101/13 f 99/102/12 95/105/12 98/103/12 f 98/103/11 94/106/11 97/104/11 f 93/107/10 96/108/10 97/104/10 f 85/100/38 88/98/38 93/107/38 f 94/106/39 86/99/39 93/107/39 f 95/105/40 87/97/40 94/106/40 f 88/98/41 87/97/41 96/108/41 f 61/73/73 106/109/73 65/79/73 f 108/77/1 66/81/1 109/78/1 f 2/65/1 101/75/1 61/73/1 f 68/80/74 64/74/74 109/78/74 f 9/60/23 101/75/23 42/61/23 f 30/42/1 103/1/1 64/74/1 f 103/1/1 30/42/1 102/2/1 f 211/2/44 212/1/44 115/3/44 f 114/5/2 129/4/2 113/6/2 f 154/57/2 161/8/2 129/4/2 f 131/10/24 145/9/24 120/11/24 f 114/5/2 113/6/2 148/12/2 f 112/7/45 162/15/45 113/6/45 f 122/17/46 123/16/46 121/18/46 f 123/16/47 127/19/47 119/20/47 f 142/39/24 140/22/24 129/4/24 f 122/17/48 121/18/48 126/23/48 f 142/39/45 138/27/45 134/25/45 f 116/30/45 117/24/45 119/20/45 f 128/29/75 126/23/75 110/28/75 f 142/39/45 122/17/45 128/29/45 f 110/28/76 127/19/76 134/25/76 f 126/23/50 117/24/50 127/19/50 f 198/36/51 137/33/51 201/31/51 f 140/22/24 145/9/24 125/21/24 f 124/41/24 130/34/24 140/22/24 f 198/36/52 199/35/52 137/33/52 f 199/35/53 200/37/53 133/38/53 f 134/25/45 123/16/45 142/39/45 f 136/32/45 137/33/45 132/40/45 f 128/29/24 124/41/24 142/39/24 f 145/9/24 130/34/24 139/42/24 f 134/25/45 141/26/45 114/5/45 f 129/4/45 114/5/45 143/44/45 f 129/4/45 143/44/45 142/39/45 f 201/31/54 136/32/54 200/37/54 f 135/45/44 212/1/44 172/46/44 f 111/65/14 147/48/14 135/45/14 f 158/84/15 181/50/15 148/12/15 f 153/58/26 168/53/26 157/51/26 f 130/34/17 124/41/17 156/54/17 f 110/28/17 146/56/17 128/29/17 f 154/57/2 148/12/2 161/8/2 f 154/57/2 129/4/2 153/58/2 f 128/29/18 155/55/18 124/41/18 f 118/60/19 130/34/19 151/61/19 f 157/51/20 131/10/20 150/62/20 f 110/28/21 134/25/21 146/56/21 f 135/45/14 159/47/14 115/3/14 f 211/2/22 115/3/22 213/64/22 f 210/75/23 214/66/23 111/65/23 f 163/14/2 162/15/2 164/67/2 f 161/8/14 165/68/14 112/7/14 f 113/6/15 163/14/15 160/13/15 f 160/13/3 164/67/3 161/8/3 f 168/53/2 166/69/2 169/52/2 f 131/10/25 157/51/25 167/70/25 f 131/10/16 167/70/16 125/21/16 f 153/58/27 125/21/27 168/53/27 f 172/46/77 216/71/77 176/72/77 f 111/65/44 135/45/44 170/73/44 f 139/42/44 118/60/44 173/74/44 f 118/60/44 210/75/44 171/76/44 f 218/78/44 217/77/44 176/72/44 f 172/46/56 176/72/56 170/73/56 f 173/74/57 171/76/57 177/80/57 f 215/109/78 217/77/78 171/76/78 f 181/50/33 185/83/33 180/49/33 f 158/84/15 134/25/15 181/50/15 f 148/12/15 180/49/15 114/5/15 f 114/5/15 178/85/15 134/25/15 f 185/83/15 189/90/15 184/82/15 f 179/86/17 183/88/17 181/50/17 f 178/85/2 180/49/2 182/89/2 f 178/85/32 182/89/32 179/86/32 f 188/87/24 189/90/24 192/91/24 f 183/88/15 187/92/15 185/83/15 f 182/89/15 184/82/15 186/93/15 f 182/89/15 186/93/15 183/88/15 f 190/96/15 192/91/15 191/94/15 f 187/92/2 191/94/2 189/90/2 f 188/87/17 192/91/17 186/93/17 f 187/92/3 186/93/3 191/94/3 f 141/26/54 197/98/54 144/43/54 f 143/44/53 144/43/53 195/99/53 f 138/27/52 143/44/52 194/100/52 f 138/27/51 194/100/51 141/26/51 f 200/37/59 208/102/59 201/31/59 f 200/37/60 199/35/60 208/102/60 f 199/35/61 198/36/61 207/103/61 f 201/31/79 209/101/79 198/36/79 f 205/108/54 209/101/54 204/105/54 f 203/106/53 204/105/53 207/103/53 f 202/107/52 203/106/52 206/104/52 f 202/107/51 206/104/51 205/108/51 f 194/100/63 202/107/63 197/98/63 f 194/100/64 195/99/64 202/107/64 f 195/99/65 196/97/65 203/106/65 f 197/98/66 205/108/66 196/97/66 f 170/73/80 174/79/80 215/109/80 f 177/80/44 175/81/44 218/78/44 f 111/65/44 170/73/44 210/75/44 f 216/71/81 173/74/81 218/78/81 f 118/60/23 151/61/23 210/75/23 f 139/42/44 173/74/44 212/1/44 f 120/11/44 139/42/44 211/2/44 usemtl Material.003 f 41/62/82 104/64/82 102/2/82 f 211/2/82 213/64/82 150/62/82 f 11/11/82 41/62/82 102/2/82 f 120/11/82 211/2/82 150/62/82 tinyobjloader-2.0.0~rc5+dfsg1/models/missing_material_file.obj000066400000000000000000000043661364105447200245120ustar00rootroot00000000000000# cornell_box.obj and cornell_box.mtl are grabbed from Intel's embree project. # original cornell box data # comment # empty line including some space #mtllib no_material.mtl o floor usemtl white v 552.8 0.0 0.0 v 0.0 0.0 0.0 v 0.0 0.0 559.2 v 549.6 0.0 559.2 v 130.0 0.0 65.0 v 82.0 0.0 225.0 v 240.0 0.0 272.0 v 290.0 0.0 114.0 v 423.0 0.0 247.0 v 265.0 0.0 296.0 v 314.0 0.0 456.0 v 472.0 0.0 406.0 f 1 2 3 4 f 8 7 6 5 f 12 11 10 9 o light usemtl light v 343.0 548.0 227.0 v 343.0 548.0 332.0 v 213.0 548.0 332.0 v 213.0 548.0 227.0 f -4 -3 -2 -1 o ceiling usemtl white v 556.0 548.8 0.0 v 556.0 548.8 559.2 v 0.0 548.8 559.2 v 0.0 548.8 0.0 f -4 -3 -2 -1 o back_wall usemtl white v 549.6 0.0 559.2 v 0.0 0.0 559.2 v 0.0 548.8 559.2 v 556.0 548.8 559.2 f -4 -3 -2 -1 o front_wall usemtl blue v 549.6 0.0 0 v 0.0 0.0 0 v 0.0 548.8 0 v 556.0 548.8 0 #f -1 -2 -3 -4 o green_wall usemtl green v 0.0 0.0 559.2 v 0.0 0.0 0.0 v 0.0 548.8 0.0 v 0.0 548.8 559.2 f -4 -3 -2 -1 o red_wall usemtl red v 552.8 0.0 0.0 v 549.6 0.0 559.2 v 556.0 548.8 559.2 v 556.0 548.8 0.0 f -4 -3 -2 -1 o short_block usemtl white v 130.0 165.0 65.0 v 82.0 165.0 225.0 v 240.0 165.0 272.0 v 290.0 165.0 114.0 f -4 -3 -2 -1 v 290.0 0.0 114.0 v 290.0 165.0 114.0 v 240.0 165.0 272.0 v 240.0 0.0 272.0 f -4 -3 -2 -1 v 130.0 0.0 65.0 v 130.0 165.0 65.0 v 290.0 165.0 114.0 v 290.0 0.0 114.0 f -4 -3 -2 -1 v 82.0 0.0 225.0 v 82.0 165.0 225.0 v 130.0 165.0 65.0 v 130.0 0.0 65.0 f -4 -3 -2 -1 v 240.0 0.0 272.0 v 240.0 165.0 272.0 v 82.0 165.0 225.0 v 82.0 0.0 225.0 f -4 -3 -2 -1 o tall_block usemtl white v 423.0 330.0 247.0 v 265.0 330.0 296.0 v 314.0 330.0 456.0 v 472.0 330.0 406.0 f -4 -3 -2 -1 usemtl white v 423.0 0.0 247.0 v 423.0 330.0 247.0 v 472.0 330.0 406.0 v 472.0 0.0 406.0 f -4 -3 -2 -1 v 472.0 0.0 406.0 v 472.0 330.0 406.0 v 314.0 330.0 456.0 v 314.0 0.0 456.0 f -4 -3 -2 -1 v 314.0 0.0 456.0 v 314.0 330.0 456.0 v 265.0 330.0 296.0 v 265.0 0.0 296.0 f -4 -3 -2 -1 v 265.0 0.0 296.0 v 265.0 330.0 296.0 v 423.0 330.0 247.0 v 423.0 0.0 247.0 f -4 -3 -2 -1 tinyobjloader-2.0.0~rc5+dfsg1/models/mtllib-multiple-files-issue-112.mtl000066400000000000000000000000731364105447200260400ustar00rootroot00000000000000newmtl default Ka 0 0 0 Kd 0 0 0 Ks 0 0 0 map_Kd tmp.png tinyobjloader-2.0.0~rc5+dfsg1/models/mtllib-multiple-files-issue-112.obj000066400000000000000000000003161364105447200260160ustar00rootroot00000000000000mtllib invalid-file-aaa.mtl invalid-file-bbb.mtl mtllib-multiple-files-issue-112.mtl o Test v 1.864151 -1.219172 -5.532511 v 0.575869 -0.666304 5.896140 v 0.940448 1.000000 -1.971128 usemtl default f 1 2 3 tinyobjloader-2.0.0~rc5+dfsg1/models/no_material.obj000066400000000000000000000041361364105447200224510ustar00rootroot00000000000000# cornell_box.obj and cornell_box.mtl are grabbed from Intel's embree project. # original cornell box data # comment # empty line including some space o floor v 552.8 0.0 0.0 v 0.0 0.0 0.0 v 0.0 0.0 559.2 v 549.6 0.0 559.2 v 130.0 0.0 65.0 v 82.0 0.0 225.0 v 240.0 0.0 272.0 v 290.0 0.0 114.0 v 423.0 0.0 247.0 v 265.0 0.0 296.0 v 314.0 0.0 456.0 v 472.0 0.0 406.0 f 1 2 3 4 f 8 7 6 5 f 12 11 10 9 o light v 343.0 548.0 227.0 v 343.0 548.0 332.0 v 213.0 548.0 332.0 v 213.0 548.0 227.0 f -4 -3 -2 -1 o ceiling v 556.0 548.8 0.0 v 556.0 548.8 559.2 v 0.0 548.8 559.2 v 0.0 548.8 0.0 f -4 -3 -2 -1 o back_wall v 549.6 0.0 559.2 v 0.0 0.0 559.2 v 0.0 548.8 559.2 v 556.0 548.8 559.2 f -4 -3 -2 -1 o front_wall v 549.6 0.0 0 v 0.0 0.0 0 v 0.0 548.8 0 v 556.0 548.8 0 #f -1 -2 -3 -4 o green_wall v 0.0 0.0 559.2 v 0.0 0.0 0.0 v 0.0 548.8 0.0 v 0.0 548.8 559.2 f -4 -3 -2 -1 o red_wall v 552.8 0.0 0.0 v 549.6 0.0 559.2 v 556.0 548.8 559.2 v 556.0 548.8 0.0 f -4 -3 -2 -1 o short_block v 130.0 165.0 65.0 v 82.0 165.0 225.0 v 240.0 165.0 272.0 v 290.0 165.0 114.0 f -4 -3 -2 -1 v 290.0 0.0 114.0 v 290.0 165.0 114.0 v 240.0 165.0 272.0 v 240.0 0.0 272.0 f -4 -3 -2 -1 v 130.0 0.0 65.0 v 130.0 165.0 65.0 v 290.0 165.0 114.0 v 290.0 0.0 114.0 f -4 -3 -2 -1 v 82.0 0.0 225.0 v 82.0 165.0 225.0 v 130.0 165.0 65.0 v 130.0 0.0 65.0 f -4 -3 -2 -1 v 240.0 0.0 272.0 v 240.0 165.0 272.0 v 82.0 165.0 225.0 v 82.0 0.0 225.0 f -4 -3 -2 -1 o tall_block v 423.0 330.0 247.0 v 265.0 330.0 296.0 v 314.0 330.0 456.0 v 472.0 330.0 406.0 f -4 -3 -2 -1 v 423.0 0.0 247.0 v 423.0 330.0 247.0 v 472.0 330.0 406.0 v 472.0 0.0 406.0 f -4 -3 -2 -1 v 472.0 0.0 406.0 v 472.0 330.0 406.0 v 314.0 330.0 456.0 v 314.0 0.0 456.0 f -4 -3 -2 -1 v 314.0 0.0 456.0 v 314.0 330.0 456.0 v 265.0 330.0 296.0 v 265.0 0.0 296.0 f -4 -3 -2 -1 v 265.0 0.0 296.0 v 265.0 330.0 296.0 v 423.0 330.0 247.0 v 423.0 0.0 247.0 f -4 -3 -2 -1 tinyobjloader-2.0.0~rc5+dfsg1/models/norm-texopt.mtl000066400000000000000000000001231364105447200224650ustar00rootroot00000000000000newmtl default Ka 0 0 0 Kd 0 0 0 Ks 0 0 0 Kt 0.1 0.2 0.3 norm -bm 3 normalmap.jpg tinyobjloader-2.0.0~rc5+dfsg1/models/norm-texopt.obj000066400000000000000000000002201364105447200224410ustar00rootroot00000000000000mtllib norm-texopt.mtl o Test v 1.864151 -1.219172 -5.532511 v 0.575869 -0.666304 5.896140 v 0.940448 1.000000 -1.971128 usemtl default f 1 2 3 tinyobjloader-2.0.0~rc5+dfsg1/models/pbr-mat-ext.mtl000066400000000000000000000003531364105447200223360ustar00rootroot00000000000000# .MTL with PBR extension. newmtl pbr Ka 0 0 0 Kd 1 1 1 Ks 0 0 0 Ke 0.1 0.1 0.1 Pr 0.2 Pm 0.3 Ps 0.4 Pc 0.5 Pcr 0.6 aniso 0.7 anisor 0.8 map_Pr roughness.tex map_Pm metallic.tex map_Ps sheen.tex map_Ke emissive.tex norm normalmap.tex tinyobjloader-2.0.0~rc5+dfsg1/models/pbr-mat-ext.obj000066400000000000000000000001771364105447200223200ustar00rootroot00000000000000mtllib pbr-mat-ext.mtl o floor usemtl pbr v 552.8 0.0 0.0 v 0.0 0.0 0.0 v 0.0 0.0 559.2 v 549.6 0.0 559.2 f 1 2 3 4 tinyobjloader-2.0.0~rc5+dfsg1/models/points-prim.obj000066400000000000000000000004531364105447200224360ustar00rootroot00000000000000mtllib cube.mtl v 0.000000 2.000000 2.000000 v 0.000000 0.000000 2.000000 v 2.000000 0.000000 2.000000 v 2.000000 2.000000 2.000000 v 0.000000 2.000000 0.000000 v 0.000000 0.000000 0.000000 v 2.000000 0.000000 0.000000 v 2.000000 2.000000 0.000000 # 8 vertices g g0 usemtl white p 1 2 3 4 5 6 7 8 tinyobjloader-2.0.0~rc5+dfsg1/models/refl.mtl000066400000000000000000000003401364105447200211220ustar00rootroot00000000000000newmtl white Ka 0 0 0 Kd 1 1 1 Ks 0 0 0 refl reflection.tga newmtl red Ka 0 0 0 Kd 1 0 0 Ks 0 0 0 newmtl green Ka 0 0 0 Kd 0 1 0 Ks 0 0 0 newmtl blue Ka 0 0 0 Kd 0 0 1 Ks 0 0 0 newmtl light Ka 20 20 20 Kd 1 1 1 Ks 0 0 0 tinyobjloader-2.0.0~rc5+dfsg1/models/refl.obj000066400000000000000000000010301364105447200210750ustar00rootroot00000000000000# Test for `refl` material parameter mtllib refl.mtl v 0.000000 2.000000 2.000000 v 0.000000 0.000000 2.000000 v 2.000000 0.000000 2.000000 v 2.000000 2.000000 2.000000 v 0.000000 2.000000 0.000000 v 0.000000 0.000000 0.000000 v 2.000000 0.000000 0.000000 v 2.000000 2.000000 0.000000 # 8 vertices g front cube usemtl white f 1 2 3 4 g back cube # expects white material f 8 7 6 5 g right cube usemtl red f 4 3 7 8 g top cube usemtl white f 5 1 4 8 g left cube usemtl green f 5 6 2 1 g bottom cube usemtl white f 2 6 7 3 # 6 elements tinyobjloader-2.0.0~rc5+dfsg1/models/smoothing-group-two-squares.obj000066400000000000000000000007261364105447200256110ustar00rootroot00000000000000# from tinyobjloader issue #29 v 0.000000 2.000000 0.000000 v 0.000000 0.000000 0.000000 v 2.000000 0.000000 0.000000 v 2.000000 2.000000 0.000000 v 4.000000 0.000000 -3.255298 v 4.000000 2.000000 -3.255298 #vn 0.000000 0.000000 1.000000 #vn 0.000000 0.000000 1.000000 #vn 0.276597 0.000000 0.960986 #vn 0.276597 0.000000 0.960986 #vn 0.531611 0.000000 0.846988 #vn 0.531611 0.000000 0.846988 # 6 vertices # 6 normals g all s 1 f 1//1 2//2 3//3 4//4 f 4//4 3//3 5//5 tinyobjloader-2.0.0~rc5+dfsg1/models/smoothing-normal.mtl000066400000000000000000000003141364105447200234700ustar00rootroot00000000000000newmtl white Ka 0 0 0 Kd 1 1 1 Ks 0 0 0 newmtl red Ka 0 0 0 Kd 1 0 0 Ks 0 0 0 newmtl green Ka 0 0 0 Kd 0 1 0 Ks 0 0 0 newmtl blue Ka 0 0 0 Kd 0 0 1 Ks 0 0 0 newmtl light Ka 20 20 20 Kd 1 1 1 Ks 0 0 0 tinyobjloader-2.0.0~rc5+dfsg1/models/smoothing-normal.obj000066400000000000000000000010311364105447200234430ustar00rootroot00000000000000mtllib smoothing-normal.mtl v 0.000000 2.000000 2.000000 v 0.000000 0.000000 2.000000 v 2.000000 0.000000 2.000000 v 2.000000 2.000000 2.000000 v 0.000000 2.000000 0.000000 v 0.000000 0.000000 0.000000 v 2.000000 0.000000 0.000000 v 2.000000 2.000000 0.000000 # 8 vertices g front cube usemtl white s 1 f 1 2 3 4 #g bottom cube #usemtl white s 1 f 2 6 7 3 g back cube # expects white material s off f 8 7 6 5 #g right cube #usemtl red #f 4 3 7 8 #g top cube #usemtl white #f 5 1 4 8 #g left cube #usemtl green #f 5 6 2 1 # 6 elements tinyobjloader-2.0.0~rc5+dfsg1/models/test-nan.obj000066400000000000000000000043731364105447200217130ustar00rootroot00000000000000# cornell_box.obj and cornell_box.mtl are grabbed from Intel's embree project. # original cornell box data # comment # empty line including some space mtllib cornell_box.mtl o floor usemtl white v nan -nan nan v inf -inf inf v 1.#IND -1.#IND 1.#IND v 1.#INF -1.#INF 1.#INF v 130.0 0.0 65.0 v 82.0 0.0 225.0 v 240.0 0.0 272.0 v 290.0 0.0 114.0 v 423.0 0.0 247.0 v 265.0 0.0 296.0 v 314.0 0.0 456.0 v 472.0 0.0 406.0 f 1 2 3 4 f 8 7 6 5 f 12 11 10 9 o light usemtl light v 343.0 548.0 227.0 v 343.0 548.0 332.0 v 213.0 548.0 332.0 v 213.0 548.0 227.0 f -4 -3 -2 -1 o ceiling usemtl white v 556.0 548.8 0.0 v 556.0 548.8 559.2 v 0.0 548.8 559.2 v 0.0 548.8 0.0 f -4 -3 -2 -1 o back_wall usemtl white v 549.6 0.0 559.2 v 0.0 0.0 559.2 v 0.0 548.8 559.2 v 556.0 548.8 559.2 f -4 -3 -2 -1 o front_wall usemtl blue v 549.6 0.0 0 v 0.0 0.0 0 v 0.0 548.8 0 v 556.0 548.8 0 #f -1 -2 -3 -4 o green_wall usemtl green v 0.0 0.0 559.2 v 0.0 0.0 0.0 v 0.0 548.8 0.0 v 0.0 548.8 559.2 f -4 -3 -2 -1 o red_wall usemtl red v 552.8 0.0 0.0 v 549.6 0.0 559.2 v 556.0 548.8 559.2 v 556.0 548.8 0.0 f -4 -3 -2 -1 o short_block usemtl white v 130.0 165.0 65.0 v 82.0 165.0 225.0 v 240.0 165.0 272.0 v 290.0 165.0 114.0 f -4 -3 -2 -1 v 290.0 0.0 114.0 v 290.0 165.0 114.0 v 240.0 165.0 272.0 v 240.0 0.0 272.0 f -4 -3 -2 -1 v 130.0 0.0 65.0 v 130.0 165.0 65.0 v 290.0 165.0 114.0 v 290.0 0.0 114.0 f -4 -3 -2 -1 v 82.0 0.0 225.0 v 82.0 165.0 225.0 v 130.0 165.0 65.0 v 130.0 0.0 65.0 f -4 -3 -2 -1 v 240.0 0.0 272.0 v 240.0 165.0 272.0 v 82.0 165.0 225.0 v 82.0 0.0 225.0 f -4 -3 -2 -1 o tall_block usemtl white v 423.0 330.0 247.0 v 265.0 330.0 296.0 v 314.0 330.0 456.0 v 472.0 330.0 406.0 f -4 -3 -2 -1 usemtl white v 423.0 0.0 247.0 v 423.0 330.0 247.0 v 472.0 330.0 406.0 v 472.0 0.0 406.0 f -4 -3 -2 -1 v 472.0 0.0 406.0 v 472.0 330.0 406.0 v 314.0 330.0 456.0 v 314.0 0.0 456.0 f -4 -3 -2 -1 v 314.0 0.0 456.0 v 314.0 330.0 456.0 v 265.0 330.0 296.0 v 265.0 0.0 296.0 f -4 -3 -2 -1 v 265.0 0.0 296.0 v 265.0 330.0 296.0 v 423.0 330.0 247.0 v 423.0 0.0 247.0 f -4 -3 -2 -1 tinyobjloader-2.0.0~rc5+dfsg1/models/texture-filename-with-whitespace.mtl000066400000000000000000000005041364105447200265550ustar00rootroot00000000000000newmtl white Ka 0 0 0 Kd 1 1 1 Ks 0 0 0 # filename with white space. map_Kd texture 01.png newmtl red Ka 0 0 0 Kd 1 0 0 Ks 0 0 0 # texture option + filename with white space. bump -bm 2 bump 01.png newmtl green Ka 0 0 0 Kd 0 1 0 Ks 0 0 0 newmtl blue Ka 0 0 0 Kd 0 0 1 Ks 0 0 0 newmtl light Ka 20 20 20 Kd 1 1 1 Ks 0 0 0 tinyobjloader-2.0.0~rc5+dfsg1/models/texture-filename-with-whitespace.obj000066400000000000000000000010171364105447200265330ustar00rootroot00000000000000mtllib texture-filename-with-whitespace.mtl v 0.000000 2.000000 2.000000 v 0.000000 0.000000 2.000000 v 2.000000 0.000000 2.000000 v 2.000000 2.000000 2.000000 v 0.000000 2.000000 0.000000 v 0.000000 0.000000 0.000000 v 2.000000 0.000000 0.000000 v 2.000000 2.000000 0.000000 # 8 vertices g front cube usemtl white f 1 2 3 4 g back cube # expects white material f 8 7 6 5 g right cube usemtl red f 4 3 7 8 g top cube usemtl white f 5 1 4 8 g left cube usemtl green f 5 6 2 1 g bottom cube usemtl white f 2 6 7 3 # 6 elements tinyobjloader-2.0.0~rc5+dfsg1/models/texture-options-issue-85.mtl000066400000000000000000000013711364105447200247500ustar00rootroot00000000000000newmtl default Ka 0 0 0 Kd 0 0 0 Ks 0 0 0 Kt 0.1 0.2 0.3 map_Ka -clamp on ambient.jpg map_Kd -o 0.1 diffuse.jpg map_Ks -s 0.1 0.2 specular.jpg map_Ns -t 0.1 0.2 0.3 specular_highlight.jpg map_bump -bm 3 bumpmap.jpg newmtl bm2 Ka 0 0 0 Kd 0 0 0 Ks 0 0 0 Kt 0.1 0.2 0.3 # blendu map_Kd -blendu on diffuse.jpg map_Ks -blendv off specular.jpg map_Ns -mm 0.1 0.3 specular_highlight.jpg # -bm after filename map_bump -imfchan r bumpmap2.jpg -bm 1.5 newmtl bm3 Ka 0 0 0 Kd 0 0 0 Ks 0 0 0 Kt 0.1 0.2 0.3 # type map_Kd -type sphere diffuse.jpg map_Ks -type cube_top specular.jpg map_Ns -type cube_bottom specular_highlight.jpg map_Ka -type cube_left ambient.jpg map_d -type cube_right alpha.jpg map_bump -type cube_front bump.jpg disp -type cube_back displacement.jpg tinyobjloader-2.0.0~rc5+dfsg1/models/texture-options-issue-85.obj000066400000000000000000000002351364105447200247240ustar00rootroot00000000000000mtllib texture-options-issue-85.mtl o Test v 1.864151 -1.219172 -5.532511 v 0.575869 -0.666304 5.896140 v 0.940448 1.000000 -1.971128 usemtl default f 1 2 3 tinyobjloader-2.0.0~rc5+dfsg1/models/tr-and-d-issue-43.mtl000066400000000000000000000001731364105447200231560ustar00rootroot00000000000000newmtl Material.001 Ka 0 0 0 Kd 0 0 0 Ks 0 0 0 d 0.75 Tr 0.5 newmtl Material.002 Ka 0 0 0 Kd 0 0 0 Ks 0 0 0 Tr 0.5 d 0.75 tinyobjloader-2.0.0~rc5+dfsg1/models/tr-and-d-issue-43.obj000066400000000000000000000561571364105447200231510ustar00rootroot00000000000000# https://github.com/syoyo/tinyobjloader/issues/68 # Blender v2.73 (sub 0) OBJ File: 'enemy.blend' # www.blender.org mtllib tr-and-d-issue-43.mtl o Cube v 1.864151 -1.219172 -5.532511 v 0.575869 -0.666304 5.896140 v 0.940448 1.000000 -1.971128 v 1.620345 1.000000 -5.815706 v 1.864152 1.000000 -6.334323 v 0.575869 -0.129842 5.896143 v 5.440438 -1.462153 -5.818601 v 4.896782 -1.462153 -2.744413 v 1.000825 -0.677484 1.899605 v 5.440438 -1.246362 -5.818600 v 1.000825 0.852342 1.899608 v 4.896782 -1.246362 -2.744412 v 1.160660 -0.450871 -2.356325 v 1.704316 -0.450871 -5.430513 v 1.000825 -0.351920 -1.293797 v 1.000825 1.000000 -1.293794 v 1.160660 -0.877888 -2.356326 v 1.704316 -0.877888 -5.430514 v 1.000825 -1.219172 -1.452514 v 1.000825 1.000000 -1.452511 v 1.000825 -0.351920 1.759410 v 1.000825 1.000000 1.759413 v 9.097919 1.221145 -6.212147 v 8.356775 1.221145 -2.021231 v 1.864151 -0.109586 -6.334325 v 0.575869 -0.398073 5.896141 v 9.097919 0.943958 -6.212148 v 8.356775 0.943958 -2.021233 v 1.061916 0.113661 -1.797961 v 1.000825 0.161258 1.899606 v 1.000825 0.324040 -1.293795 v 1.803060 0.113661 -5.988876 v 1.000825 -0.109586 -1.452513 v 1.061916 0.776753 -1.797960 v 1.803061 0.776753 -5.988875 v 1.000825 0.324040 1.759412 v 0.000825 -1.219172 -5.532512 v 0.000825 -0.666304 5.896139 v 0.000826 1.000000 -6.334325 v 0.000825 -0.129842 5.896140 v 0.000825 0.852342 1.899606 v 0.000825 -0.677484 1.899604 v 0.000825 -0.351920 -1.293797 v 0.000825 1.000000 -1.293796 v 0.000825 1.000000 -1.452513 v 0.000825 -1.219172 -1.452515 v 0.000825 -0.351920 1.759409 v 0.000825 1.000000 1.759411 v 0.000826 -0.109586 -6.334326 v 0.000825 -0.398073 5.896140 v 0.152918 1.000000 -5.815708 v 0.152917 1.000000 -1.971130 v 0.940448 1.168419 -1.971128 v 1.620345 1.168419 -5.815706 v 0.152918 1.168419 -5.815708 v 0.152917 1.168419 -1.971130 v 0.921118 1.091883 -1.050430 v 0.921118 1.091883 1.516050 v 0.080533 1.091883 -1.050432 v 0.080533 1.091883 1.516048 v 0.613003 -0.553430 5.546911 v 0.963691 -0.559956 2.248834 v 0.613003 -0.396857 5.546912 v 0.963691 -0.070362 2.248835 v 1.499370 -0.994317 3.966028 v 1.850058 -0.997914 0.667950 v 1.499370 -0.908021 3.966029 v 1.850058 -0.728071 0.667951 v 1.601022 0.760960 -6.334324 v 1.601021 0.129454 -6.334325 v 0.263955 0.760960 -6.334325 v 0.263955 0.129454 -6.334325 v 1.334809 0.760960 -7.515329 v 1.334809 0.129455 -7.515330 v 0.530168 0.760960 -7.515330 v 0.530168 0.129455 -7.515330 v 1.192720 0.649445 -7.515329 v 1.192720 0.240971 -7.515330 v 0.672258 0.649445 -7.515330 v 0.672258 0.240971 -7.515330 v 1.192719 0.649444 -6.524630 v 1.192719 0.240970 -6.524631 v 0.672257 0.649444 -6.524631 v 0.672257 0.240970 -6.524631 v 3.851026 0.431116 -1.883326 v 3.851026 0.946662 -1.883325 v 4.592170 0.946662 -6.074241 v 4.592169 0.431116 -6.074242 v 4.995714 0.561404 -1.918362 v 4.995714 1.016394 -1.918360 v 5.736857 1.016394 -6.109276 v 5.736857 0.561404 -6.109277 v 3.975454 0.471731 -2.162156 v 3.975454 0.919244 -2.162155 v 4.618796 0.919244 -5.800034 v 4.618795 0.471730 -5.800035 v 4.969088 0.584825 -2.192568 v 4.969088 0.979775 -2.192567 v 5.612430 0.979775 -5.830446 v 5.612429 0.584825 -5.830447 v 0.864214 -0.673890 3.184381 v 0.864213 0.489129 3.184384 v 0.864213 -0.018552 3.184383 v 0.000825 0.489129 3.184382 v 0.000825 -0.673890 3.184381 v 0.850955 -0.557858 3.309075 v 0.850955 -0.175321 3.309076 v 1.737321 -0.996758 1.728192 v 1.737321 -0.785920 1.728193 v -1.864151 -1.219172 -5.532511 v -0.575869 -0.666304 5.896140 v -0.940448 1.000000 -1.971128 v -1.620345 1.000000 -5.815706 v -1.864152 1.000000 -6.334323 v -0.575869 -0.129842 5.896143 v -5.440438 -1.462153 -5.818601 v -4.896782 -1.462153 -2.744413 v -1.000825 -0.677484 1.899605 v -5.440438 -1.246362 -5.818600 v -1.000825 0.852342 1.899608 v -4.896782 -1.246362 -2.744412 v -1.160660 -0.450871 -2.356325 v -1.704316 -0.450871 -5.430513 v -1.000825 -0.351920 -1.293797 v -1.000825 1.000000 -1.293794 v -1.160660 -0.877888 -2.356326 v -1.704316 -0.877888 -5.430514 v -1.000825 -1.219172 -1.452514 v -1.000825 1.000000 -1.452511 v -1.000825 -0.351920 1.759410 v -1.000825 1.000000 1.759413 v -9.097919 1.221145 -6.212147 v -8.356775 1.221145 -2.021231 v -1.864151 -0.109586 -6.334325 v -0.575869 -0.398073 5.896141 v -9.097919 0.943958 -6.212148 v -8.356775 0.943958 -2.021233 v -1.061916 0.113661 -1.797961 v -1.000825 0.161258 1.899606 v -1.000825 0.324040 -1.293795 v -1.803060 0.113661 -5.988876 v -1.000825 -0.109586 -1.452513 v -1.061916 0.776753 -1.797960 v -1.803061 0.776753 -5.988875 v -1.000825 0.324040 1.759412 v -0.000825 -1.219172 -5.532512 v -0.000825 -0.666304 5.896139 v -0.000826 1.000000 -6.334325 v -0.000825 -0.129842 5.896140 v -0.000825 0.852342 1.899606 v -0.000825 -0.677484 1.899604 v -0.000825 -0.351920 -1.293797 v -0.000825 1.000000 -1.293796 v -0.000825 1.000000 -1.452513 v -0.000825 -1.219172 -1.452515 v -0.000825 -0.351920 1.759409 v -0.000825 1.000000 1.759411 v -0.000826 -0.109586 -6.334326 v -0.000825 -0.398073 5.896140 v -0.152918 1.000000 -5.815708 v -0.152917 1.000000 -1.971130 v -0.940448 1.168419 -1.971128 v -1.620345 1.168419 -5.815706 v -0.152918 1.168419 -5.815708 v -0.152917 1.168419 -1.971130 v -0.921118 1.091883 -1.050430 v -0.921118 1.091883 1.516050 v -0.080533 1.091883 -1.050432 v -0.080533 1.091883 1.516048 v -0.613003 -0.553430 5.546911 v -0.963691 -0.559956 2.248834 v -0.613003 -0.396857 5.546912 v -0.963691 -0.070362 2.248835 v -1.499370 -0.994317 3.966028 v -1.850058 -0.997914 0.667950 v -1.499370 -0.908021 3.966029 v -1.850058 -0.728071 0.667951 v -1.601022 0.760960 -6.334324 v -1.601021 0.129454 -6.334325 v -0.263955 0.760960 -6.334325 v -0.263955 0.129454 -6.334325 v -1.334809 0.760960 -7.515329 v -1.334809 0.129455 -7.515330 v -0.530168 0.760960 -7.515330 v -0.530168 0.129455 -7.515330 v -1.192720 0.649445 -7.515329 v -1.192720 0.240971 -7.515330 v -0.672258 0.649445 -7.515330 v -0.672258 0.240971 -7.515330 v -1.192719 0.649444 -6.524630 v -1.192719 0.240970 -6.524631 v -0.672257 0.649444 -6.524631 v -0.672257 0.240970 -6.524631 v -3.851026 0.431116 -1.883326 v -3.851026 0.946662 -1.883325 v -4.592170 0.946662 -6.074241 v -4.592169 0.431116 -6.074242 v -4.995714 0.561404 -1.918362 v -4.995714 1.016394 -1.918360 v -5.736857 1.016394 -6.109276 v -5.736857 0.561404 -6.109277 v -3.975454 0.471731 -2.162156 v -3.975454 0.919244 -2.162155 v -4.618796 0.919244 -5.800034 v -4.618795 0.471730 -5.800035 v -4.969088 0.584825 -2.192568 v -4.969088 0.979775 -2.192567 v -5.612430 0.979775 -5.830446 v -5.612429 0.584825 -5.830447 v -0.864214 -0.673890 3.184381 v -0.864213 0.489129 3.184384 v -0.864213 -0.018552 3.184383 v -0.000825 0.489129 3.184382 v -0.000825 -0.673890 3.184381 v -0.850955 -0.557858 3.309075 v -0.850955 -0.175321 3.309076 v -1.737321 -0.996758 1.728192 v -1.737321 -0.785920 1.728193 vt 0.135351 -0.558072 vt 0.003035 -0.363507 vt 0.092282 -0.976844 vt -0.081322 0.947351 vt 0.100058 1.958891 vt 0.050091 1.852185 vt -0.092752 1.055565 vt -0.251711 1.059474 vt 0.075587 0.041384 vt -0.086008 0.279003 vt -0.086212 0.249830 vt -0.276044 1.968137 vt -0.246101 1.859467 vt 0.009828 1.911388 vt -0.133014 1.114769 vt 0.413322 1.261595 vt 0.299103 0.624605 vt 1.243955 0.407183 vt 0.515404 1.111487 vt 1.358173 1.044173 vt -0.081553 0.914324 vt 0.080042 0.676706 vt 0.401185 0.474498 vt 1.295541 0.331328 vt 0.365315 1.568841 vt 0.299111 1.575740 vt 0.143401 0.707357 vt 0.629403 1.011947 vt 0.449192 0.167251 vt 1.409760 0.968317 vt 0.986264 1.738667 vt 1.573373 1.877873 vt 1.417663 1.009490 vt 0.237182 -0.196235 vt 0.721785 1.030226 vt 0.830554 0.870285 vt 0.877494 1.898608 vt 1.351399 1.106930 vt 0.183935 0.557301 vt 1.507109 1.975312 vt 0.241636 0.439088 vt 0.114297 -0.045011 vt 0.140593 1.808834 vt -0.015118 0.940452 vt 0.156405 -1.071134 vt 0.164119 -0.998223 vt 0.040336 -1.068281 vt 0.104459 -1.162571 vt -0.165787 1.882802 vt -0.014821 1.660811 vt -0.287852 0.283965 vt -0.293374 0.366508 vt -0.289630 0.900550 vt 0.035337 -0.191272 vt 0.247348 0.172213 vt 0.253300 1.021193 vt -0.283166 0.952313 vt -0.283398 0.919286 vt 0.039792 0.444050 vt 0.314806 -0.339851 vt 0.112962 -0.334889 vt -0.288056 0.254793 vt -0.023788 -0.973990 vt -0.155922 -0.359599 vt 0.220528 -1.165425 vt 0.108710 -0.748730 vt -0.286364 1.918670 vt -0.291973 1.118678 vt -0.119962 0.896379 vt -0.123707 0.362337 vt 0.162891 -0.598569 vt 0.467532 -0.853353 vt 0.201549 -1.053262 vt 0.161663 -0.198915 vt 0.267667 -0.752638 vt 0.278705 -0.371021 vt 0.526390 -0.542053 vt 0.483821 -0.479457 vt 0.488162 -0.883689 vt 0.500110 -0.105561 vt 0.564618 -0.200418 vt -0.110331 2.127229 vt 0.040636 1.905238 vt -0.010786 1.578087 vt 0.104092 1.876168 vt 0.255058 1.654176 vt -0.054992 2.087323 vt 0.203048 1.901245 vt 0.052081 2.123235 vt 0.042658 1.943733 vt -0.056437 1.881175 vt 0.147710 1.941151 vt 0.050060 2.084741 vt 0.146264 1.735002 vt 0.041212 1.737584 vt 0.048615 1.878591 vt 0.663065 1.872485 vt 0.786311 1.691257 vt 0.507355 1.004102 vt 0.630601 0.822874 vt 0.955144 1.689498 vt 0.860727 1.828333 vt 0.725565 1.074543 vt 0.819981 0.935708 vt 0.674594 1.805657 vt 0.539432 1.051867 vt 0.646413 0.894554 vt 0.781576 1.648344 vt 0.240127 -0.712141 vn 0.994400 0.000000 0.105700 vn 0.000000 1.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 0.984700 0.000000 0.174100 vn 0.211800 0.976600 0.037500 vn -0.103300 0.000000 -0.994600 vn 0.103300 -0.000000 0.994600 vn 0.911400 0.378700 0.161200 vn -0.157300 -0.987200 -0.027800 vn 0.113700 -0.993300 0.020100 vn 0.030600 -0.000000 0.999500 vn -0.061100 0.998100 -0.010800 vn -0.030600 0.000000 -0.999500 vn -0.000000 -0.000000 1.000000 vn 0.000000 0.000000 -1.000000 vn -0.755400 0.655300 0.000000 vn 0.000000 -1.000000 0.000000 vn -0.000000 -0.180000 0.983700 vn 0.000000 -0.395500 -0.918500 vn -0.000000 0.688500 0.725200 vn 0.000000 -0.585700 -0.810500 vn -0.000000 0.974900 0.222500 vn -0.000000 -1.000000 0.002800 vn -1.000000 0.000000 -0.000000 vn -0.000000 0.935500 0.353200 vn 0.755400 0.655300 0.000000 vn 0.000000 0.935500 -0.353200 vn 0.673800 0.724900 0.143400 vn 0.872300 -0.000000 0.489100 vn -0.872300 0.000000 -0.489100 vn -0.518300 -0.853500 -0.054200 vn -0.975500 0.000000 -0.219900 vn 0.975500 0.000000 -0.219900 vn -0.913200 0.000000 -0.407500 vn -0.436900 0.896200 -0.077300 vn -0.995300 -0.000000 0.096600 vn -0.297300 -0.953400 -0.052600 vn 0.473900 -0.876600 0.083800 vn 0.913200 0.000000 0.407500 vn 0.342200 0.937700 0.060500 vn 0.995300 -0.000000 -0.096600 vn -0.519200 -0.853000 -0.054300 vn 0.722400 0.676400 0.143800 vn -0.994400 0.000000 0.105700 vn -0.984700 0.000000 0.174100 vn -0.211800 0.976600 0.037500 vn 0.103300 0.000000 -0.994600 vn -0.103300 -0.000000 0.994600 vn -0.911400 0.378700 0.161200 vn 0.157300 -0.987200 -0.027800 vn -0.113700 -0.993300 0.020100 vn -0.030600 -0.000000 0.999500 vn 0.061100 0.998100 -0.010800 vn 0.030600 0.000000 -0.999500 vn -0.691900 0.713200 0.112500 vn -0.872300 -0.000000 0.489100 vn 0.872300 0.000000 -0.489100 vn 0.518300 -0.853500 -0.054200 vn 0.913200 0.000000 -0.407500 vn 0.436900 0.896200 -0.077300 vn 0.995300 0.000000 0.096600 vn 0.297300 -0.953300 -0.052600 vn -0.473900 -0.876600 0.083800 vn -0.913200 -0.000000 0.407500 vn -0.342200 0.937700 0.060500 vn -0.995300 -0.000000 -0.096600 vn 0.519200 -0.853000 -0.054300 vn -0.714800 0.690100 0.113700 vn 0.974400 0.089700 0.206200 vn 0.870400 0.288400 0.399100 vn 0.691900 0.713200 0.112500 vn -0.518000 -0.853700 -0.053400 vn -0.519700 -0.852700 -0.053600 vn 0.714800 0.690100 0.113700 vn -0.974400 0.089700 0.206200 vn -0.870400 0.288400 0.399100 vn -0.673800 0.724900 0.143400 vn 0.518000 -0.853700 -0.053400 vn 0.297300 -0.953400 -0.052600 vn 0.519700 -0.852700 -0.053600 vn -0.722400 0.676400 0.143800 vn -0.000000 0.962300 0.272000 usemtl Material.001 s off f 103/1/1 102/2/1 6/3/1 f 20/4/2 5/5/2 4/6/2 f 20/4/2 3/7/2 52/8/2 f 36/9/3 22/10/3 11/11/3 f 39/12/2 51/13/2 4/6/2 f 4/6/4 54/14/4 53/15/4 f 14/16/5 13/17/5 12/18/5 f 18/19/6 14/16/6 10/20/6 f 20/4/3 16/21/3 31/22/3 f 17/23/7 8/24/7 12/18/7 f 25/25/4 32/26/4 29/27/4 f 10/20/4 12/18/4 8/24/4 f 1/28/8 18/19/8 17/23/8 f 19/29/4 17/23/4 13/17/4 f 25/25/4 14/16/4 18/19/4 f 18/19/9 7/30/9 8/24/9 f 92/31/10 27/32/10 28/33/10 f 16/21/3 22/10/3 36/9/3 f 31/22/3 36/9/3 21/34/3 f 90/35/11 89/36/11 28/33/11 f 91/37/12 90/35/12 24/38/12 f 33/39/4 13/17/4 14/16/4 f 23/40/4 24/38/4 28/33/4 f 33/39/3 31/22/3 15/41/3 f 21/34/3 36/9/3 30/42/3 f 5/5/4 35/43/4 32/26/4 f 5/5/4 20/4/4 34/44/4 f 33/39/4 29/27/4 34/44/4 f 91/37/13 23/40/13 27/32/13 f 103/1/1 26/45/1 63/46/1 f 26/45/14 50/47/14 38/48/14 f 39/12/15 71/49/15 72/50/15 f 48/51/16 60/52/16 59/53/16 f 15/41/17 21/34/17 47/54/17 f 19/29/17 46/55/17 37/56/17 f 39/12/2 45/57/2 52/8/2 f 20/4/2 45/57/2 44/58/2 f 19/29/18 15/41/18 43/59/18 f 9/60/19 42/61/19 47/54/19 f 22/10/20 48/51/20 41/62/20 f 25/25/21 1/28/21 37/56/21 f 6/3/14 40/63/14 50/47/14 f 104/64/22 40/63/22 6/3/22 f 2/65/23 38/48/23 105/66/23 f 55/67/2 56/68/2 53/15/2 f 3/7/14 53/15/14 56/68/14 f 51/13/15 55/67/15 54/14/15 f 52/8/24 56/68/24 55/67/24 f 57/69/2 59/53/2 60/52/2 f 48/51/25 22/10/25 58/70/25 f 16/21/26 57/69/26 58/70/26 f 16/21/27 44/58/27 59/53/27 f 107/71/28 63/46/28 67/72/28 f 26/45/1 2/65/1 61/73/1 f 9/60/1 30/42/1 64/74/1 f 101/75/1 9/60/1 62/76/1 f 108/77/1 109/78/1 67/72/1 f 61/73/29 65/79/29 67/72/29 f 62/76/30 64/74/30 68/80/30 f 62/76/31 66/81/31 108/77/31 f 71/49/32 75/82/32 76/83/32 f 25/25/15 49/84/15 72/50/15 f 5/5/15 69/85/15 71/49/15 f 25/25/15 70/86/15 69/85/15 f 76/83/15 75/82/15 79/87/15 f 72/50/17 76/83/17 74/88/17 f 71/49/2 69/85/2 73/89/2 f 70/86/33 74/88/33 73/89/33 f 80/90/3 79/87/3 83/91/3 f 76/83/15 80/90/15 78/92/15 f 75/82/15 73/89/15 77/93/15 f 74/88/15 78/92/15 77/93/15 f 82/94/15 84/95/15 83/91/15 f 80/90/2 84/95/2 82/94/2 f 77/93/17 81/96/17 83/91/17 f 77/93/24 78/92/24 82/94/24 f 35/43/13 87/97/13 88/98/13 f 35/43/12 34/44/12 86/99/12 f 34/44/11 29/27/11 85/100/11 f 32/26/10 88/98/10 85/100/10 f 92/31/34 100/101/34 99/102/34 f 90/35/35 91/37/35 99/102/35 f 89/36/36 90/35/36 98/103/36 f 89/36/37 97/104/37 100/101/37 f 95/105/13 99/102/13 100/101/13 f 95/105/12 94/106/12 98/103/12 f 94/106/11 93/107/11 97/104/11 f 96/108/10 100/101/10 97/104/10 f 88/98/38 96/108/38 93/107/38 f 86/99/39 85/100/39 93/107/39 f 87/97/40 86/99/40 94/106/40 f 87/97/41 95/105/41 96/108/41 f 106/109/42 108/77/42 65/79/42 f 66/81/1 68/80/1 109/78/1 f 101/75/1 106/109/1 61/73/1 f 64/74/43 107/71/43 109/78/43 f 101/75/23 105/66/23 42/61/23 f 103/1/1 107/71/1 64/74/1 f 30/42/1 11/11/1 102/2/1 f 212/1/44 135/45/44 115/3/44 f 129/4/2 112/7/2 113/6/2 f 161/8/2 112/7/2 129/4/2 f 145/9/24 139/42/24 120/11/24 f 113/6/2 160/13/2 148/12/2 f 162/15/45 163/14/45 113/6/45 f 123/16/46 119/20/46 121/18/46 f 127/19/47 116/30/47 119/20/47 f 140/22/24 125/21/24 129/4/24 f 121/18/48 117/24/48 126/23/48 f 138/27/45 141/26/45 134/25/45 f 117/24/45 121/18/45 119/20/45 f 126/23/49 127/19/49 110/28/49 f 122/17/45 126/23/45 128/29/45 f 127/19/45 123/16/45 134/25/45 f 117/24/50 116/30/50 127/19/50 f 137/33/51 136/32/51 201/31/51 f 145/9/24 131/10/24 125/21/24 f 130/34/24 145/9/24 140/22/24 f 199/35/52 133/38/52 137/33/52 f 200/37/53 132/40/53 133/38/53 f 123/16/45 122/17/45 142/39/45 f 137/33/45 133/38/45 132/40/45 f 124/41/24 140/22/24 142/39/24 f 130/34/24 118/60/24 139/42/24 f 141/26/45 144/43/45 114/5/45 f 114/5/45 144/43/45 143/44/45 f 143/44/45 138/27/45 142/39/45 f 136/32/54 132/40/54 200/37/54 f 212/1/44 216/71/44 172/46/44 f 147/48/14 159/47/14 135/45/14 f 181/50/15 180/49/15 148/12/15 f 168/53/26 169/52/26 157/51/26 f 124/41/17 152/59/17 156/54/17 f 146/56/17 155/55/17 128/29/17 f 148/12/2 160/13/2 161/8/2 f 129/4/2 125/21/2 153/58/2 f 155/55/18 152/59/18 124/41/18 f 130/34/19 156/54/19 151/61/19 f 131/10/20 120/11/20 150/62/20 f 134/25/21 158/84/21 146/56/21 f 159/47/14 149/63/14 115/3/14 f 115/3/22 149/63/22 213/64/22 f 214/66/23 147/48/23 111/65/23 f 162/15/2 165/68/2 164/67/2 f 165/68/14 162/15/14 112/7/14 f 163/14/15 164/67/15 160/13/15 f 164/67/3 165/68/3 161/8/3 f 166/69/2 167/70/2 169/52/2 f 157/51/25 169/52/25 167/70/25 f 167/70/16 166/69/16 125/21/16 f 125/21/27 166/69/27 168/53/27 f 216/71/55 218/78/55 176/72/55 f 135/45/44 172/46/44 170/73/44 f 118/60/44 171/76/44 173/74/44 f 210/75/44 215/109/44 171/76/44 f 217/77/44 174/79/44 176/72/44 f 176/72/56 174/79/56 170/73/56 f 171/76/57 175/81/57 177/80/57 f 217/77/58 175/81/58 171/76/58 f 185/83/33 184/82/33 180/49/33 f 134/25/15 179/86/15 181/50/15 f 180/49/15 178/85/15 114/5/15 f 178/85/15 179/86/15 134/25/15 f 189/90/15 188/87/15 184/82/15 f 183/88/17 185/83/17 181/50/17 f 180/49/2 184/82/2 182/89/2 f 182/89/32 183/88/32 179/86/32 f 189/90/24 193/95/24 192/91/24 f 187/92/15 189/90/15 185/83/15 f 184/82/15 188/87/15 186/93/15 f 186/93/15 187/92/15 183/88/15 f 192/91/15 193/95/15 191/94/15 f 191/94/2 193/95/2 189/90/2 f 192/91/17 190/96/17 186/93/17 f 186/93/3 190/96/3 191/94/3 f 197/98/54 196/97/54 144/43/54 f 144/43/53 196/97/53 195/99/53 f 143/44/52 195/99/52 194/100/52 f 194/100/51 197/98/51 141/26/51 f 208/102/59 209/101/59 201/31/59 f 199/35/60 207/103/60 208/102/60 f 198/36/61 206/104/61 207/103/61 f 209/101/62 206/104/62 198/36/62 f 209/101/54 208/102/54 204/105/54 f 204/105/53 208/102/53 207/103/53 f 203/106/52 207/103/52 206/104/52 f 206/104/51 209/101/51 205/108/51 f 202/107/63 205/108/63 197/98/63 f 195/99/64 203/106/64 202/107/64 f 196/97/65 204/105/65 203/106/65 f 205/108/66 204/105/66 196/97/66 f 174/79/67 217/77/67 215/109/67 f 175/81/44 217/77/44 218/78/44 f 170/73/44 215/109/44 210/75/44 f 173/74/68 177/80/68 218/78/68 f 151/61/23 214/66/23 210/75/23 f 173/74/44 216/71/44 212/1/44 f 139/42/44 212/1/44 211/2/44 f 26/45/1 103/1/1 6/3/1 f 3/7/2 20/4/2 4/6/2 f 45/57/2 20/4/2 52/8/2 f 30/42/3 36/9/3 11/11/3 f 5/5/2 39/12/2 4/6/2 f 3/7/4 4/6/4 53/15/4 f 10/20/5 14/16/5 12/18/5 f 7/30/6 18/19/6 10/20/6 f 33/39/3 20/4/3 31/22/3 f 13/17/7 17/23/7 12/18/7 f 33/39/4 25/25/4 29/27/4 f 7/30/4 10/20/4 8/24/4 f 19/29/69 1/28/69 17/23/69 f 33/39/4 19/29/4 13/17/4 f 1/28/70 25/25/70 18/19/70 f 17/23/9 18/19/9 8/24/9 f 89/36/10 92/31/10 28/33/10 f 31/22/3 16/21/3 36/9/3 f 15/41/3 31/22/3 21/34/3 f 24/38/11 90/35/11 28/33/11 f 23/40/12 91/37/12 24/38/12 f 25/25/4 33/39/4 14/16/4 f 27/32/4 23/40/4 28/33/4 f 19/29/3 33/39/3 15/41/3 f 9/60/3 21/34/3 30/42/3 f 25/25/4 5/5/4 32/26/4 f 35/43/4 5/5/4 34/44/4 f 20/4/4 33/39/4 34/44/4 f 92/31/13 91/37/13 27/32/13 f 107/71/1 103/1/1 63/46/1 f 2/65/14 26/45/14 38/48/14 f 49/84/15 39/12/15 72/50/15 f 44/58/16 48/51/16 59/53/16 f 43/59/17 15/41/17 47/54/17 f 1/28/17 19/29/17 37/56/17 f 51/13/2 39/12/2 52/8/2 f 16/21/2 20/4/2 44/58/2 f 46/55/18 19/29/18 43/59/18 f 21/34/19 9/60/19 47/54/19 f 11/11/20 22/10/20 41/62/20 f 49/84/21 25/25/21 37/56/21 f 26/45/14 6/3/14 50/47/14 f 102/2/22 104/64/22 6/3/22 f 101/75/23 2/65/23 105/66/23 f 54/14/2 55/67/2 53/15/2 f 52/8/14 3/7/14 56/68/14 f 4/6/15 51/13/15 54/14/15 f 51/13/24 52/8/24 55/67/24 f 58/70/2 57/69/2 60/52/2 f 60/52/25 48/51/25 58/70/25 f 22/10/26 16/21/26 58/70/26 f 57/69/27 16/21/27 59/53/27 f 109/78/71 107/71/71 67/72/71 f 63/46/1 26/45/1 61/73/1 f 62/76/1 9/60/1 64/74/1 f 106/109/1 101/75/1 62/76/1 f 65/79/1 108/77/1 67/72/1 f 63/46/29 61/73/29 67/72/29 f 66/81/30 62/76/30 68/80/30 f 106/109/72 62/76/72 108/77/72 f 72/50/32 71/49/32 76/83/32 f 70/86/15 25/25/15 72/50/15 f 39/12/15 5/5/15 71/49/15 f 5/5/15 25/25/15 69/85/15 f 80/90/15 76/83/15 79/87/15 f 70/86/17 72/50/17 74/88/17 f 75/82/2 71/49/2 73/89/2 f 69/85/33 70/86/33 73/89/33 f 84/95/3 80/90/3 83/91/3 f 74/88/15 76/83/15 78/92/15 f 79/87/15 75/82/15 77/93/15 f 73/89/15 74/88/15 77/93/15 f 81/96/15 82/94/15 83/91/15 f 78/92/2 80/90/2 82/94/2 f 79/87/17 77/93/17 83/91/17 f 81/96/24 77/93/24 82/94/24 f 32/26/13 35/43/13 88/98/13 f 87/97/12 35/43/12 86/99/12 f 86/99/11 34/44/11 85/100/11 f 29/27/10 32/26/10 85/100/10 f 91/37/34 92/31/34 99/102/34 f 98/103/35 90/35/35 99/102/35 f 97/104/36 89/36/36 98/103/36 f 92/31/37 89/36/37 100/101/37 f 96/108/13 95/105/13 100/101/13 f 99/102/12 95/105/12 98/103/12 f 98/103/11 94/106/11 97/104/11 f 93/107/10 96/108/10 97/104/10 f 85/100/38 88/98/38 93/107/38 f 94/106/39 86/99/39 93/107/39 f 95/105/40 87/97/40 94/106/40 f 88/98/41 87/97/41 96/108/41 f 61/73/73 106/109/73 65/79/73 f 108/77/1 66/81/1 109/78/1 f 2/65/1 101/75/1 61/73/1 f 68/80/74 64/74/74 109/78/74 f 9/60/23 101/75/23 42/61/23 f 30/42/1 103/1/1 64/74/1 f 103/1/1 30/42/1 102/2/1 f 211/2/44 212/1/44 115/3/44 f 114/5/2 129/4/2 113/6/2 f 154/57/2 161/8/2 129/4/2 f 131/10/24 145/9/24 120/11/24 f 114/5/2 113/6/2 148/12/2 f 112/7/45 162/15/45 113/6/45 f 122/17/46 123/16/46 121/18/46 f 123/16/47 127/19/47 119/20/47 f 142/39/24 140/22/24 129/4/24 f 122/17/48 121/18/48 126/23/48 f 142/39/45 138/27/45 134/25/45 f 116/30/45 117/24/45 119/20/45 f 128/29/75 126/23/75 110/28/75 f 142/39/45 122/17/45 128/29/45 f 110/28/76 127/19/76 134/25/76 f 126/23/50 117/24/50 127/19/50 f 198/36/51 137/33/51 201/31/51 f 140/22/24 145/9/24 125/21/24 f 124/41/24 130/34/24 140/22/24 f 198/36/52 199/35/52 137/33/52 f 199/35/53 200/37/53 133/38/53 f 134/25/45 123/16/45 142/39/45 f 136/32/45 137/33/45 132/40/45 f 128/29/24 124/41/24 142/39/24 f 145/9/24 130/34/24 139/42/24 f 134/25/45 141/26/45 114/5/45 f 129/4/45 114/5/45 143/44/45 f 129/4/45 143/44/45 142/39/45 f 201/31/54 136/32/54 200/37/54 f 135/45/44 212/1/44 172/46/44 f 111/65/14 147/48/14 135/45/14 f 158/84/15 181/50/15 148/12/15 f 153/58/26 168/53/26 157/51/26 f 130/34/17 124/41/17 156/54/17 f 110/28/17 146/56/17 128/29/17 f 154/57/2 148/12/2 161/8/2 f 154/57/2 129/4/2 153/58/2 f 128/29/18 155/55/18 124/41/18 f 118/60/19 130/34/19 151/61/19 f 157/51/20 131/10/20 150/62/20 f 110/28/21 134/25/21 146/56/21 f 135/45/14 159/47/14 115/3/14 f 211/2/22 115/3/22 213/64/22 f 210/75/23 214/66/23 111/65/23 f 163/14/2 162/15/2 164/67/2 f 161/8/14 165/68/14 112/7/14 f 113/6/15 163/14/15 160/13/15 f 160/13/3 164/67/3 161/8/3 f 168/53/2 166/69/2 169/52/2 f 131/10/25 157/51/25 167/70/25 f 131/10/16 167/70/16 125/21/16 f 153/58/27 125/21/27 168/53/27 f 172/46/77 216/71/77 176/72/77 f 111/65/44 135/45/44 170/73/44 f 139/42/44 118/60/44 173/74/44 f 118/60/44 210/75/44 171/76/44 f 218/78/44 217/77/44 176/72/44 f 172/46/56 176/72/56 170/73/56 f 173/74/57 171/76/57 177/80/57 f 215/109/78 217/77/78 171/76/78 f 181/50/33 185/83/33 180/49/33 f 158/84/15 134/25/15 181/50/15 f 148/12/15 180/49/15 114/5/15 f 114/5/15 178/85/15 134/25/15 f 185/83/15 189/90/15 184/82/15 f 179/86/17 183/88/17 181/50/17 f 178/85/2 180/49/2 182/89/2 f 178/85/32 182/89/32 179/86/32 f 188/87/24 189/90/24 192/91/24 f 183/88/15 187/92/15 185/83/15 f 182/89/15 184/82/15 186/93/15 f 182/89/15 186/93/15 183/88/15 f 190/96/15 192/91/15 191/94/15 f 187/92/2 191/94/2 189/90/2 f 188/87/17 192/91/17 186/93/17 f 187/92/3 186/93/3 191/94/3 f 141/26/54 197/98/54 144/43/54 f 143/44/53 144/43/53 195/99/53 f 138/27/52 143/44/52 194/100/52 f 138/27/51 194/100/51 141/26/51 f 200/37/59 208/102/59 201/31/59 f 200/37/60 199/35/60 208/102/60 f 199/35/61 198/36/61 207/103/61 f 201/31/79 209/101/79 198/36/79 f 205/108/54 209/101/54 204/105/54 f 203/106/53 204/105/53 207/103/53 f 202/107/52 203/106/52 206/104/52 f 202/107/51 206/104/51 205/108/51 f 194/100/63 202/107/63 197/98/63 f 194/100/64 195/99/64 202/107/64 f 195/99/65 196/97/65 203/106/65 f 197/98/66 205/108/66 196/97/66 f 170/73/80 174/79/80 215/109/80 f 177/80/44 175/81/44 218/78/44 f 111/65/44 170/73/44 210/75/44 f 216/71/81 173/74/81 218/78/81 f 118/60/23 151/61/23 210/75/23 f 139/42/44 173/74/44 212/1/44 f 120/11/44 139/42/44 211/2/44 usemtl Material.002 f 41/62/82 104/64/82 102/2/82 f 211/2/82 213/64/82 150/62/82 f 11/11/82 41/62/82 102/2/82 f 120/11/82 211/2/82 150/62/82 tinyobjloader-2.0.0~rc5+dfsg1/models/usemtl-issue-104.obj000066400000000000000000000007121364105447200231140ustar00rootroot00000000000000# cornell_box.obj and cornell_box.mtl are grabbed from Intel's embree project. # original cornell box data # comment # empty line including some space mtllib cornell_box.mtl o floor v 552.8 0.0 0.0 v 0.0 0.0 0.0 v 0.0 0.0 559.2 v 549.6 0.0 559.2 v 130.0 0.0 65.0 v 82.0 0.0 225.0 v 240.0 0.0 272.0 v 290.0 0.0 114.0 v 423.0 0.0 247.0 v 265.0 0.0 296.0 v 314.0 0.0 456.0 v 472.0 0.0 406.0 f 1 2 3 4 f 8 7 6 5 f 12 11 10 9 usemtl white tinyobjloader-2.0.0~rc5+dfsg1/models/usemtl-issue-68.mtl000066400000000000000000000001371364105447200230700ustar00rootroot00000000000000newmtl Material.001 Ka 0 0 0 Kd 0 0 0 Ks 0 0 0 newmtl Material.003 Ka 0 0 0 Kd 1 1 1 Ks 0 0 0 tinyobjloader-2.0.0~rc5+dfsg1/models/usemtl-issue-68.obj000066400000000000000000000561551364105447200230610ustar00rootroot00000000000000# https://github.com/syoyo/tinyobjloader/issues/68 # Blender v2.73 (sub 0) OBJ File: 'enemy.blend' # www.blender.org mtllib usemtl-issue-68.mtl o Cube v 1.864151 -1.219172 -5.532511 v 0.575869 -0.666304 5.896140 v 0.940448 1.000000 -1.971128 v 1.620345 1.000000 -5.815706 v 1.864152 1.000000 -6.334323 v 0.575869 -0.129842 5.896143 v 5.440438 -1.462153 -5.818601 v 4.896782 -1.462153 -2.744413 v 1.000825 -0.677484 1.899605 v 5.440438 -1.246362 -5.818600 v 1.000825 0.852342 1.899608 v 4.896782 -1.246362 -2.744412 v 1.160660 -0.450871 -2.356325 v 1.704316 -0.450871 -5.430513 v 1.000825 -0.351920 -1.293797 v 1.000825 1.000000 -1.293794 v 1.160660 -0.877888 -2.356326 v 1.704316 -0.877888 -5.430514 v 1.000825 -1.219172 -1.452514 v 1.000825 1.000000 -1.452511 v 1.000825 -0.351920 1.759410 v 1.000825 1.000000 1.759413 v 9.097919 1.221145 -6.212147 v 8.356775 1.221145 -2.021231 v 1.864151 -0.109586 -6.334325 v 0.575869 -0.398073 5.896141 v 9.097919 0.943958 -6.212148 v 8.356775 0.943958 -2.021233 v 1.061916 0.113661 -1.797961 v 1.000825 0.161258 1.899606 v 1.000825 0.324040 -1.293795 v 1.803060 0.113661 -5.988876 v 1.000825 -0.109586 -1.452513 v 1.061916 0.776753 -1.797960 v 1.803061 0.776753 -5.988875 v 1.000825 0.324040 1.759412 v 0.000825 -1.219172 -5.532512 v 0.000825 -0.666304 5.896139 v 0.000826 1.000000 -6.334325 v 0.000825 -0.129842 5.896140 v 0.000825 0.852342 1.899606 v 0.000825 -0.677484 1.899604 v 0.000825 -0.351920 -1.293797 v 0.000825 1.000000 -1.293796 v 0.000825 1.000000 -1.452513 v 0.000825 -1.219172 -1.452515 v 0.000825 -0.351920 1.759409 v 0.000825 1.000000 1.759411 v 0.000826 -0.109586 -6.334326 v 0.000825 -0.398073 5.896140 v 0.152918 1.000000 -5.815708 v 0.152917 1.000000 -1.971130 v 0.940448 1.168419 -1.971128 v 1.620345 1.168419 -5.815706 v 0.152918 1.168419 -5.815708 v 0.152917 1.168419 -1.971130 v 0.921118 1.091883 -1.050430 v 0.921118 1.091883 1.516050 v 0.080533 1.091883 -1.050432 v 0.080533 1.091883 1.516048 v 0.613003 -0.553430 5.546911 v 0.963691 -0.559956 2.248834 v 0.613003 -0.396857 5.546912 v 0.963691 -0.070362 2.248835 v 1.499370 -0.994317 3.966028 v 1.850058 -0.997914 0.667950 v 1.499370 -0.908021 3.966029 v 1.850058 -0.728071 0.667951 v 1.601022 0.760960 -6.334324 v 1.601021 0.129454 -6.334325 v 0.263955 0.760960 -6.334325 v 0.263955 0.129454 -6.334325 v 1.334809 0.760960 -7.515329 v 1.334809 0.129455 -7.515330 v 0.530168 0.760960 -7.515330 v 0.530168 0.129455 -7.515330 v 1.192720 0.649445 -7.515329 v 1.192720 0.240971 -7.515330 v 0.672258 0.649445 -7.515330 v 0.672258 0.240971 -7.515330 v 1.192719 0.649444 -6.524630 v 1.192719 0.240970 -6.524631 v 0.672257 0.649444 -6.524631 v 0.672257 0.240970 -6.524631 v 3.851026 0.431116 -1.883326 v 3.851026 0.946662 -1.883325 v 4.592170 0.946662 -6.074241 v 4.592169 0.431116 -6.074242 v 4.995714 0.561404 -1.918362 v 4.995714 1.016394 -1.918360 v 5.736857 1.016394 -6.109276 v 5.736857 0.561404 -6.109277 v 3.975454 0.471731 -2.162156 v 3.975454 0.919244 -2.162155 v 4.618796 0.919244 -5.800034 v 4.618795 0.471730 -5.800035 v 4.969088 0.584825 -2.192568 v 4.969088 0.979775 -2.192567 v 5.612430 0.979775 -5.830446 v 5.612429 0.584825 -5.830447 v 0.864214 -0.673890 3.184381 v 0.864213 0.489129 3.184384 v 0.864213 -0.018552 3.184383 v 0.000825 0.489129 3.184382 v 0.000825 -0.673890 3.184381 v 0.850955 -0.557858 3.309075 v 0.850955 -0.175321 3.309076 v 1.737321 -0.996758 1.728192 v 1.737321 -0.785920 1.728193 v -1.864151 -1.219172 -5.532511 v -0.575869 -0.666304 5.896140 v -0.940448 1.000000 -1.971128 v -1.620345 1.000000 -5.815706 v -1.864152 1.000000 -6.334323 v -0.575869 -0.129842 5.896143 v -5.440438 -1.462153 -5.818601 v -4.896782 -1.462153 -2.744413 v -1.000825 -0.677484 1.899605 v -5.440438 -1.246362 -5.818600 v -1.000825 0.852342 1.899608 v -4.896782 -1.246362 -2.744412 v -1.160660 -0.450871 -2.356325 v -1.704316 -0.450871 -5.430513 v -1.000825 -0.351920 -1.293797 v -1.000825 1.000000 -1.293794 v -1.160660 -0.877888 -2.356326 v -1.704316 -0.877888 -5.430514 v -1.000825 -1.219172 -1.452514 v -1.000825 1.000000 -1.452511 v -1.000825 -0.351920 1.759410 v -1.000825 1.000000 1.759413 v -9.097919 1.221145 -6.212147 v -8.356775 1.221145 -2.021231 v -1.864151 -0.109586 -6.334325 v -0.575869 -0.398073 5.896141 v -9.097919 0.943958 -6.212148 v -8.356775 0.943958 -2.021233 v -1.061916 0.113661 -1.797961 v -1.000825 0.161258 1.899606 v -1.000825 0.324040 -1.293795 v -1.803060 0.113661 -5.988876 v -1.000825 -0.109586 -1.452513 v -1.061916 0.776753 -1.797960 v -1.803061 0.776753 -5.988875 v -1.000825 0.324040 1.759412 v -0.000825 -1.219172 -5.532512 v -0.000825 -0.666304 5.896139 v -0.000826 1.000000 -6.334325 v -0.000825 -0.129842 5.896140 v -0.000825 0.852342 1.899606 v -0.000825 -0.677484 1.899604 v -0.000825 -0.351920 -1.293797 v -0.000825 1.000000 -1.293796 v -0.000825 1.000000 -1.452513 v -0.000825 -1.219172 -1.452515 v -0.000825 -0.351920 1.759409 v -0.000825 1.000000 1.759411 v -0.000826 -0.109586 -6.334326 v -0.000825 -0.398073 5.896140 v -0.152918 1.000000 -5.815708 v -0.152917 1.000000 -1.971130 v -0.940448 1.168419 -1.971128 v -1.620345 1.168419 -5.815706 v -0.152918 1.168419 -5.815708 v -0.152917 1.168419 -1.971130 v -0.921118 1.091883 -1.050430 v -0.921118 1.091883 1.516050 v -0.080533 1.091883 -1.050432 v -0.080533 1.091883 1.516048 v -0.613003 -0.553430 5.546911 v -0.963691 -0.559956 2.248834 v -0.613003 -0.396857 5.546912 v -0.963691 -0.070362 2.248835 v -1.499370 -0.994317 3.966028 v -1.850058 -0.997914 0.667950 v -1.499370 -0.908021 3.966029 v -1.850058 -0.728071 0.667951 v -1.601022 0.760960 -6.334324 v -1.601021 0.129454 -6.334325 v -0.263955 0.760960 -6.334325 v -0.263955 0.129454 -6.334325 v -1.334809 0.760960 -7.515329 v -1.334809 0.129455 -7.515330 v -0.530168 0.760960 -7.515330 v -0.530168 0.129455 -7.515330 v -1.192720 0.649445 -7.515329 v -1.192720 0.240971 -7.515330 v -0.672258 0.649445 -7.515330 v -0.672258 0.240971 -7.515330 v -1.192719 0.649444 -6.524630 v -1.192719 0.240970 -6.524631 v -0.672257 0.649444 -6.524631 v -0.672257 0.240970 -6.524631 v -3.851026 0.431116 -1.883326 v -3.851026 0.946662 -1.883325 v -4.592170 0.946662 -6.074241 v -4.592169 0.431116 -6.074242 v -4.995714 0.561404 -1.918362 v -4.995714 1.016394 -1.918360 v -5.736857 1.016394 -6.109276 v -5.736857 0.561404 -6.109277 v -3.975454 0.471731 -2.162156 v -3.975454 0.919244 -2.162155 v -4.618796 0.919244 -5.800034 v -4.618795 0.471730 -5.800035 v -4.969088 0.584825 -2.192568 v -4.969088 0.979775 -2.192567 v -5.612430 0.979775 -5.830446 v -5.612429 0.584825 -5.830447 v -0.864214 -0.673890 3.184381 v -0.864213 0.489129 3.184384 v -0.864213 -0.018552 3.184383 v -0.000825 0.489129 3.184382 v -0.000825 -0.673890 3.184381 v -0.850955 -0.557858 3.309075 v -0.850955 -0.175321 3.309076 v -1.737321 -0.996758 1.728192 v -1.737321 -0.785920 1.728193 vt 0.135351 -0.558072 vt 0.003035 -0.363507 vt 0.092282 -0.976844 vt -0.081322 0.947351 vt 0.100058 1.958891 vt 0.050091 1.852185 vt -0.092752 1.055565 vt -0.251711 1.059474 vt 0.075587 0.041384 vt -0.086008 0.279003 vt -0.086212 0.249830 vt -0.276044 1.968137 vt -0.246101 1.859467 vt 0.009828 1.911388 vt -0.133014 1.114769 vt 0.413322 1.261595 vt 0.299103 0.624605 vt 1.243955 0.407183 vt 0.515404 1.111487 vt 1.358173 1.044173 vt -0.081553 0.914324 vt 0.080042 0.676706 vt 0.401185 0.474498 vt 1.295541 0.331328 vt 0.365315 1.568841 vt 0.299111 1.575740 vt 0.143401 0.707357 vt 0.629403 1.011947 vt 0.449192 0.167251 vt 1.409760 0.968317 vt 0.986264 1.738667 vt 1.573373 1.877873 vt 1.417663 1.009490 vt 0.237182 -0.196235 vt 0.721785 1.030226 vt 0.830554 0.870285 vt 0.877494 1.898608 vt 1.351399 1.106930 vt 0.183935 0.557301 vt 1.507109 1.975312 vt 0.241636 0.439088 vt 0.114297 -0.045011 vt 0.140593 1.808834 vt -0.015118 0.940452 vt 0.156405 -1.071134 vt 0.164119 -0.998223 vt 0.040336 -1.068281 vt 0.104459 -1.162571 vt -0.165787 1.882802 vt -0.014821 1.660811 vt -0.287852 0.283965 vt -0.293374 0.366508 vt -0.289630 0.900550 vt 0.035337 -0.191272 vt 0.247348 0.172213 vt 0.253300 1.021193 vt -0.283166 0.952313 vt -0.283398 0.919286 vt 0.039792 0.444050 vt 0.314806 -0.339851 vt 0.112962 -0.334889 vt -0.288056 0.254793 vt -0.023788 -0.973990 vt -0.155922 -0.359599 vt 0.220528 -1.165425 vt 0.108710 -0.748730 vt -0.286364 1.918670 vt -0.291973 1.118678 vt -0.119962 0.896379 vt -0.123707 0.362337 vt 0.162891 -0.598569 vt 0.467532 -0.853353 vt 0.201549 -1.053262 vt 0.161663 -0.198915 vt 0.267667 -0.752638 vt 0.278705 -0.371021 vt 0.526390 -0.542053 vt 0.483821 -0.479457 vt 0.488162 -0.883689 vt 0.500110 -0.105561 vt 0.564618 -0.200418 vt -0.110331 2.127229 vt 0.040636 1.905238 vt -0.010786 1.578087 vt 0.104092 1.876168 vt 0.255058 1.654176 vt -0.054992 2.087323 vt 0.203048 1.901245 vt 0.052081 2.123235 vt 0.042658 1.943733 vt -0.056437 1.881175 vt 0.147710 1.941151 vt 0.050060 2.084741 vt 0.146264 1.735002 vt 0.041212 1.737584 vt 0.048615 1.878591 vt 0.663065 1.872485 vt 0.786311 1.691257 vt 0.507355 1.004102 vt 0.630601 0.822874 vt 0.955144 1.689498 vt 0.860727 1.828333 vt 0.725565 1.074543 vt 0.819981 0.935708 vt 0.674594 1.805657 vt 0.539432 1.051867 vt 0.646413 0.894554 vt 0.781576 1.648344 vt 0.240127 -0.712141 vn 0.994400 0.000000 0.105700 vn 0.000000 1.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 0.984700 0.000000 0.174100 vn 0.211800 0.976600 0.037500 vn -0.103300 0.000000 -0.994600 vn 0.103300 -0.000000 0.994600 vn 0.911400 0.378700 0.161200 vn -0.157300 -0.987200 -0.027800 vn 0.113700 -0.993300 0.020100 vn 0.030600 -0.000000 0.999500 vn -0.061100 0.998100 -0.010800 vn -0.030600 0.000000 -0.999500 vn -0.000000 -0.000000 1.000000 vn 0.000000 0.000000 -1.000000 vn -0.755400 0.655300 0.000000 vn 0.000000 -1.000000 0.000000 vn -0.000000 -0.180000 0.983700 vn 0.000000 -0.395500 -0.918500 vn -0.000000 0.688500 0.725200 vn 0.000000 -0.585700 -0.810500 vn -0.000000 0.974900 0.222500 vn -0.000000 -1.000000 0.002800 vn -1.000000 0.000000 -0.000000 vn -0.000000 0.935500 0.353200 vn 0.755400 0.655300 0.000000 vn 0.000000 0.935500 -0.353200 vn 0.673800 0.724900 0.143400 vn 0.872300 -0.000000 0.489100 vn -0.872300 0.000000 -0.489100 vn -0.518300 -0.853500 -0.054200 vn -0.975500 0.000000 -0.219900 vn 0.975500 0.000000 -0.219900 vn -0.913200 0.000000 -0.407500 vn -0.436900 0.896200 -0.077300 vn -0.995300 -0.000000 0.096600 vn -0.297300 -0.953400 -0.052600 vn 0.473900 -0.876600 0.083800 vn 0.913200 0.000000 0.407500 vn 0.342200 0.937700 0.060500 vn 0.995300 -0.000000 -0.096600 vn -0.519200 -0.853000 -0.054300 vn 0.722400 0.676400 0.143800 vn -0.994400 0.000000 0.105700 vn -0.984700 0.000000 0.174100 vn -0.211800 0.976600 0.037500 vn 0.103300 0.000000 -0.994600 vn -0.103300 -0.000000 0.994600 vn -0.911400 0.378700 0.161200 vn 0.157300 -0.987200 -0.027800 vn -0.113700 -0.993300 0.020100 vn -0.030600 -0.000000 0.999500 vn 0.061100 0.998100 -0.010800 vn 0.030600 0.000000 -0.999500 vn -0.691900 0.713200 0.112500 vn -0.872300 -0.000000 0.489100 vn 0.872300 0.000000 -0.489100 vn 0.518300 -0.853500 -0.054200 vn 0.913200 0.000000 -0.407500 vn 0.436900 0.896200 -0.077300 vn 0.995300 0.000000 0.096600 vn 0.297300 -0.953300 -0.052600 vn -0.473900 -0.876600 0.083800 vn -0.913200 -0.000000 0.407500 vn -0.342200 0.937700 0.060500 vn -0.995300 -0.000000 -0.096600 vn 0.519200 -0.853000 -0.054300 vn -0.714800 0.690100 0.113700 vn 0.974400 0.089700 0.206200 vn 0.870400 0.288400 0.399100 vn 0.691900 0.713200 0.112500 vn -0.518000 -0.853700 -0.053400 vn -0.519700 -0.852700 -0.053600 vn 0.714800 0.690100 0.113700 vn -0.974400 0.089700 0.206200 vn -0.870400 0.288400 0.399100 vn -0.673800 0.724900 0.143400 vn 0.518000 -0.853700 -0.053400 vn 0.297300 -0.953400 -0.052600 vn 0.519700 -0.852700 -0.053600 vn -0.722400 0.676400 0.143800 vn -0.000000 0.962300 0.272000 usemtl Material.001 s off f 103/1/1 102/2/1 6/3/1 f 20/4/2 5/5/2 4/6/2 f 20/4/2 3/7/2 52/8/2 f 36/9/3 22/10/3 11/11/3 f 39/12/2 51/13/2 4/6/2 f 4/6/4 54/14/4 53/15/4 f 14/16/5 13/17/5 12/18/5 f 18/19/6 14/16/6 10/20/6 f 20/4/3 16/21/3 31/22/3 f 17/23/7 8/24/7 12/18/7 f 25/25/4 32/26/4 29/27/4 f 10/20/4 12/18/4 8/24/4 f 1/28/8 18/19/8 17/23/8 f 19/29/4 17/23/4 13/17/4 f 25/25/4 14/16/4 18/19/4 f 18/19/9 7/30/9 8/24/9 f 92/31/10 27/32/10 28/33/10 f 16/21/3 22/10/3 36/9/3 f 31/22/3 36/9/3 21/34/3 f 90/35/11 89/36/11 28/33/11 f 91/37/12 90/35/12 24/38/12 f 33/39/4 13/17/4 14/16/4 f 23/40/4 24/38/4 28/33/4 f 33/39/3 31/22/3 15/41/3 f 21/34/3 36/9/3 30/42/3 f 5/5/4 35/43/4 32/26/4 f 5/5/4 20/4/4 34/44/4 f 33/39/4 29/27/4 34/44/4 f 91/37/13 23/40/13 27/32/13 f 103/1/1 26/45/1 63/46/1 f 26/45/14 50/47/14 38/48/14 f 39/12/15 71/49/15 72/50/15 f 48/51/16 60/52/16 59/53/16 f 15/41/17 21/34/17 47/54/17 f 19/29/17 46/55/17 37/56/17 f 39/12/2 45/57/2 52/8/2 f 20/4/2 45/57/2 44/58/2 f 19/29/18 15/41/18 43/59/18 f 9/60/19 42/61/19 47/54/19 f 22/10/20 48/51/20 41/62/20 f 25/25/21 1/28/21 37/56/21 f 6/3/14 40/63/14 50/47/14 f 104/64/22 40/63/22 6/3/22 f 2/65/23 38/48/23 105/66/23 f 55/67/2 56/68/2 53/15/2 f 3/7/14 53/15/14 56/68/14 f 51/13/15 55/67/15 54/14/15 f 52/8/24 56/68/24 55/67/24 f 57/69/2 59/53/2 60/52/2 f 48/51/25 22/10/25 58/70/25 f 16/21/26 57/69/26 58/70/26 f 16/21/27 44/58/27 59/53/27 f 107/71/28 63/46/28 67/72/28 f 26/45/1 2/65/1 61/73/1 f 9/60/1 30/42/1 64/74/1 f 101/75/1 9/60/1 62/76/1 f 108/77/1 109/78/1 67/72/1 f 61/73/29 65/79/29 67/72/29 f 62/76/30 64/74/30 68/80/30 f 62/76/31 66/81/31 108/77/31 f 71/49/32 75/82/32 76/83/32 f 25/25/15 49/84/15 72/50/15 f 5/5/15 69/85/15 71/49/15 f 25/25/15 70/86/15 69/85/15 f 76/83/15 75/82/15 79/87/15 f 72/50/17 76/83/17 74/88/17 f 71/49/2 69/85/2 73/89/2 f 70/86/33 74/88/33 73/89/33 f 80/90/3 79/87/3 83/91/3 f 76/83/15 80/90/15 78/92/15 f 75/82/15 73/89/15 77/93/15 f 74/88/15 78/92/15 77/93/15 f 82/94/15 84/95/15 83/91/15 f 80/90/2 84/95/2 82/94/2 f 77/93/17 81/96/17 83/91/17 f 77/93/24 78/92/24 82/94/24 f 35/43/13 87/97/13 88/98/13 f 35/43/12 34/44/12 86/99/12 f 34/44/11 29/27/11 85/100/11 f 32/26/10 88/98/10 85/100/10 f 92/31/34 100/101/34 99/102/34 f 90/35/35 91/37/35 99/102/35 f 89/36/36 90/35/36 98/103/36 f 89/36/37 97/104/37 100/101/37 f 95/105/13 99/102/13 100/101/13 f 95/105/12 94/106/12 98/103/12 f 94/106/11 93/107/11 97/104/11 f 96/108/10 100/101/10 97/104/10 f 88/98/38 96/108/38 93/107/38 f 86/99/39 85/100/39 93/107/39 f 87/97/40 86/99/40 94/106/40 f 87/97/41 95/105/41 96/108/41 f 106/109/42 108/77/42 65/79/42 f 66/81/1 68/80/1 109/78/1 f 101/75/1 106/109/1 61/73/1 f 64/74/43 107/71/43 109/78/43 f 101/75/23 105/66/23 42/61/23 f 103/1/1 107/71/1 64/74/1 f 30/42/1 11/11/1 102/2/1 f 212/1/44 135/45/44 115/3/44 f 129/4/2 112/7/2 113/6/2 f 161/8/2 112/7/2 129/4/2 f 145/9/24 139/42/24 120/11/24 f 113/6/2 160/13/2 148/12/2 f 162/15/45 163/14/45 113/6/45 f 123/16/46 119/20/46 121/18/46 f 127/19/47 116/30/47 119/20/47 f 140/22/24 125/21/24 129/4/24 f 121/18/48 117/24/48 126/23/48 f 138/27/45 141/26/45 134/25/45 f 117/24/45 121/18/45 119/20/45 f 126/23/49 127/19/49 110/28/49 f 122/17/45 126/23/45 128/29/45 f 127/19/45 123/16/45 134/25/45 f 117/24/50 116/30/50 127/19/50 f 137/33/51 136/32/51 201/31/51 f 145/9/24 131/10/24 125/21/24 f 130/34/24 145/9/24 140/22/24 f 199/35/52 133/38/52 137/33/52 f 200/37/53 132/40/53 133/38/53 f 123/16/45 122/17/45 142/39/45 f 137/33/45 133/38/45 132/40/45 f 124/41/24 140/22/24 142/39/24 f 130/34/24 118/60/24 139/42/24 f 141/26/45 144/43/45 114/5/45 f 114/5/45 144/43/45 143/44/45 f 143/44/45 138/27/45 142/39/45 f 136/32/54 132/40/54 200/37/54 f 212/1/44 216/71/44 172/46/44 f 147/48/14 159/47/14 135/45/14 f 181/50/15 180/49/15 148/12/15 f 168/53/26 169/52/26 157/51/26 f 124/41/17 152/59/17 156/54/17 f 146/56/17 155/55/17 128/29/17 f 148/12/2 160/13/2 161/8/2 f 129/4/2 125/21/2 153/58/2 f 155/55/18 152/59/18 124/41/18 f 130/34/19 156/54/19 151/61/19 f 131/10/20 120/11/20 150/62/20 f 134/25/21 158/84/21 146/56/21 f 159/47/14 149/63/14 115/3/14 f 115/3/22 149/63/22 213/64/22 f 214/66/23 147/48/23 111/65/23 f 162/15/2 165/68/2 164/67/2 f 165/68/14 162/15/14 112/7/14 f 163/14/15 164/67/15 160/13/15 f 164/67/3 165/68/3 161/8/3 f 166/69/2 167/70/2 169/52/2 f 157/51/25 169/52/25 167/70/25 f 167/70/16 166/69/16 125/21/16 f 125/21/27 166/69/27 168/53/27 f 216/71/55 218/78/55 176/72/55 f 135/45/44 172/46/44 170/73/44 f 118/60/44 171/76/44 173/74/44 f 210/75/44 215/109/44 171/76/44 f 217/77/44 174/79/44 176/72/44 f 176/72/56 174/79/56 170/73/56 f 171/76/57 175/81/57 177/80/57 f 217/77/58 175/81/58 171/76/58 f 185/83/33 184/82/33 180/49/33 f 134/25/15 179/86/15 181/50/15 f 180/49/15 178/85/15 114/5/15 f 178/85/15 179/86/15 134/25/15 f 189/90/15 188/87/15 184/82/15 f 183/88/17 185/83/17 181/50/17 f 180/49/2 184/82/2 182/89/2 f 182/89/32 183/88/32 179/86/32 f 189/90/24 193/95/24 192/91/24 f 187/92/15 189/90/15 185/83/15 f 184/82/15 188/87/15 186/93/15 f 186/93/15 187/92/15 183/88/15 f 192/91/15 193/95/15 191/94/15 f 191/94/2 193/95/2 189/90/2 f 192/91/17 190/96/17 186/93/17 f 186/93/3 190/96/3 191/94/3 f 197/98/54 196/97/54 144/43/54 f 144/43/53 196/97/53 195/99/53 f 143/44/52 195/99/52 194/100/52 f 194/100/51 197/98/51 141/26/51 f 208/102/59 209/101/59 201/31/59 f 199/35/60 207/103/60 208/102/60 f 198/36/61 206/104/61 207/103/61 f 209/101/62 206/104/62 198/36/62 f 209/101/54 208/102/54 204/105/54 f 204/105/53 208/102/53 207/103/53 f 203/106/52 207/103/52 206/104/52 f 206/104/51 209/101/51 205/108/51 f 202/107/63 205/108/63 197/98/63 f 195/99/64 203/106/64 202/107/64 f 196/97/65 204/105/65 203/106/65 f 205/108/66 204/105/66 196/97/66 f 174/79/67 217/77/67 215/109/67 f 175/81/44 217/77/44 218/78/44 f 170/73/44 215/109/44 210/75/44 f 173/74/68 177/80/68 218/78/68 f 151/61/23 214/66/23 210/75/23 f 173/74/44 216/71/44 212/1/44 f 139/42/44 212/1/44 211/2/44 f 26/45/1 103/1/1 6/3/1 f 3/7/2 20/4/2 4/6/2 f 45/57/2 20/4/2 52/8/2 f 30/42/3 36/9/3 11/11/3 f 5/5/2 39/12/2 4/6/2 f 3/7/4 4/6/4 53/15/4 f 10/20/5 14/16/5 12/18/5 f 7/30/6 18/19/6 10/20/6 f 33/39/3 20/4/3 31/22/3 f 13/17/7 17/23/7 12/18/7 f 33/39/4 25/25/4 29/27/4 f 7/30/4 10/20/4 8/24/4 f 19/29/69 1/28/69 17/23/69 f 33/39/4 19/29/4 13/17/4 f 1/28/70 25/25/70 18/19/70 f 17/23/9 18/19/9 8/24/9 f 89/36/10 92/31/10 28/33/10 f 31/22/3 16/21/3 36/9/3 f 15/41/3 31/22/3 21/34/3 f 24/38/11 90/35/11 28/33/11 f 23/40/12 91/37/12 24/38/12 f 25/25/4 33/39/4 14/16/4 f 27/32/4 23/40/4 28/33/4 f 19/29/3 33/39/3 15/41/3 f 9/60/3 21/34/3 30/42/3 f 25/25/4 5/5/4 32/26/4 f 35/43/4 5/5/4 34/44/4 f 20/4/4 33/39/4 34/44/4 f 92/31/13 91/37/13 27/32/13 f 107/71/1 103/1/1 63/46/1 f 2/65/14 26/45/14 38/48/14 f 49/84/15 39/12/15 72/50/15 f 44/58/16 48/51/16 59/53/16 f 43/59/17 15/41/17 47/54/17 f 1/28/17 19/29/17 37/56/17 f 51/13/2 39/12/2 52/8/2 f 16/21/2 20/4/2 44/58/2 f 46/55/18 19/29/18 43/59/18 f 21/34/19 9/60/19 47/54/19 f 11/11/20 22/10/20 41/62/20 f 49/84/21 25/25/21 37/56/21 f 26/45/14 6/3/14 50/47/14 f 102/2/22 104/64/22 6/3/22 f 101/75/23 2/65/23 105/66/23 f 54/14/2 55/67/2 53/15/2 f 52/8/14 3/7/14 56/68/14 f 4/6/15 51/13/15 54/14/15 f 51/13/24 52/8/24 55/67/24 f 58/70/2 57/69/2 60/52/2 f 60/52/25 48/51/25 58/70/25 f 22/10/26 16/21/26 58/70/26 f 57/69/27 16/21/27 59/53/27 f 109/78/71 107/71/71 67/72/71 f 63/46/1 26/45/1 61/73/1 f 62/76/1 9/60/1 64/74/1 f 106/109/1 101/75/1 62/76/1 f 65/79/1 108/77/1 67/72/1 f 63/46/29 61/73/29 67/72/29 f 66/81/30 62/76/30 68/80/30 f 106/109/72 62/76/72 108/77/72 f 72/50/32 71/49/32 76/83/32 f 70/86/15 25/25/15 72/50/15 f 39/12/15 5/5/15 71/49/15 f 5/5/15 25/25/15 69/85/15 f 80/90/15 76/83/15 79/87/15 f 70/86/17 72/50/17 74/88/17 f 75/82/2 71/49/2 73/89/2 f 69/85/33 70/86/33 73/89/33 f 84/95/3 80/90/3 83/91/3 f 74/88/15 76/83/15 78/92/15 f 79/87/15 75/82/15 77/93/15 f 73/89/15 74/88/15 77/93/15 f 81/96/15 82/94/15 83/91/15 f 78/92/2 80/90/2 82/94/2 f 79/87/17 77/93/17 83/91/17 f 81/96/24 77/93/24 82/94/24 f 32/26/13 35/43/13 88/98/13 f 87/97/12 35/43/12 86/99/12 f 86/99/11 34/44/11 85/100/11 f 29/27/10 32/26/10 85/100/10 f 91/37/34 92/31/34 99/102/34 f 98/103/35 90/35/35 99/102/35 f 97/104/36 89/36/36 98/103/36 f 92/31/37 89/36/37 100/101/37 f 96/108/13 95/105/13 100/101/13 f 99/102/12 95/105/12 98/103/12 f 98/103/11 94/106/11 97/104/11 f 93/107/10 96/108/10 97/104/10 f 85/100/38 88/98/38 93/107/38 f 94/106/39 86/99/39 93/107/39 f 95/105/40 87/97/40 94/106/40 f 88/98/41 87/97/41 96/108/41 f 61/73/73 106/109/73 65/79/73 f 108/77/1 66/81/1 109/78/1 f 2/65/1 101/75/1 61/73/1 f 68/80/74 64/74/74 109/78/74 f 9/60/23 101/75/23 42/61/23 f 30/42/1 103/1/1 64/74/1 f 103/1/1 30/42/1 102/2/1 f 211/2/44 212/1/44 115/3/44 f 114/5/2 129/4/2 113/6/2 f 154/57/2 161/8/2 129/4/2 f 131/10/24 145/9/24 120/11/24 f 114/5/2 113/6/2 148/12/2 f 112/7/45 162/15/45 113/6/45 f 122/17/46 123/16/46 121/18/46 f 123/16/47 127/19/47 119/20/47 f 142/39/24 140/22/24 129/4/24 f 122/17/48 121/18/48 126/23/48 f 142/39/45 138/27/45 134/25/45 f 116/30/45 117/24/45 119/20/45 f 128/29/75 126/23/75 110/28/75 f 142/39/45 122/17/45 128/29/45 f 110/28/76 127/19/76 134/25/76 f 126/23/50 117/24/50 127/19/50 f 198/36/51 137/33/51 201/31/51 f 140/22/24 145/9/24 125/21/24 f 124/41/24 130/34/24 140/22/24 f 198/36/52 199/35/52 137/33/52 f 199/35/53 200/37/53 133/38/53 f 134/25/45 123/16/45 142/39/45 f 136/32/45 137/33/45 132/40/45 f 128/29/24 124/41/24 142/39/24 f 145/9/24 130/34/24 139/42/24 f 134/25/45 141/26/45 114/5/45 f 129/4/45 114/5/45 143/44/45 f 129/4/45 143/44/45 142/39/45 f 201/31/54 136/32/54 200/37/54 f 135/45/44 212/1/44 172/46/44 f 111/65/14 147/48/14 135/45/14 f 158/84/15 181/50/15 148/12/15 f 153/58/26 168/53/26 157/51/26 f 130/34/17 124/41/17 156/54/17 f 110/28/17 146/56/17 128/29/17 f 154/57/2 148/12/2 161/8/2 f 154/57/2 129/4/2 153/58/2 f 128/29/18 155/55/18 124/41/18 f 118/60/19 130/34/19 151/61/19 f 157/51/20 131/10/20 150/62/20 f 110/28/21 134/25/21 146/56/21 f 135/45/14 159/47/14 115/3/14 f 211/2/22 115/3/22 213/64/22 f 210/75/23 214/66/23 111/65/23 f 163/14/2 162/15/2 164/67/2 f 161/8/14 165/68/14 112/7/14 f 113/6/15 163/14/15 160/13/15 f 160/13/3 164/67/3 161/8/3 f 168/53/2 166/69/2 169/52/2 f 131/10/25 157/51/25 167/70/25 f 131/10/16 167/70/16 125/21/16 f 153/58/27 125/21/27 168/53/27 f 172/46/77 216/71/77 176/72/77 f 111/65/44 135/45/44 170/73/44 f 139/42/44 118/60/44 173/74/44 f 118/60/44 210/75/44 171/76/44 f 218/78/44 217/77/44 176/72/44 f 172/46/56 176/72/56 170/73/56 f 173/74/57 171/76/57 177/80/57 f 215/109/78 217/77/78 171/76/78 f 181/50/33 185/83/33 180/49/33 f 158/84/15 134/25/15 181/50/15 f 148/12/15 180/49/15 114/5/15 f 114/5/15 178/85/15 134/25/15 f 185/83/15 189/90/15 184/82/15 f 179/86/17 183/88/17 181/50/17 f 178/85/2 180/49/2 182/89/2 f 178/85/32 182/89/32 179/86/32 f 188/87/24 189/90/24 192/91/24 f 183/88/15 187/92/15 185/83/15 f 182/89/15 184/82/15 186/93/15 f 182/89/15 186/93/15 183/88/15 f 190/96/15 192/91/15 191/94/15 f 187/92/2 191/94/2 189/90/2 f 188/87/17 192/91/17 186/93/17 f 187/92/3 186/93/3 191/94/3 f 141/26/54 197/98/54 144/43/54 f 143/44/53 144/43/53 195/99/53 f 138/27/52 143/44/52 194/100/52 f 138/27/51 194/100/51 141/26/51 f 200/37/59 208/102/59 201/31/59 f 200/37/60 199/35/60 208/102/60 f 199/35/61 198/36/61 207/103/61 f 201/31/79 209/101/79 198/36/79 f 205/108/54 209/101/54 204/105/54 f 203/106/53 204/105/53 207/103/53 f 202/107/52 203/106/52 206/104/52 f 202/107/51 206/104/51 205/108/51 f 194/100/63 202/107/63 197/98/63 f 194/100/64 195/99/64 202/107/64 f 195/99/65 196/97/65 203/106/65 f 197/98/66 205/108/66 196/97/66 f 170/73/80 174/79/80 215/109/80 f 177/80/44 175/81/44 218/78/44 f 111/65/44 170/73/44 210/75/44 f 216/71/81 173/74/81 218/78/81 f 118/60/23 151/61/23 210/75/23 f 139/42/44 173/74/44 212/1/44 f 120/11/44 139/42/44 211/2/44 usemtl Material.003 f 41/62/82 104/64/82 102/2/82 f 211/2/82 213/64/82 150/62/82 f 11/11/82 41/62/82 102/2/82 f 120/11/82 211/2/82 150/62/82 tinyobjloader-2.0.0~rc5+dfsg1/python/000077500000000000000000000000001364105447200175155ustar00rootroot00000000000000tinyobjloader-2.0.0~rc5+dfsg1/python/LICENSE000066400000000000000000000021231364105447200205200ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2012-2019 Syoyo Fujita and many contributors. 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. tinyobjloader-2.0.0~rc5+dfsg1/python/MANIFEST.in000066400000000000000000000002501364105447200212500ustar00rootroot00000000000000# Copy the header file into the python/ folder. include ../tiny_obj_loader.h # Include it in the source distribution. include tiny_obj_loader.h include pyproject.toml tinyobjloader-2.0.0~rc5+dfsg1/python/Makefile000066400000000000000000000000751364105447200211570ustar00rootroot00000000000000all: python setup.py build t: python sample.py .PHONY: t tinyobjloader-2.0.0~rc5+dfsg1/python/README.md000066400000000000000000000033111364105447200207720ustar00rootroot00000000000000# tinyobjloader, Wavefront .obj loader `tinyobjloader` is a python wrapper for C++ wavefront .obj loader. `tinyobjloader` is rather fast and feature rich than other pure python version of .obj loader. ## Install You can install `tinyobjloader` with pip. ``` $ pip install tinyobjloader ``` ## Quick tutorial ```py import sys import tinyobjloader # Create reader. reader = tinyobjloader.ObjReader() filename = "cornellbox.obj" # Load .obj(and .mtl) using default configuration ret = reader.ParseFromFile(filename) if ret == False: print("Warn:", reader.Warning()) pint("Err:", reader.Error()) print("Failed to load : ", filename) sys.exit(-1) if reader.Warning(): print("Warn:", reader.Warning()) attrib = reader.GetAttrib() print("attrib.vertices = ", len(attrib.vertices)) print("attrib.normals = ", len(attrib.normals)) print("attrib.texcoords = ", len(attrib.texcoords)) materials = reader.GetMaterials() print("Num materials: ", len(materials)) for m in materials: print(m.name) print(m.diffuse) shapes = reader.GetShapes() print("Num shapes: ", len(shapes)) for shape in shapes: print(shape.name) print("num_indices = {}".format(len(shape.mesh.indices))) ``` ## More detailed usage Please take a look at `python/sample.py` file in tinyobjloader git repo. https://github.com/syoyo/tinyobjloader/blob/master/python/sample.py ## How to build Using `cibuildwheel` is an recommended way to build a python module. See $tinyobjloader/azure-pipelines.yml for details. ### Developer build Edit `setup.py` and uncomment `Developer option` lines Assume pip is installed. ``` $ pip install pybind11 $ python setup.py build ``` ## License MIT license. ## TODO * [ ] Writer saver tinyobjloader-2.0.0~rc5+dfsg1/python/bindings.cc000066400000000000000000000151361364105447200216270ustar00rootroot00000000000000#include #include #include #include // Use double precision for better python integration. #define TINYOBJLOADER_USE_DOUBLE // define some helper functions for pybind11 #define TINY_OBJ_LOADER_PYTHON_BINDING #include "tiny_obj_loader.h" namespace py = pybind11; using namespace tinyobj; PYBIND11_MODULE(tinyobjloader, tobj_module) { tobj_module.doc() = "Python bindings for TinyObjLoader."; // register struct py::class_(tobj_module, "ObjReaderConfig") .def(py::init<>()) .def_readwrite("triangulate", &ObjReaderConfig::triangulate); // py::init<>() for default constructor py::class_(tobj_module, "ObjReader") .def(py::init<>()) .def("ParseFromFile", &ObjReader::ParseFromFile, py::arg("filename"), py::arg("option") = ObjReaderConfig()) .def("ParseFromString", &ObjReader::ParseFromString, py::arg("obj_text"), py::arg("mtl_text"), py::arg("option") = ObjReaderConfig()) .def("Valid", &ObjReader::Valid) .def("GetAttrib", &ObjReader::GetAttrib) .def("GetShapes", &ObjReader::GetShapes) .def("GetMaterials", &ObjReader::GetMaterials) .def("Warning", &ObjReader::Warning) .def("Error", &ObjReader::Error); py::class_(tobj_module, "attrib_t") .def(py::init<>()) .def_readonly("vertices", &attrib_t::vertices) .def("numpy_vertices", [] (attrib_t &instance) { auto ret = py::array_t(instance.vertices.size()); py::buffer_info buf = ret.request(); memcpy(buf.ptr, instance.vertices.data(), instance.vertices.size() * sizeof(real_t)); return ret; }) .def_readonly("normals", &attrib_t::normals) .def_readonly("texcoords", &attrib_t::texcoords) .def_readonly("colors", &attrib_t::colors) ; py::class_(tobj_module, "shape_t") .def(py::init<>()) .def_readwrite("name", &shape_t::name) .def_readwrite("mesh", &shape_t::mesh) .def_readwrite("lines", &shape_t::lines) .def_readwrite("points", &shape_t::points); py::class_(tobj_module, "index_t") .def(py::init<>()) .def_readwrite("vertex_index", &index_t::vertex_index) .def_readwrite("normal_index", &index_t::normal_index) .def_readwrite("texcoord_index", &index_t::texcoord_index) ; // NOTE(syoyo): It looks it is rather difficult to expose assignment by array index to // python world for array variable. // For example following python scripting does not work well. // // print(mat.diffuse) // >>> [0.1, 0.2, 0.3] // mat.diffuse[1] = 1.0 // print(mat.diffuse) // >>> [0.1, 0.2, 0.3] # No modification // // https://github.com/pybind/pybind11/issues/1134 // // so, we need to update array variable like this: // // diffuse = mat.diffuse // diffuse[1] = 1.0 // mat.diffuse = diffuse // py::class_(tobj_module, "material_t") .def(py::init<>()) .def_readwrite("name", &material_t::name) .def_property("ambient", &material_t::GetAmbient, &material_t::SetAmbient) .def_property("diffuse", &material_t::GetDiffuse, &material_t::SetDiffuse) .def_property("specular", &material_t::GetSpecular, &material_t::SetSpecular) .def_property("transmittance", &material_t::GetTransmittance, &material_t::SetTransmittance) .def_readwrite("shininess", &material_t::shininess) .def_readwrite("ior", &material_t::ior) .def_readwrite("dissolve", &material_t::dissolve) .def_readwrite("illum", &material_t::illum) .def_readwrite("ambient_texname", &material_t::ambient_texname) .def_readwrite("diffuse_texname", &material_t::diffuse_texname) .def_readwrite("specular_texname", &material_t::specular_texname) .def_readwrite("specular_highlight_texname", &material_t::specular_highlight_texname) .def_readwrite("bump_texname", &material_t::bump_texname) .def_readwrite("displacement_texname", &material_t::displacement_texname) .def_readwrite("alpha_texname", &material_t::alpha_texname) .def_readwrite("reflection_texname", &material_t::reflection_texname) // TODO(syoyo): Expose texture parameter // PBR .def_readwrite("roughness", &material_t::roughness) .def_readwrite("metallic", &material_t::metallic) .def_readwrite("sheen", &material_t::sheen) .def_readwrite("clearcoat_thickness", &material_t::clearcoat_thickness) .def_readwrite("clearcoat_roughness", &material_t::clearcoat_roughness) .def_readwrite("anisotropy", &material_t::anisotropy) .def_readwrite("anisotropy_rotation", &material_t::anisotropy_rotation) .def_readwrite("roughness_texname", &material_t::roughness_texname) .def_readwrite("metallic_texname", &material_t::metallic_texname) .def_readwrite("sheen_texname", &material_t::sheen_texname) .def_readwrite("emissive_texname", &material_t::emissive_texname) .def_readwrite("normal_texname", &material_t::normal_texname) .def("GetCustomParameter", &material_t::GetCustomParameter) ; py::class_(tobj_module, "mesh_t") .def(py::init<>()) .def_readonly("num_face_vertices", &mesh_t::num_face_vertices) .def("numpy_num_face_vertices", [] (mesh_t &instance) { auto ret = py::array_t(instance.num_face_vertices.size()); py::buffer_info buf = ret.request(); memcpy(buf.ptr, instance.num_face_vertices.data(), instance.num_face_vertices.size() * sizeof(unsigned char)); return ret; }) .def_readonly("indices", &mesh_t::indices) .def("numpy_indices", [] (mesh_t &instance) { // Flatten indexes. index_t is composed of 3 ints(vertex_index, normal_index, texcoord_index). // numpy_indices = [0, -1, -1, 1, -1, -1, ...] // C++11 or later should pack POD struct tightly and does not reorder variables, // so we can memcpy to copy data. // Still, we check the size of struct and byte offsets of each variable just for sure. static_assert(sizeof(index_t) == 12, "sizeof(index_t) must be 12"); static_assert(offsetof(index_t, vertex_index) == 0, "offsetof(index_t, vertex_index) must be 0"); static_assert(offsetof(index_t, normal_index) == 4, "offsetof(index_t, normal_index) must be 4"); static_assert(offsetof(index_t, texcoord_index) == 8, "offsetof(index_t, texcoord_index) must be 8"); auto ret = py::array_t(instance.indices.size() * 3); py::buffer_info buf = ret.request(); memcpy(buf.ptr, instance.indices.data(), instance.indices.size() * 3 * sizeof(int)); return ret; }); py::class_(tobj_module, "lines_t") .def(py::init<>()); py::class_(tobj_module, "points_t") .def(py::init<>()); } tinyobjloader-2.0.0~rc5+dfsg1/python/pyproject.toml000066400000000000000000000001031364105447200224230ustar00rootroot00000000000000[build-system] requires = ["setuptools", "wheel", "pybind11>=2.3"] tinyobjloader-2.0.0~rc5+dfsg1/python/sample.py000066400000000000000000000042401364105447200213500ustar00rootroot00000000000000import sys import tinyobjloader filename = "../models/cornell_box.obj" reader = tinyobjloader.ObjReader() # Load .obj(and .mtl) using default configuration ret = reader.ParseFromFile(filename) # Optionally you can set custom `config` # config = tinyobj.ObjReaderConfig() # config.triangulate = False # ret = reader.ParseFromFile(filename, config) if ret == False: print("Failed to load : ", filename) print("Warn:", reader.Warning()) print("Err:", reader.Error()) sys.exit(-1) if reader.Warning(): print("Warn:", reader.Warning()) attrib = reader.GetAttrib() print("attrib.vertices = ", len(attrib.vertices)) print("attrib.normals = ", len(attrib.normals)) print("attrib.texcoords = ", len(attrib.texcoords)) # vertex data must be `xyzxyzxyz...` assert len(attrib.vertices) % 3 == 0 # normal data must be `xyzxyzxyz...` assert len(attrib.normals) % 3 == 0 # texcoords data must be `uvuvuv...` assert len(attrib.texcoords) % 2 == 0 for (i, v) in enumerate(attrib.vertices): print("v[{}] = {}".format(i, v)) for (i, v) in enumerate(attrib.normals): print("vn[{}] = {}".format(i, v)) for (i, v) in enumerate(attrib.texcoords): print("vt[{}] = {}".format(i, t)) print("numpy_vertices = {}".format(attrib.numpy_vertices())) materials = reader.GetMaterials() print("Num materials: ", len(materials)) for m in materials: print(m.name) print(m.diffuse) print(m.diffuse_texname) # Partial update(array indexing) does not work # m.diffuse[1] = 1.0 # Update with full object assignment works m.diffuse = [1, 2, 3] print(m.diffuse) # print(m.shininess) # print(m.illum) shapes = reader.GetShapes() print("Num shapes: ", len(shapes)) for shape in shapes: print(shape.name) print("len(num_indices) = {}".format(len(shape.mesh.indices))) for (i, idx) in enumerate(shape.mesh.indices): print("[{}] v_idx {}".format(i, idx.vertex_index)) print("[{}] vn_idx {}".format(i, idx.normal_index)) print("[{}] vt_idx {}".format(i, idx.texcoord_index)) print("numpy_indices = {}".format(shape.mesh.numpy_indices())) print("numpy_num_face_vertices = {}".format(shape.mesh.numpy_num_face_vertices())) tinyobjloader-2.0.0~rc5+dfsg1/python/setup.py000066400000000000000000000076201364105447200212340ustar00rootroot00000000000000import setuptools import platform with open("README.md", "r") as fh: long_description = fh.read() # Adapted from https://github.com/pybind/python_example/blob/master/setup.py class get_pybind_include(object): """Helper class to determine the pybind11 include path The purpose of this class is to postpone importing pybind11 until it is actually installed, so that the ``get_include()`` method can be invoked. """ def __init__(self, user=False, pep517=False): self.user = user self.pep517 = pep517 def __str__(self): import os import pybind11 interpreter_include_path = pybind11.get_include(self.user) if self.pep517: # When pybind11 is installed permanently in site packages, the headers # will be in the interpreter include path above. PEP 517 provides an # experimental feature for build system dependencies. When installing # a package from a source distribvution, first its build dependencies # are installed in a temporary location. pybind11 does not return the # correct path for this condition, so we glom together a second path, # and ultimately specify them _both_ in the include search path. # https://github.com/pybind/pybind11/issues/1067 return os.path.abspath( os.path.join( os.path.dirname(pybind11.__file__), "..", "..", "..", "..", "include", os.path.basename(interpreter_include_path), ) ) else: return interpreter_include_path ext_compile_args = ["-std=c++11"] ext_link_args = [] # Developer option # # if platform.system() == "Darwin": # # XCode10 or later does not support libstdc++, so we need to use libc++. # # macosx-version 10.6 does not support libc++, so we require min macosx version 10.9. # ext_compile_args.append("-stdlib=libc++") # ext_compile_args.append("-mmacosx-version-min=10.9") # ext_link_args.append("-stdlib=libc++") # ext_link_args.append("-mmacosx-version-min=10.9") # `tiny_obj_loader.cc` contains implementation of tiny_obj_loader. m = setuptools.Extension( "tinyobjloader", extra_compile_args=ext_compile_args, extra_link_args=ext_link_args, sources=["bindings.cc", "tiny_obj_loader.cc"], include_dirs=[ # Support `build_ext` finding tinyobjloader (without first running # `sdist`). "..", # Support `build_ext` finding pybind 11 (provided it's permanently # installed). get_pybind_include(), get_pybind_include(user=True), # Support building from a source distribution finding pybind11 from # a PEP 517 temporary install. get_pybind_include(pep517=True), ], language="c++", ) setuptools.setup( name="tinyobjloader", version="2.0.0rc5", description="Tiny but powerful Wavefront OBJ loader", long_description=long_description, long_description_content_type="text/markdown", author="Syoyo Fujita", author_email="syoyo@lighttransport.com", url="https://github.com/tinyobjloader/tinyobjloader", project_urls={ "Issue Tracker": "https://github.com/tinyobjloader/tinyobjloader/issues", }, classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "Intended Audience :: Manufacturing", "Topic :: Artistic Software", "Topic :: Multimedia :: Graphics :: 3D Modeling", "Topic :: Scientific/Engineering :: Visualization", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", ], packages=setuptools.find_packages(), ext_modules=[m], ) tinyobjloader-2.0.0~rc5+dfsg1/python/tiny_obj_loader.cc000066400000000000000000000003371364105447200231720ustar00rootroot00000000000000// Use double precision for better python integration. // Need also define this in `binding.cc`(and all compilation units) #define TINYOBJLOADER_USE_DOUBLE #define TINYOBJLOADER_IMPLEMENTATION #include "tiny_obj_loader.h" tinyobjloader-2.0.0~rc5+dfsg1/tests/000077500000000000000000000000001364105447200173365ustar00rootroot00000000000000tinyobjloader-2.0.0~rc5+dfsg1/tests/LICENSE.acutest.txt000066400000000000000000000021101364105447200226220ustar00rootroot00000000000000 # The MIT License (MIT) Copyright © 2013-2017 Martin Mitáš 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. tinyobjloader-2.0.0~rc5+dfsg1/tests/Makefile000066400000000000000000000003211364105447200207720ustar00rootroot00000000000000.PHONY: clean CXX = clang++ CXXFLAGS ?= -g -O1 tester: tester.cc ../tiny_obj_loader.h $(CXX) $(CXXFLAGS) -fsanitize=address -o tester tester.cc all: tester check: tester ./tester clean: rm -rf tester tinyobjloader-2.0.0~rc5+dfsg1/tests/README.md000066400000000000000000000006461364105447200206230ustar00rootroot00000000000000# Build&Test ## Use makefile $ make check ## Use ninja + kuroga Assume * ninja 1.4+ * python 2.6+ Are installed. ### Linux/MacOSX $ python kuroga.py config-posix.py $ ninja ### Windows Visual Studio 2013 is required to build tester. On Windows console. > python kuroga.py config-msvc.py > vcbuild.bat Or on msys2 bash, $ python kuroga.py config-msvc.py $ cmd //c vcbuild.bat tinyobjloader-2.0.0~rc5+dfsg1/tests/acutest.h000066400000000000000000001414101364105447200211600ustar00rootroot00000000000000/* * Acutest -- Another C/C++ Unit Test facility * * * Copyright (c) 2013-2019 Martin Mitas * * 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 ACUTEST_H__ #define ACUTEST_H__ /************************ *** Public interface *** ************************/ /* By default, "acutest.h" provides the main program entry point (function * main()). However, if the test suite is composed of multiple source files * which include "acutest.h", then this causes a problem of multiple main() * definitions. To avoid this problem, #define macro TEST_NO_MAIN in all * compilation units but one. */ /* Macro to specify list of unit tests in the suite. * The unit test implementation MUST provide list of unit tests it implements * with this macro: * * TEST_LIST = { * { "test1_name", test1_func_ptr }, * { "test2_name", test2_func_ptr }, * ... * { 0 } * }; * * The list specifies names of each test (must be unique) and pointer to * a function implementing it. The function does not take any arguments * and has no return values, i.e. every test function has to be compatible * with this prototype: * * void test_func(void); */ #define TEST_LIST const struct test__ test_list__[] /* Macros for testing whether an unit test succeeds or fails. These macros * can be used arbitrarily in functions implementing the unit tests. * * If any condition fails throughout execution of a test, the test fails. * * TEST_CHECK takes only one argument (the condition), TEST_CHECK_ allows * also to specify an error message to print out if the condition fails. * (It expects printf-like format string and its parameters). The macros * return non-zero (condition passes) or 0 (condition fails). * * That can be useful when more conditions should be checked only if some * preceding condition passes, as illustrated in this code snippet: * * SomeStruct* ptr = allocate_some_struct(); * if(TEST_CHECK(ptr != NULL)) { * TEST_CHECK(ptr->member1 < 100); * TEST_CHECK(ptr->member2 > 200); * } */ #define TEST_CHECK_(cond,...) test_check__((cond), __FILE__, __LINE__, __VA_ARGS__) #define TEST_CHECK(cond) test_check__((cond), __FILE__, __LINE__, "%s", #cond) #ifdef __cplusplus /* Macros to verify that the code (the 1st argument) throws exception of given * type (the 2nd argument). (Note these macros are only available in C++.) * * TEST_EXCEPTION_ is like TEST_EXCEPTION but accepts custom printf-like * message. * * For example: * * TEST_EXCEPTION(function_that_throw(), ExpectedExceptionType); * * If the function_that_throw() throws ExpectedExceptionType, the check passes. * If the function throws anything incompatible with ExpectedExceptionType * (or if it does not thrown an exception at all), the check fails. */ #define TEST_EXCEPTION(code, exctype) \ do { \ bool exc_ok__ = false; \ const char *msg__ = NULL; \ try { \ code; \ msg__ = "No exception thrown."; \ } catch(exctype const&) { \ exc_ok__= true; \ } catch(...) { \ msg__ = "Unexpected exception thrown."; \ } \ test_check__(exc_ok__, __FILE__, __LINE__, #code " throws " #exctype); \ if(msg__ != NULL) \ test_message__("%s", msg__); \ } while(0) #define TEST_EXCEPTION_(code, exctype, ...) \ do { \ bool exc_ok__ = false; \ const char *msg__ = NULL; \ try { \ code; \ msg__ = "No exception thrown."; \ } catch(exctype const&) { \ exc_ok__= true; \ } catch(...) { \ msg__ = "Unexpected exception thrown."; \ } \ test_check__(exc_ok__, __FILE__, __LINE__, __VA_ARGS__); \ if(msg__ != NULL) \ test_message__("%s", msg__); \ } while(0) #endif /* #ifdef __cplusplus */ /* Sometimes it is useful to split execution of more complex unit tests to some * smaller parts and associate those parts with some names. * * This is especially handy if the given unit test is implemented as a loop * over some vector of multiple testing inputs. Using these macros allow to use * sort of subtitle for each iteration of the loop (e.g. outputting the input * itself or a name associated to it), so that if any TEST_CHECK condition * fails in the loop, it can be easily seen which iteration triggers the * failure, without the need to manually output the iteration-specific data in * every single TEST_CHECK inside the loop body. * * TEST_CASE allows to specify only single string as the name of the case, * TEST_CASE_ provides all the power of printf-like string formatting. * * Note that the test cases cannot be nested. Starting a new test case ends * implicitly the previous one. To end the test case explicitly (e.g. to end * the last test case after exiting the loop), you may use TEST_CASE(NULL). */ #define TEST_CASE_(...) test_case__(__VA_ARGS__) #define TEST_CASE(name) test_case__("%s", name); /* printf-like macro for outputting an extra information about a failure. * * Intended use is to output some computed output versus the expected value, * e.g. like this: * * if(!TEST_CHECK(produced == expected)) { * TEST_MSG("Expected: %d", expected); * TEST_MSG("Produced: %d", produced); * } * * Note the message is only written down if the most recent use of any checking * macro (like e.g. TEST_CHECK or TEST_EXCEPTION) in the current test failed. * This means the above is equivalent to just this: * * TEST_CHECK(produced == expected); * TEST_MSG("Expected: %d", expected); * TEST_MSG("Produced: %d", produced); * * The macro can deal with multi-line output fairly well. It also automatically * adds a final new-line if there is none present. */ #define TEST_MSG(...) test_message__(__VA_ARGS__) /* Maximal output per TEST_MSG call. Longer messages are cut. * You may define another limit prior including "acutest.h" */ #ifndef TEST_MSG_MAXSIZE #define TEST_MSG_MAXSIZE 1024 #endif /* Macro for dumping a block of memory. * * Its inteded use is very similar to what TEST_MSG is for, but instead of * generating any printf-like message, this is for dumping raw block of a * memory in a hexadecimal form: * * TEST_CHECK(size_produced == size_expected && memcmp(addr_produced, addr_expected, size_produced) == 0); * TEST_DUMP("Expected:", addr_expected, size_expected); * TEST_DUMP("Produced:", addr_produced, size_produced); */ #define TEST_DUMP(title, addr, size) test_dump__(title, addr, size) /* Maximal output per TEST_DUMP call (in bytes to dump). Longer blocks are cut. * You may define another limit prior including "acutest.h" */ #ifndef TEST_DUMP_MAXSIZE #define TEST_DUMP_MAXSIZE 1024 #endif /********************** *** Implementation *** **********************/ /* The unit test files should not rely on anything below. */ #include #include #include #include #include #if defined(unix) || defined(__unix__) || defined(__unix) || defined(__APPLE__) #define ACUTEST_UNIX__ 1 #include #include #include #include #include #include #if defined CLOCK_PROCESS_CPUTIME_ID && defined CLOCK_MONOTONIC #define ACUTEST_HAS_POSIX_TIMER__ 1 #endif #endif #if defined(__gnu_linux__) #define ACUTEST_LINUX__ 1 #include #include #endif #if defined(_WIN32) || defined(__WIN32__) || defined(__WINDOWS__) #define ACUTEST_WIN__ 1 #include #include #endif #ifdef __cplusplus #include #endif /* Note our global private identifiers end with '__' to mitigate risk of clash * with the unit tests implementation. */ #ifdef __cplusplus extern "C" { #endif struct test__ { const char* name; void (*func)(void); }; extern const struct test__ test_list__[]; int test_check__(int cond, const char* file, int line, const char* fmt, ...); void test_case__(const char* fmt, ...); void test_message__(const char* fmt, ...); void test_dump__(const char* title, const void* addr, size_t size); #ifndef TEST_NO_MAIN static char* test_argv0__ = NULL; static size_t test_list_size__ = 0; static const struct test__** tests__ = NULL; static char* test_flags__ = NULL; static size_t test_count__ = 0; static int test_no_exec__ = -1; static int test_no_summary__ = 0; static int test_tap__ = 0; static int test_skip_mode__ = 0; static int test_worker__ = 0; static int test_worker_index__ = 0; static int test_cond_failed__ = 0; static int test_stat_failed_units__ = 0; static int test_stat_run_units__ = 0; static const struct test__* test_current_unit__ = NULL; static int test_current_index__ = 0; static char test_case_name__[64] = ""; static int test_current_already_logged__ = 0; static int test_case_current_already_logged__ = 0; static int test_verbose_level__ = 2; static int test_current_failures__ = 0; static int test_colorize__ = 0; static int test_timer__ = 0; #if defined ACUTEST_WIN__ static LARGE_INTEGER test_timer_freq__; static LARGE_INTEGER test_timer_start__; static LARGE_INTEGER test_timer_end__; static void test_timer_init__(void) { QueryPerformanceFrequency(&test_timer_freq__); } static void test_timer_get_time__(LARGE_INTEGER* ts) { QueryPerformanceCounter(ts); } static void test_timer_print_diff__(void) { double duration = test_timer_end__.QuadPart - test_timer_start__.QuadPart; duration /= test_timer_freq__.QuadPart; printf("%.6lf secs", duration); } #elif defined ACUTEST_HAS_POSIX_TIMER__ static clockid_t test_timer_id__; struct timespec test_timer_start__; struct timespec test_timer_end__; static void test_timer_init__(void) { if(test_timer__ == 1) #ifdef CLOCK_MONOTONIC_RAW /* linux specific; not subject of NTP adjustements or adjtime() */ test_timer_id__ = CLOCK_MONOTONIC_RAW; #else test_timer_id__ = CLOCK_MONOTONIC; #endif else if(test_timer__ == 2) test_timer_id__ = CLOCK_PROCESS_CPUTIME_ID; } static void test_timer_get_time__(struct timespec* ts) { clock_gettime(test_timer_id__, ts); } static void test_timer_print_diff__(void) { double duration = ((double) test_timer_end__.tv_sec + (double) test_timer_end__.tv_nsec * 10e-9) - ((double) test_timer_start__.tv_sec + (double) test_timer_start__.tv_nsec * 10e-9); printf("%.6lf secs", duration); } #else static int test_timer_start__; static int test_timer_end__; void test_timer_init__(void) {} static void test_timer_get_time__(int* ts) { (void) ts; } static void test_timer_print_diff__(void) {} #endif #define TEST_COLOR_DEFAULT__ 0 #define TEST_COLOR_GREEN__ 1 #define TEST_COLOR_RED__ 2 #define TEST_COLOR_DEFAULT_INTENSIVE__ 3 #define TEST_COLOR_GREEN_INTENSIVE__ 4 #define TEST_COLOR_RED_INTENSIVE__ 5 static int test_print_in_color__(int color, const char* fmt, ...) { va_list args; char buffer[256]; int n; va_start(args, fmt); vsnprintf(buffer, sizeof(buffer), fmt, args); va_end(args); buffer[sizeof(buffer)-1] = '\0'; if(!test_colorize__) { return printf("%s", buffer); } #if defined ACUTEST_UNIX__ { const char* col_str; switch(color) { case TEST_COLOR_GREEN__: col_str = "\033[0;32m"; break; case TEST_COLOR_RED__: col_str = "\033[0;31m"; break; case TEST_COLOR_GREEN_INTENSIVE__: col_str = "\033[1;32m"; break; case TEST_COLOR_RED_INTENSIVE__: col_str = "\033[1;31m"; break; case TEST_COLOR_DEFAULT_INTENSIVE__: col_str = "\033[1m"; break; default: col_str = "\033[0m"; break; } printf("%s", col_str); n = printf("%s", buffer); printf("\033[0m"); return n; } #elif defined ACUTEST_WIN__ { HANDLE h; CONSOLE_SCREEN_BUFFER_INFO info; WORD attr; h = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(h, &info); switch(color) { case TEST_COLOR_GREEN__: attr = FOREGROUND_GREEN; break; case TEST_COLOR_RED__: attr = FOREGROUND_RED; break; case TEST_COLOR_GREEN_INTENSIVE__: attr = FOREGROUND_GREEN | FOREGROUND_INTENSITY; break; case TEST_COLOR_RED_INTENSIVE__: attr = FOREGROUND_RED | FOREGROUND_INTENSITY; break; case TEST_COLOR_DEFAULT_INTENSIVE__: attr = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY; break; default: attr = 0; break; } if(attr != 0) SetConsoleTextAttribute(h, attr); n = printf("%s", buffer); SetConsoleTextAttribute(h, info.wAttributes); return n; } #else n = printf("%s", buffer); return n; #endif } static void test_begin_test_line__(const struct test__* test) { if(!test_tap__) { if(test_verbose_level__ >= 3) { test_print_in_color__(TEST_COLOR_DEFAULT_INTENSIVE__, "Test %s:\n", test->name); test_current_already_logged__++; } else if(test_verbose_level__ >= 1) { int n; char spaces[48]; n = test_print_in_color__(TEST_COLOR_DEFAULT_INTENSIVE__, "Test %s... ", test->name); memset(spaces, ' ', sizeof(spaces)); if(n < (int) sizeof(spaces)) printf("%.*s", (int) sizeof(spaces) - n, spaces); } else { test_current_already_logged__ = 1; } } } static void test_finish_test_line__(int result) { if(test_tap__) { const char* str = (result == 0) ? "ok" : "not ok"; printf("%s %u - %s\n", str, test_current_index__ + 1, test_current_unit__->name); if(result == 0 && test_timer__) { printf("# Duration: "); test_timer_print_diff__(); printf("\n"); } } else { int color = (result == 0) ? TEST_COLOR_GREEN_INTENSIVE__ : TEST_COLOR_RED_INTENSIVE__; const char* str = (result == 0) ? "OK" : "FAILED"; printf("[ "); test_print_in_color__(color, str); printf(" ]"); if(result == 0 && test_timer__) { printf(" "); test_timer_print_diff__(); } printf("\n"); } } static void test_line_indent__(int level) { static const char spaces[] = " "; int n = level * 2; if(test_tap__ && n > 0) { n--; printf("#"); } while(n > 16) { printf("%s", spaces); n -= 16; } printf("%.*s", n, spaces); } int test_check__(int cond, const char* file, int line, const char* fmt, ...) { const char *result_str; int result_color; int verbose_level; if(cond) { result_str = "ok"; result_color = TEST_COLOR_GREEN__; verbose_level = 3; } else { if(!test_current_already_logged__ && test_current_unit__ != NULL) test_finish_test_line__(-1); result_str = "failed"; result_color = TEST_COLOR_RED__; verbose_level = 2; test_current_failures__++; test_current_already_logged__++; } if(test_verbose_level__ >= verbose_level) { va_list args; if(!test_case_current_already_logged__ && test_case_name__[0]) { test_line_indent__(1); test_print_in_color__(TEST_COLOR_DEFAULT_INTENSIVE__, "Case %s:\n", test_case_name__); test_current_already_logged__++; test_case_current_already_logged__++; } test_line_indent__(test_case_name__[0] ? 2 : 1); if(file != NULL) { if(test_verbose_level__ < 3) { #ifdef ACUTEST_WIN__ const char* lastsep1 = strrchr(file, '\\'); const char* lastsep2 = strrchr(file, '/'); if(lastsep1 == NULL) lastsep1 = file-1; if(lastsep2 == NULL) lastsep2 = file-1; file = (lastsep1 > lastsep2 ? lastsep1 : lastsep2) + 1; #else const char* lastsep = strrchr(file, '/'); if(lastsep != NULL) file = lastsep+1; #endif } printf("%s:%d: Check ", file, line); } va_start(args, fmt); vprintf(fmt, args); va_end(args); printf("... "); test_print_in_color__(result_color, result_str); printf("\n"); test_current_already_logged__++; } test_cond_failed__ = (cond == 0); return !test_cond_failed__; } void test_case__(const char* fmt, ...) { va_list args; if(test_verbose_level__ < 2) return; if(test_case_name__[0]) { test_case_current_already_logged__ = 0; test_case_name__[0] = '\0'; } if(fmt == NULL) return; va_start(args, fmt); vsnprintf(test_case_name__, sizeof(test_case_name__) - 1, fmt, args); va_end(args); test_case_name__[sizeof(test_case_name__) - 1] = '\0'; if(test_verbose_level__ >= 3) { test_line_indent__(1); test_print_in_color__(TEST_COLOR_DEFAULT_INTENSIVE__, "Case %s:\n", test_case_name__); test_current_already_logged__++; test_case_current_already_logged__++; } } void test_message__(const char* fmt, ...) { char buffer[TEST_MSG_MAXSIZE]; char* line_beg; char* line_end; va_list args; if(test_verbose_level__ < 2) return; /* We allow extra message only when something is already wrong in the * current test. */ if(test_current_unit__ == NULL || !test_cond_failed__) return; va_start(args, fmt); vsnprintf(buffer, TEST_MSG_MAXSIZE, fmt, args); va_end(args); buffer[TEST_MSG_MAXSIZE-1] = '\0'; line_beg = buffer; while(1) { line_end = strchr(line_beg, '\n'); if(line_end == NULL) break; test_line_indent__(test_case_name__[0] ? 3 : 2); printf("%.*s\n", (int)(line_end - line_beg), line_beg); line_beg = line_end + 1; } if(line_beg[0] != '\0') { test_line_indent__(test_case_name__[0] ? 3 : 2); printf("%s\n", line_beg); } } void test_dump__(const char* title, const void* addr, size_t size) { static const size_t BYTES_PER_LINE = 16; size_t line_beg; size_t truncate = 0; if(test_verbose_level__ < 2) return; /* We allow extra message only when something is already wrong in the * current test. */ if(test_current_unit__ == NULL || !test_cond_failed__) return; if(size > TEST_DUMP_MAXSIZE) { truncate = size - TEST_DUMP_MAXSIZE; size = TEST_DUMP_MAXSIZE; } test_line_indent__(test_case_name__[0] ? 3 : 2); printf((title[strlen(title)-1] == ':') ? "%s\n" : "%s:\n", title); for(line_beg = 0; line_beg < size; line_beg += BYTES_PER_LINE) { size_t line_end = line_beg + BYTES_PER_LINE; size_t off; test_line_indent__(test_case_name__[0] ? 4 : 3); printf("%08x: ", line_beg); for(off = line_beg; off < line_end; off++) { if(off < size) printf(" %02x", ((unsigned char*)addr)[off]); else printf(" "); } printf(" "); for(off = line_beg; off < line_end; off++) { unsigned char byte = ((unsigned char*)addr)[off]; if(off < size) printf("%c", (iscntrl(byte) ? '.' : byte)); else break; } printf("\n"); } if(truncate > 0) { test_line_indent__(test_case_name__[0] ? 4 : 3); printf(" ... (and more %u bytes)\n", (unsigned) truncate); } } static void test_list_names__(void) { const struct test__* test; printf("Unit tests:\n"); for(test = &test_list__[0]; test->func != NULL; test++) printf(" %s\n", test->name); } static void test_remember__(int i) { if(test_flags__[i]) return; else test_flags__[i] = 1; tests__[test_count__] = &test_list__[i]; test_count__++; } static int test_name_contains_word__(const char* name, const char* pattern) { static const char word_delim[] = " \t-_."; const char* substr; size_t pattern_len; int starts_on_word_boundary; int ends_on_word_boundary; pattern_len = strlen(pattern); substr = strstr(name, pattern); while(substr != NULL) { starts_on_word_boundary = (substr == name || strchr(word_delim, substr[-1]) != NULL); ends_on_word_boundary = (substr[pattern_len] == '\0' || strchr(word_delim, substr[pattern_len]) != NULL); if(starts_on_word_boundary && ends_on_word_boundary) return 1; substr = strstr(substr+1, pattern); } return 0; } static int test_lookup__(const char* pattern) { int i; int n = 0; /* Try exact match. */ for(i = 0; i < (int) test_list_size__; i++) { if(strcmp(test_list__[i].name, pattern) == 0) { test_remember__(i); n++; break; } } if(n > 0) return n; /* Try word match. */ for(i = 0; i < (int) test_list_size__; i++) { if(test_name_contains_word__(test_list__[i].name, pattern)) { test_remember__(i); n++; } } if(n > 0) return n; /* Try relaxed match. */ for(i = 0; i < (int) test_list_size__; i++) { if(strstr(test_list__[i].name, pattern) != NULL) { test_remember__(i); n++; } } return n; } /* Called if anything goes bad in Acutest, or if the unit test ends in other * way then by normal returning from its function (e.g. exception or some * abnormal child process termination). */ static void test_error__(const char* fmt, ...) { va_list args; if(test_verbose_level__ == 0) return; if(test_verbose_level__ <= 2 && !test_current_already_logged__ && test_current_unit__ != NULL) { if(test_tap__) { test_finish_test_line__(-1); } else { printf("[ "); test_print_in_color__(TEST_COLOR_RED_INTENSIVE__, "FAILED"); printf(" ]\n"); } } if(test_verbose_level__ >= 2) { test_line_indent__(1); if(test_verbose_level__ >= 3) test_print_in_color__(TEST_COLOR_RED_INTENSIVE__, "ERROR: "); va_start(args, fmt); vprintf(fmt, args); va_end(args); printf("\n"); } if(test_verbose_level__ >= 3) { printf("\n"); } } /* Call directly the given test unit function. */ static int test_do_run__(const struct test__* test, int index) { test_current_unit__ = test; test_current_index__ = index; test_current_failures__ = 0; test_current_already_logged__ = 0; test_cond_failed__ = 0; test_timer_init__(); test_begin_test_line__(test); #ifdef __cplusplus try { #endif /* This is good to do for case the test unit e.g. crashes. */ fflush(stdout); fflush(stderr); test_timer_get_time__(&test_timer_start__); test->func(); test_timer_get_time__(&test_timer_end__); if(test_verbose_level__ >= 3) { test_line_indent__(1); if(test_current_failures__ == 0) { test_print_in_color__(TEST_COLOR_GREEN_INTENSIVE__, "SUCCESS: "); printf("All conditions have passed.\n"); if(test_timer__) { test_line_indent__(1); printf("Duration: "); test_timer_print_diff__(); printf("\n"); } } else { test_print_in_color__(TEST_COLOR_RED_INTENSIVE__, "FAILED: "); printf("%d condition%s %s failed.\n", test_current_failures__, (test_current_failures__ == 1) ? "" : "s", (test_current_failures__ == 1) ? "has" : "have"); } printf("\n"); } else if(test_verbose_level__ >= 1 && test_current_failures__ == 0) { test_finish_test_line__(0); } test_case__(NULL); test_current_unit__ = NULL; return (test_current_failures__ == 0) ? 0 : -1; #ifdef __cplusplus } catch(std::exception& e) { const char* what = e.what(); if(what != NULL) test_error__("Threw std::exception: %s", what); else test_error__("Threw std::exception"); return -1; } catch(...) { test_error__("Threw an exception"); return -1; } #endif } /* Trigger the unit test. If possible (and not suppressed) it starts a child * process who calls test_do_run__(), otherwise it calls test_do_run__() * directly. */ static void test_run__(const struct test__* test, int index) { int failed = 1; test_current_unit__ = test; test_current_already_logged__ = 0; if(!test_no_exec__) { #if defined(ACUTEST_UNIX__) pid_t pid; int exit_code; /* Make sure the child starts with empty I/O buffers. */ fflush(stdout); fflush(stderr); pid = fork(); if(pid == (pid_t)-1) { test_error__("Cannot fork. %s [%d]", strerror(errno), errno); failed = 1; } else if(pid == 0) { /* Child: Do the test. */ failed = (test_do_run__(test, index) != 0); exit(failed ? 1 : 0); } else { /* Parent: Wait until child terminates and analyze its exit code. */ waitpid(pid, &exit_code, 0); if(WIFEXITED(exit_code)) { switch(WEXITSTATUS(exit_code)) { case 0: failed = 0; break; /* test has passed. */ case 1: /* noop */ break; /* "normal" failure. */ default: test_error__("Unexpected exit code [%d]", WEXITSTATUS(exit_code)); } } else if(WIFSIGNALED(exit_code)) { char tmp[32]; const char* signame; switch(WTERMSIG(exit_code)) { case SIGINT: signame = "SIGINT"; break; case SIGHUP: signame = "SIGHUP"; break; case SIGQUIT: signame = "SIGQUIT"; break; case SIGABRT: signame = "SIGABRT"; break; case SIGKILL: signame = "SIGKILL"; break; case SIGSEGV: signame = "SIGSEGV"; break; case SIGILL: signame = "SIGILL"; break; case SIGTERM: signame = "SIGTERM"; break; default: sprintf(tmp, "signal %d", WTERMSIG(exit_code)); signame = tmp; break; } test_error__("Test interrupted by %s", signame); } else { test_error__("Test ended in an unexpected way [%d]", exit_code); } } #elif defined(ACUTEST_WIN__) char buffer[512] = {0}; STARTUPINFOA startupInfo; PROCESS_INFORMATION processInfo; DWORD exitCode; /* Windows has no fork(). So we propagate all info into the child * through a command line arguments. */ _snprintf(buffer, sizeof(buffer)-1, "%s --worker=%d %s --no-exec --no-summary %s --verbose=%d --color=%s -- \"%s\"", test_argv0__, index, test_timer__ ? "--timer" : "", test_tap__ ? "--tap" : "", test_verbose_level__, test_colorize__ ? "always" : "never", test->name); memset(&startupInfo, 0, sizeof(startupInfo)); startupInfo.cb = sizeof(STARTUPINFO); if(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo)) { WaitForSingleObject(processInfo.hProcess, INFINITE); GetExitCodeProcess(processInfo.hProcess, &exitCode); CloseHandle(processInfo.hThread); CloseHandle(processInfo.hProcess); failed = (exitCode != 0); } else { test_error__("Cannot create unit test subprocess [%ld].", GetLastError()); failed = 1; } #else /* A platform where we don't know how to run child process. */ failed = (test_do_run__(test, index) != 0); #endif } else { /* Child processes suppressed through --no-exec. */ failed = (test_do_run__(test, index) != 0); } test_current_unit__ = NULL; test_stat_run_units__++; if(failed) test_stat_failed_units__++; } #if defined(ACUTEST_WIN__) /* Callback for SEH events. */ static LONG CALLBACK test_exception_filter__(EXCEPTION_POINTERS *ptrs) { test_error__("Unhandled SEH exception %08lx at %p.", ptrs->ExceptionRecord->ExceptionCode, ptrs->ExceptionRecord->ExceptionAddress); fflush(stdout); fflush(stderr); return EXCEPTION_EXECUTE_HANDLER; } #endif #define TEST_CMDLINE_OPTFLAG_OPTIONALARG__ 0x0001 #define TEST_CMDLINE_OPTFLAG_REQUIREDARG__ 0x0002 #define TEST_CMDLINE_OPTID_NONE__ 0 #define TEST_CMDLINE_OPTID_UNKNOWN__ (-0x7fffffff + 0) #define TEST_CMDLINE_OPTID_MISSINGARG__ (-0x7fffffff + 1) #define TEST_CMDLINE_OPTID_BOGUSARG__ (-0x7fffffff + 2) typedef struct TEST_CMDLINE_OPTION__ { char shortname; const char* longname; int id; unsigned flags; } TEST_CMDLINE_OPTION__; static int test_cmdline_handle_short_opt_group__(const TEST_CMDLINE_OPTION__* options, const char* arggroup, int (*callback)(int /*optval*/, const char* /*arg*/)) { const TEST_CMDLINE_OPTION__* opt; int i; int ret = 0; for(i = 0; arggroup[i] != '\0'; i++) { for(opt = options; opt->id != 0; opt++) { if(arggroup[i] == opt->shortname) break; } if(opt->id != 0 && !(opt->flags & TEST_CMDLINE_OPTFLAG_REQUIREDARG__)) { ret = callback(opt->id, NULL); } else { /* Unknown option. */ char badoptname[3]; badoptname[0] = '-'; badoptname[1] = arggroup[i]; badoptname[2] = '\0'; ret = callback((opt->id != 0 ? TEST_CMDLINE_OPTID_MISSINGARG__ : TEST_CMDLINE_OPTID_UNKNOWN__), badoptname); } if(ret != 0) break; } return ret; } #define TEST_CMDLINE_AUXBUF_SIZE__ 32 static int test_cmdline_read__(const TEST_CMDLINE_OPTION__* options, int argc, char** argv, int (*callback)(int /*optval*/, const char* /*arg*/)) { const TEST_CMDLINE_OPTION__* opt; char auxbuf[TEST_CMDLINE_AUXBUF_SIZE__+1]; int after_doubledash = 0; int i = 1; int ret = 0; auxbuf[TEST_CMDLINE_AUXBUF_SIZE__] = '\0'; while(i < argc) { if(after_doubledash || strcmp(argv[i], "-") == 0) { /* Non-option argument. */ ret = callback(TEST_CMDLINE_OPTID_NONE__, argv[i]); } else if(strcmp(argv[i], "--") == 0) { /* End of options. All the remaining members are non-option arguments. */ after_doubledash = 1; } else if(argv[i][0] != '-') { /* Non-option argument. */ ret = callback(TEST_CMDLINE_OPTID_NONE__, argv[i]); } else { for(opt = options; opt->id != 0; opt++) { if(opt->longname != NULL && strncmp(argv[i], "--", 2) == 0) { size_t len = strlen(opt->longname); if(strncmp(argv[i]+2, opt->longname, len) == 0) { /* Regular long option. */ if(argv[i][2+len] == '\0') { /* with no argument provided. */ if(!(opt->flags & TEST_CMDLINE_OPTFLAG_REQUIREDARG__)) ret = callback(opt->id, NULL); else ret = callback(TEST_CMDLINE_OPTID_MISSINGARG__, argv[i]); break; } else if(argv[i][2+len] == '=') { /* with an argument provided. */ if(opt->flags & (TEST_CMDLINE_OPTFLAG_OPTIONALARG__ | TEST_CMDLINE_OPTFLAG_REQUIREDARG__)) { ret = callback(opt->id, argv[i]+2+len+1); } else { sprintf(auxbuf, "--%s", opt->longname); ret = callback(TEST_CMDLINE_OPTID_BOGUSARG__, auxbuf); } break; } else { continue; } } } else if(opt->shortname != '\0' && argv[i][0] == '-') { if(argv[i][1] == opt->shortname) { /* Regular short option. */ if(opt->flags & TEST_CMDLINE_OPTFLAG_REQUIREDARG__) { if(argv[i][2] != '\0') ret = callback(opt->id, argv[i]+2); else if(i+1 < argc) ret = callback(opt->id, argv[++i]); else ret = callback(TEST_CMDLINE_OPTID_MISSINGARG__, argv[i]); break; } else { ret = callback(opt->id, NULL); /* There might be more (argument-less) short options * grouped together. */ if(ret == 0 && argv[i][2] != '\0') ret = test_cmdline_handle_short_opt_group__(options, argv[i]+2, callback); break; } } } } if(opt->id == 0) { /* still not handled? */ if(argv[i][0] != '-') { /* Non-option argument. */ ret = callback(TEST_CMDLINE_OPTID_NONE__, argv[i]); } else { /* Unknown option. */ char* badoptname = argv[i]; if(strncmp(badoptname, "--", 2) == 0) { /* Strip any argument from the long option. */ char* assignement = strchr(badoptname, '='); if(assignement != NULL) { size_t len = assignement - badoptname; if(len > TEST_CMDLINE_AUXBUF_SIZE__) len = TEST_CMDLINE_AUXBUF_SIZE__; strncpy(auxbuf, badoptname, len); auxbuf[len] = '\0'; badoptname = auxbuf; } } ret = callback(TEST_CMDLINE_OPTID_UNKNOWN__, badoptname); } } } if(ret != 0) return ret; i++; } return ret; } static void test_help__(void) { printf("Usage: %s [options] [test...]\n", test_argv0__); printf("\n"); printf("Run the specified unit tests; or if the option '--skip' is used, run all\n"); printf("tests in the suite but those listed. By default, if no tests are specified\n"); printf("on the command line, all unit tests in the suite are run.\n"); printf("\n"); printf("Options:\n"); printf(" -s, --skip Execute all unit tests but the listed ones\n"); printf(" --exec[=WHEN] If supported, execute unit tests as child processes\n"); printf(" (WHEN is one of 'auto', 'always', 'never')\n"); #if defined ACUTEST_WIN__ printf(" -t, --timer Measure test duration\n"); #elif defined ACUTEST_HAS_POSIX_TIMER__ printf(" -t, --timer Measure test duration (real time)\n"); printf(" --timer=TIMER Measure test duration, using given timer\n"); printf(" (TIMER is one of 'real', 'cpu')\n"); #endif printf(" -E, --no-exec Same as --exec=never\n"); printf(" --no-summary Suppress printing of test results summary\n"); printf(" --tap Produce TAP-compliant output\n"); printf(" (See https://testanything.org/)\n"); printf(" -l, --list List unit tests in the suite and exit\n"); printf(" -v, --verbose Make output more verbose\n"); printf(" --verbose=LEVEL Set verbose level to LEVEL:\n"); printf(" 0 ... Be silent\n"); printf(" 1 ... Output one line per test (and summary)\n"); printf(" 2 ... As 1 and failed conditions (this is default)\n"); printf(" 3 ... As 1 and all conditions (and extended summary)\n"); printf(" --color[=WHEN] Enable colorized output\n"); printf(" (WHEN is one of 'auto', 'always', 'never')\n"); printf(" --no-color Same as --color=never\n"); printf(" -h, --help Display this help and exit\n"); if(test_list_size__ < 16) { printf("\n"); test_list_names__(); } } static const TEST_CMDLINE_OPTION__ test_cmdline_options__[] = { { 's', "skip", 's', 0 }, { 0, "exec", 'e', TEST_CMDLINE_OPTFLAG_OPTIONALARG__ }, { 'E', "no-exec", 'E', 0 }, #if defined ACUTEST_WIN__ { 't', "timer", 't', 0 }, #elif defined ACUTEST_HAS_POSIX_TIMER__ { 't', "timer", 't', TEST_CMDLINE_OPTFLAG_OPTIONALARG__ }, #endif { 0, "no-summary", 'S', 0 }, { 0, "tap", 'T', 0 }, { 'l', "list", 'l', 0 }, { 'v', "verbose", 'v', TEST_CMDLINE_OPTFLAG_OPTIONALARG__ }, { 0, "color", 'c', TEST_CMDLINE_OPTFLAG_OPTIONALARG__ }, { 0, "no-color", 'C', 0 }, { 'h', "help", 'h', 0 }, { 0, "worker", 'w', TEST_CMDLINE_OPTFLAG_REQUIREDARG__ }, /* internal */ { 0, NULL, 0, 0 } }; static int test_cmdline_callback__(int id, const char* arg) { switch(id) { case 's': test_skip_mode__ = 1; break; case 'e': if(arg == NULL || strcmp(arg, "always") == 0) { test_no_exec__ = 0; } else if(strcmp(arg, "never") == 0) { test_no_exec__ = 1; } else if(strcmp(arg, "auto") == 0) { /*noop*/ } else { fprintf(stderr, "%s: Unrecognized argument '%s' for option --exec.\n", test_argv0__, arg); fprintf(stderr, "Try '%s --help' for more information.\n", test_argv0__); exit(2); } break; case 'E': test_no_exec__ = 1; break; case 't': #if defined ACUTEST_WIN__ || defined ACUTEST_HAS_POSIX_TIMER__ if(arg == NULL || strcmp(arg, "real") == 0) { test_timer__ = 1; #ifndef ACUTEST_WIN__ } else if(strcmp(arg, "cpu") == 0) { test_timer__ = 2; #endif } else { fprintf(stderr, "%s: Unrecognized argument '%s' for option --timer.\n", test_argv0__, arg); fprintf(stderr, "Try '%s --help' for more information.\n", test_argv0__); exit(2); } #endif break; case 'S': test_no_summary__ = 1; break; case 'T': test_tap__ = 1; break; case 'l': test_list_names__(); exit(0); case 'v': test_verbose_level__ = (arg != NULL ? atoi(arg) : test_verbose_level__+1); break; case 'c': if(arg == NULL || strcmp(arg, "always") == 0) { test_colorize__ = 1; } else if(strcmp(arg, "never") == 0) { test_colorize__ = 0; } else if(strcmp(arg, "auto") == 0) { /*noop*/ } else { fprintf(stderr, "%s: Unrecognized argument '%s' for option --color.\n", test_argv0__, arg); fprintf(stderr, "Try '%s --help' for more information.\n", test_argv0__); exit(2); } break; case 'C': test_colorize__ = 0; break; case 'h': test_help__(); exit(0); case 'w': test_worker__ = 1; test_worker_index__ = atoi(arg); break; case 0: if(test_lookup__(arg) == 0) { fprintf(stderr, "%s: Unrecognized unit test '%s'\n", test_argv0__, arg); fprintf(stderr, "Try '%s --list' for list of unit tests.\n", test_argv0__); exit(2); } break; case TEST_CMDLINE_OPTID_UNKNOWN__: fprintf(stderr, "Unrecognized command line option '%s'.\n", arg); fprintf(stderr, "Try '%s --help' for more information.\n", test_argv0__); exit(2); case TEST_CMDLINE_OPTID_MISSINGARG__: fprintf(stderr, "The command line option '%s' requires an argument.\n", arg); fprintf(stderr, "Try '%s --help' for more information.\n", test_argv0__); exit(2); case TEST_CMDLINE_OPTID_BOGUSARG__: fprintf(stderr, "The command line option '%s' does not expect an argument.\n", arg); fprintf(stderr, "Try '%s --help' for more information.\n", test_argv0__); exit(2); } return 0; } #ifdef ACUTEST_LINUX__ static int test_is_tracer_present__(void) { char buf[256+32+1]; int tracer_present = 0; int fd; ssize_t n_read; fd = open("/proc/self/status", O_RDONLY); if(fd == -1) return 0; n_read = read(fd, buf, sizeof(buf)-1); while(n_read > 0) { static const char pattern[] = "TracerPid:"; const char* field; buf[n_read] = '\0'; field = strstr(buf, pattern); if(field != NULL && field < buf + sizeof(buf) - 32) { pid_t tracer_pid = (pid_t) atoi(field + sizeof(pattern) - 1); tracer_present = (tracer_pid != 0); break; } if(n_read == sizeof(buf)-1) { memmove(buf, buf + sizeof(buf)-1 - 32, 32); n_read = read(fd, buf+32, sizeof(buf)-1-32); if(n_read > 0) n_read += 32; } } close(fd); return tracer_present; } #endif int main(int argc, char** argv) { int i; test_argv0__ = argv[0]; #if defined ACUTEST_UNIX__ test_colorize__ = isatty(STDOUT_FILENO); #elif defined ACUTEST_WIN__ #if defined __BORLANDC__ test_colorize__ = isatty(_fileno(stdout)); #else test_colorize__ = _isatty(_fileno(stdout)); #endif #else test_colorize__ = 0; #endif /* Count all test units */ test_list_size__ = 0; for(i = 0; test_list__[i].func != NULL; i++) test_list_size__++; tests__ = (const struct test__**) malloc(sizeof(const struct test__*) * test_list_size__); test_flags__ = (char*) malloc(sizeof(char) * test_list_size__); if(tests__ == NULL || test_flags__ == NULL) { fprintf(stderr, "Out of memory.\n"); exit(2); } memset((void*) test_flags__, 0, sizeof(char) * test_list_size__); /* Parse options */ test_cmdline_read__(test_cmdline_options__, argc, argv, test_cmdline_callback__); #if defined(ACUTEST_WIN__) SetUnhandledExceptionFilter(test_exception_filter__); #endif /* By default, we want to run all tests. */ if(test_count__ == 0) { for(i = 0; test_list__[i].func != NULL; i++) tests__[i] = &test_list__[i]; test_count__ = test_list_size__; } /* Guess whether we want to run unit tests as child processes. */ if(test_no_exec__ < 0) { test_no_exec__ = 0; if(test_count__ <= 1) { test_no_exec__ = 1; } else { #ifdef ACUTEST_WIN__ if(IsDebuggerPresent()) test_no_exec__ = 1; #endif #ifdef ACUTEST_LINUX__ if(test_is_tracer_present__()) test_no_exec__ = 1; #endif } } if(test_tap__) { /* TAP requires we know test result ("ok", "not ok") before we output * anything about the test, and this gets problematic for larger verbose * levels. */ if(test_verbose_level__ > 2) test_verbose_level__ = 2; /* TAP harness should provide some summary. */ test_no_summary__ = 1; if(!test_worker__) printf("1..%d\n", (int) test_count__); } /* Run the tests */ if(!test_skip_mode__) { /* Run the listed tests. */ for(i = 0; i < (int) test_count__; i++) test_run__(tests__[i], test_worker_index__ + i); } else { /* Run all tests except those listed. */ int index = test_worker_index__; for(i = 0; test_list__[i].func != NULL; i++) { if(!test_flags__[i]) test_run__(&test_list__[i], index++); } } /* Write a summary */ if(!test_no_summary__ && test_verbose_level__ >= 1) { if(test_verbose_level__ >= 3) { test_print_in_color__(TEST_COLOR_DEFAULT_INTENSIVE__, "Summary:\n"); printf(" Count of all unit tests: %4d\n", (int) test_list_size__); printf(" Count of run unit tests: %4d\n", test_stat_run_units__); printf(" Count of failed unit tests: %4d\n", test_stat_failed_units__); printf(" Count of skipped unit tests: %4d\n", (int) test_list_size__ - test_stat_run_units__); } if(test_stat_failed_units__ == 0) { test_print_in_color__(TEST_COLOR_GREEN_INTENSIVE__, "SUCCESS:"); printf(" All unit tests have passed.\n"); } else { test_print_in_color__(TEST_COLOR_RED_INTENSIVE__, "FAILED:"); printf(" %d of %d unit tests %s failed.\n", test_stat_failed_units__, test_stat_run_units__, (test_stat_failed_units__ == 1) ? "has" : "have"); } if(test_verbose_level__ >= 3) printf("\n"); } free((void*) tests__); free((void*) test_flags__); return (test_stat_failed_units__ == 0) ? 0 : 1; } #endif /* #ifndef TEST_NO_MAIN */ #ifdef __cplusplus } /* extern "C" */ #endif #endif /* #ifndef ACUTEST_H__ */ tinyobjloader-2.0.0~rc5+dfsg1/tests/assets/000077500000000000000000000000001364105447200206405ustar00rootroot00000000000000tinyobjloader-2.0.0~rc5+dfsg1/tests/assets/issue-244.mtl000066400000000000000000000001221364105447200230100ustar00rootroot00000000000000newmtl None Ka 0 0 0 Kd 0 0 1 Ks 0 0 0 newmtl None1 Ka 0 0 0 Kd 1 0 0 Ks 0 0 0 tinyobjloader-2.0.0~rc5+dfsg1/tests/issue-177.mtl000066400000000000000000000003141364105447200215160ustar00rootroot00000000000000newmtl white Ka 0 0 0 Kd 1 1 1 Ks 0 0 0 newmtl red Ka 0 0 0 Kd 1 0 0 Ks 0 0 0 newmtl green Ka 0 0 0 Kd 0 1 0 Ks 0 0 0 newmtl blue Ka 0 0 0 Kd 0 0 1 Ks 0 0 0 newmtl light Ka 20 20 20 Kd 1 1 1 Ks 0 0 0 tinyobjloader-2.0.0~rc5+dfsg1/tests/issue-177.obj000066400000000000000000000007701364105447200215020ustar00rootroot00000000000000mtllib issue-177.mtl v 0.000000 2.000000 2.000000 v 0.000000 0.000000 2.000000 v 2.000000 0.000000 2.000000 v 2.000000 2.000000 2.000000 v 0.000000 2.000000 0.000000 v 0.000000 0.000000 0.000000 v 2.000000 0.000000 0.000000 v 2.000000 2.000000 0.000000 # 8 vertices g front cube usemtl white f 1 2 3 4 g back cube # expects white material f 8 7 6 5 g right cube usemtl red f 4 3 7 8 g top cube usemtl white f 5 1 4 8 g left cube usemtl green f 5 6 2 1 g bottom cube usemtl white f 2 6 7 3 # 6 elements tinyobjloader-2.0.0~rc5+dfsg1/tests/tester.cc000066400000000000000000001305651364105447200211650ustar00rootroot00000000000000#define TINYOBJLOADER_IMPLEMENTATION #include "../tiny_obj_loader.h" #if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Weverything" #elif defined(__GNUC__) #pragma GCC diagnostic ignored "-Wmissing-declarations" #pragma GCC diagnostic ignored "-Wignored-qualifiers" #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-qual" #pragma GCC diagnostic ignored "-Wsign-conversion" #pragma GCC diagnostic ignored "-Wformat" #pragma GCC diagnostic ignored "-Wswitch-default" #endif #include "acutest.h" #if defined(__clang__) #pragma clang diagnostic pop #elif defined(__GNUC__) #pragma GCC diagnostic pop #endif #include #include #include #include #include #include template static bool FloatEquals(const T& a, const T& b) { // Edit eps value as you wish. const T eps = std::numeric_limits::epsilon() * static_cast(100); const T abs_diff = std::abs(a - b); if (abs_diff < eps) { return true; } else { return false; } } static void PrintInfo(const tinyobj::attrib_t& attrib, const std::vector& shapes, const std::vector& materials, bool triangulate = true) { std::cout << "# of vertices : " << (attrib.vertices.size() / 3) << std::endl; std::cout << "# of normals : " << (attrib.normals.size() / 3) << std::endl; std::cout << "# of texcoords : " << (attrib.texcoords.size() / 2) << std::endl; std::cout << "# of shapes : " << shapes.size() << std::endl; std::cout << "# of materials : " << materials.size() << std::endl; for (size_t v = 0; v < attrib.vertices.size() / 3; v++) { printf(" v[%ld] = (%f, %f, %f)\n", v, static_cast(attrib.vertices[3 * v + 0]), static_cast(attrib.vertices[3 * v + 1]), static_cast(attrib.vertices[3 * v + 2])); } for (size_t v = 0; v < attrib.normals.size() / 3; v++) { printf(" n[%ld] = (%f, %f, %f)\n", v, static_cast(attrib.normals[3 * v + 0]), static_cast(attrib.normals[3 * v + 1]), static_cast(attrib.normals[3 * v + 2])); } for (size_t v = 0; v < attrib.texcoords.size() / 2; v++) { printf(" uv[%ld] = (%f, %f)\n", v, static_cast(attrib.texcoords[2 * v + 0]), static_cast(attrib.texcoords[2 * v + 1])); } for (size_t i = 0; i < shapes.size(); i++) { printf("shape[%ld].name = %s\n", i, shapes[i].name.c_str()); printf("Size of shape[%ld].indices: %ld\n", i, shapes[i].mesh.indices.size()); if (triangulate) { printf("Size of shape[%ld].material_ids: %ld\n", i, shapes[i].mesh.material_ids.size()); assert((shapes[i].mesh.indices.size() % 3) == 0); for (size_t f = 0; f < shapes[i].mesh.indices.size() / 3; f++) { tinyobj::index_t i0 = shapes[i].mesh.indices[3 * f + 0]; tinyobj::index_t i1 = shapes[i].mesh.indices[3 * f + 1]; tinyobj::index_t i2 = shapes[i].mesh.indices[3 * f + 2]; printf(" idx[%ld] = %d/%d/%d, %d/%d/%d, %d/%d/%d. mat_id = %d\n", f, i0.vertex_index, i0.normal_index, i0.texcoord_index, i1.vertex_index, i1.normal_index, i1.texcoord_index, i2.vertex_index, i2.normal_index, i2.texcoord_index, shapes[i].mesh.material_ids[f]); } } else { for (size_t f = 0; f < shapes[i].mesh.indices.size(); f++) { tinyobj::index_t idx = shapes[i].mesh.indices[f]; printf(" idx[%ld] = %d/%d/%d\n", f, idx.vertex_index, idx.normal_index, idx.texcoord_index); } printf("Size of shape[%ld].material_ids: %ld\n", i, shapes[i].mesh.material_ids.size()); assert(shapes[i].mesh.material_ids.size() == shapes[i].mesh.num_face_vertices.size()); for (size_t m = 0; m < shapes[i].mesh.material_ids.size(); m++) { printf(" material_id[%ld] = %d\n", m, shapes[i].mesh.material_ids[m]); } } printf("shape[%ld].num_faces: %ld\n", i, shapes[i].mesh.num_face_vertices.size()); for (size_t v = 0; v < shapes[i].mesh.num_face_vertices.size(); v++) { printf(" num_vertices[%ld] = %ld\n", v, static_cast(shapes[i].mesh.num_face_vertices[v])); } // printf("shape[%ld].vertices: %ld\n", i, shapes[i].mesh.positions.size()); // assert((shapes[i].mesh.positions.size() % 3) == 0); // for (size_t v = 0; v < shapes[i].mesh.positions.size() / 3; v++) { // printf(" v[%ld] = (%f, %f, %f)\n", v, // static_cast(shapes[i].mesh.positions[3*v+0]), // static_cast(shapes[i].mesh.positions[3*v+1]), // static_cast(shapes[i].mesh.positions[3*v+2])); //} printf("shape[%ld].num_tags: %ld\n", i, shapes[i].mesh.tags.size()); for (size_t t = 0; t < shapes[i].mesh.tags.size(); t++) { printf(" tag[%ld] = %s ", t, shapes[i].mesh.tags[t].name.c_str()); printf(" ints: ["); for (size_t j = 0; j < shapes[i].mesh.tags[t].intValues.size(); ++j) { printf("%ld", static_cast(shapes[i].mesh.tags[t].intValues[j])); if (j < (shapes[i].mesh.tags[t].intValues.size() - 1)) { printf(", "); } } printf("]"); printf(" floats: ["); for (size_t j = 0; j < shapes[i].mesh.tags[t].floatValues.size(); ++j) { printf("%f", static_cast( shapes[i].mesh.tags[t].floatValues[j])); if (j < (shapes[i].mesh.tags[t].floatValues.size() - 1)) { printf(", "); } } printf("]"); printf(" strings: ["); for (size_t j = 0; j < shapes[i].mesh.tags[t].stringValues.size(); ++j) { printf("%s", shapes[i].mesh.tags[t].stringValues[j].c_str()); if (j < (shapes[i].mesh.tags[t].stringValues.size() - 1)) { printf(", "); } } printf("]"); printf("\n"); } } for (size_t i = 0; i < materials.size(); i++) { printf("material[%ld].name = %s\n", i, materials[i].name.c_str()); printf(" material.Ka = (%f, %f ,%f)\n", static_cast(materials[i].ambient[0]), static_cast(materials[i].ambient[1]), static_cast(materials[i].ambient[2])); printf(" material.Kd = (%f, %f ,%f)\n", static_cast(materials[i].diffuse[0]), static_cast(materials[i].diffuse[1]), static_cast(materials[i].diffuse[2])); printf(" material.Ks = (%f, %f ,%f)\n", static_cast(materials[i].specular[0]), static_cast(materials[i].specular[1]), static_cast(materials[i].specular[2])); printf(" material.Tr = (%f, %f ,%f)\n", static_cast(materials[i].transmittance[0]), static_cast(materials[i].transmittance[1]), static_cast(materials[i].transmittance[2])); printf(" material.Ke = (%f, %f ,%f)\n", static_cast(materials[i].emission[0]), static_cast(materials[i].emission[1]), static_cast(materials[i].emission[2])); printf(" material.Ns = %f\n", static_cast(materials[i].shininess)); printf(" material.Ni = %f\n", static_cast(materials[i].ior)); printf(" material.dissolve = %f\n", static_cast(materials[i].dissolve)); printf(" material.illum = %d\n", materials[i].illum); printf(" material.map_Ka = %s\n", materials[i].ambient_texname.c_str()); printf(" material.map_Kd = %s\n", materials[i].diffuse_texname.c_str()); printf(" material.map_Ks = %s\n", materials[i].specular_texname.c_str()); printf(" material.map_Ns = %s\n", materials[i].specular_highlight_texname.c_str()); printf(" material.map_bump = %s\n", materials[i].bump_texname.c_str()); printf(" material.map_d = %s\n", materials[i].alpha_texname.c_str()); printf(" material.disp = %s\n", materials[i].displacement_texname.c_str()); printf(" material.refl = %s\n", materials[i].reflection_texname.c_str()); std::map::const_iterator it( materials[i].unknown_parameter.begin()); std::map::const_iterator itEnd( materials[i].unknown_parameter.end()); for (; it != itEnd; it++) { printf(" material.%s = %s\n", it->first.c_str(), it->second.c_str()); } printf("\n"); } } static bool TestLoadObj(const char* filename, const char* basepath = NULL, bool triangulate = true) { std::cout << "Loading " << filename << std::endl; tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, filename, basepath, triangulate); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } if (!ret) { printf("Failed to load/parse .obj.\n"); return false; } PrintInfo(attrib, shapes, materials, triangulate); return true; } static bool TestLoadObjFromPreopenedFile(const char* filename, const char* basepath = NULL, bool readMaterials = true, bool triangulate = true) { std::string fullFilename = std::string(basepath) + filename; std::cout << "Loading " << fullFilename << std::endl; std::ifstream fileStream(fullFilename.c_str()); if (!fileStream) { std::cerr << "Could not find specified file: " << fullFilename << std::endl; return false; } tinyobj::MaterialStreamReader materialStreamReader(fileStream); tinyobj::MaterialStreamReader* materialReader = readMaterials ? &materialStreamReader : NULL; tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, &fileStream, materialReader); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } if (!ret) { printf("Failed to load/parse .obj.\n"); return false; } std::cout << "Loaded material count: " << materials.size() << "\n"; return true; } static bool TestStreamLoadObj() { std::cout << "Stream Loading " << std::endl; std::stringstream objStream; objStream << "mtllib cube.mtl\n" "\n" "v 0.000000 2.000000 2.000000\n" "v 0.000000 0.000000 2.000000\n" "v 2.000000 0.000000 2.000000\n" "v 2.000000 2.000000 2.000000\n" "v 0.000000 2.000000 0.000000\n" "v 0.000000 0.000000 0.000000\n" "v 2.000000 0.000000 0.000000\n" "v 2.000000 2.000000 0.000000\n" "# 8 vertices\n" "\n" "g front cube\n" "usemtl white\n" "f 1 2 3 4\n" "g back cube\n" "# expects white material\n" "f 8 7 6 5\n" "g right cube\n" "usemtl red\n" "f 4 3 7 8\n" "g top cube\n" "usemtl white\n" "f 5 1 4 8\n" "g left cube\n" "usemtl green\n" "f 5 6 2 1\n" "g bottom cube\n" "usemtl white\n" "f 2 6 7 3\n" "# 6 elements"; std::string matStream( "newmtl white\n" "Ka 0 0 0\n" "Kd 1 1 1\n" "Ks 0 0 0\n" "\n" "newmtl red\n" "Ka 0 0 0\n" "Kd 1 0 0\n" "Ks 0 0 0\n" "\n" "newmtl green\n" "Ka 0 0 0\n" "Kd 0 1 0\n" "Ks 0 0 0\n" "\n" "newmtl blue\n" "Ka 0 0 0\n" "Kd 0 0 1\n" "Ks 0 0 0\n" "\n" "newmtl light\n" "Ka 20 20 20\n" "Kd 1 1 1\n" "Ks 0 0 0"); using namespace tinyobj; class MaterialStringStreamReader : public MaterialReader { public: MaterialStringStreamReader(const std::string& matSStream) : m_matSStream(matSStream) {} virtual ~MaterialStringStreamReader() {} virtual bool operator()(const std::string& matId, std::vector* materials, std::map* matMap, std::string* warn, std::string* err) { (void)matId; (void)warn; (void)err; std::string warning; std::string error_msg; LoadMtl(matMap, materials, &m_matSStream, &warning, &error_msg); return true; } private: std::stringstream m_matSStream; }; MaterialStringStreamReader matSSReader(matStream); tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, &objStream, &matSSReader); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } if (!ret) { return false; } PrintInfo(attrib, shapes, materials); return true; } const char* gMtlBasePath = "../models/"; void test_cornell_box() { TEST_CHECK(true == TestLoadObj("../models/cornell_box.obj", gMtlBasePath)); } void test_catmark_torus_creases0() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/catmark_torus_creases0.obj", gMtlBasePath, /*triangulate*/ false); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(1 == shapes.size()); TEST_CHECK(8 == shapes[0].mesh.tags.size()); } void test_pbr() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/pbr-mat-ext.obj", gMtlBasePath, /*triangulate*/ false); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(1 == materials.size()); TEST_CHECK(FloatEquals(0.2f, materials[0].roughness)); TEST_CHECK(FloatEquals(0.3f, materials[0].metallic)); TEST_CHECK(FloatEquals(0.4f, materials[0].sheen)); TEST_CHECK(FloatEquals(0.5f, materials[0].clearcoat_thickness)); TEST_CHECK(FloatEquals(0.6f, materials[0].clearcoat_roughness)); TEST_CHECK(FloatEquals(0.7f, materials[0].anisotropy)); TEST_CHECK(FloatEquals(0.8f, materials[0].anisotropy_rotation)); TEST_CHECK(0 == materials[0].roughness_texname.compare("roughness.tex")); TEST_CHECK(0 == materials[0].metallic_texname.compare("metallic.tex")); TEST_CHECK(0 == materials[0].sheen_texname.compare("sheen.tex")); TEST_CHECK(0 == materials[0].emissive_texname.compare("emissive.tex")); TEST_CHECK(0 == materials[0].normal_texname.compare("normalmap.tex")); } void test_stream_load() { TEST_CHECK(true == TestStreamLoadObj()); } void test_stream_load_from_file_skipping_materials() { TEST_CHECK(true == TestLoadObjFromPreopenedFile( "../models/pbr-mat-ext.obj", gMtlBasePath, /*readMaterials*/ false, /*triangulate*/ false)); } void test_stream_load_from_file_with_materials() { TEST_CHECK(true == TestLoadObjFromPreopenedFile( "../models/pbr-mat-ext.obj", gMtlBasePath, /*readMaterials*/ true, /*triangulate*/ false)); } void test_trailing_whitespace_in_mtl_issue92() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/issue-92.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(1 == materials.size()); TEST_CHECK(0 == materials[0].diffuse_texname.compare("tmp.png")); } void test_transmittance_filter_issue95() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/issue-95.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(1 == materials.size()); TEST_CHECK(FloatEquals(0.1f, materials[0].transmittance[0])); TEST_CHECK(FloatEquals(0.2f, materials[0].transmittance[1])); TEST_CHECK(FloatEquals(0.3f, materials[0].transmittance[2])); } void test_transmittance_filter_Tf_issue95() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/issue-95-2.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(1 == materials.size()); TEST_CHECK(FloatEquals(0.1f, materials[0].transmittance[0])); TEST_CHECK(FloatEquals(0.2f, materials[0].transmittance[1])); TEST_CHECK(FloatEquals(0.3f, materials[0].transmittance[2])); } void test_transmittance_filter_Kt_issue95() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/issue-95.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(1 == materials.size()); TEST_CHECK(FloatEquals(0.1f, materials[0].transmittance[0])); TEST_CHECK(FloatEquals(0.2f, materials[0].transmittance[1])); TEST_CHECK(FloatEquals(0.3f, materials[0].transmittance[2])); } void test_usemtl_at_last_line_issue104() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/usemtl-issue-104.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(1 == shapes.size()); } void test_texture_opts_issue85() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/texture-options-issue-85.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(1 == shapes.size()); TEST_CHECK(3 == materials.size()); TEST_CHECK(0 == materials[0].name.compare("default")); TEST_CHECK(0 == materials[1].name.compare("bm2")); TEST_CHECK(0 == materials[2].name.compare("bm3")); TEST_CHECK(true == materials[0].ambient_texopt.clamp); TEST_CHECK(FloatEquals(0.1f, materials[0].diffuse_texopt.origin_offset[0])); TEST_CHECK(FloatEquals(0.0f, materials[0].diffuse_texopt.origin_offset[1])); TEST_CHECK(FloatEquals(0.0f, materials[0].diffuse_texopt.origin_offset[2])); TEST_CHECK(FloatEquals(0.1f, materials[0].specular_texopt.scale[0])); TEST_CHECK(FloatEquals(0.2f, materials[0].specular_texopt.scale[1])); TEST_CHECK(FloatEquals(1.0f, materials[0].specular_texopt.scale[2])); TEST_CHECK( FloatEquals(0.1f, materials[0].specular_highlight_texopt.turbulence[0])); TEST_CHECK( FloatEquals(0.2f, materials[0].specular_highlight_texopt.turbulence[1])); TEST_CHECK( FloatEquals(0.3f, materials[0].specular_highlight_texopt.turbulence[2])); TEST_CHECK(FloatEquals(3.0f, materials[0].bump_texopt.bump_multiplier)); TEST_CHECK( FloatEquals(0.1f, materials[1].specular_highlight_texopt.brightness)); TEST_CHECK( FloatEquals(0.3f, materials[1].specular_highlight_texopt.contrast)); TEST_CHECK('r' == materials[1].bump_texopt.imfchan); TEST_CHECK(tinyobj::TEXTURE_TYPE_SPHERE == materials[2].diffuse_texopt.type); TEST_CHECK(tinyobj::TEXTURE_TYPE_CUBE_TOP == materials[2].specular_texopt.type); TEST_CHECK(tinyobj::TEXTURE_TYPE_CUBE_BOTTOM == materials[2].specular_highlight_texopt.type); TEST_CHECK(tinyobj::TEXTURE_TYPE_CUBE_LEFT == materials[2].ambient_texopt.type); TEST_CHECK(tinyobj::TEXTURE_TYPE_CUBE_RIGHT == materials[2].alpha_texopt.type); TEST_CHECK(tinyobj::TEXTURE_TYPE_CUBE_FRONT == materials[2].bump_texopt.type); TEST_CHECK(tinyobj::TEXTURE_TYPE_CUBE_BACK == materials[2].displacement_texopt.type); } void test_mtllib_multiple_filenames_issue112() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/mtllib-multiple-files-issue-112.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(1 == materials.size()); } void test_tr_and_d_issue43() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/tr-and-d-issue-43.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(2 == materials.size()); TEST_CHECK(FloatEquals(0.75f, materials[0].dissolve)); TEST_CHECK(FloatEquals(0.75f, materials[1].dissolve)); } void test_refl() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/refl.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } PrintInfo(attrib, shapes, materials); TEST_CHECK(true == ret); TEST_CHECK(5 == materials.size()); TEST_CHECK(materials[0].reflection_texname.compare("reflection.tga") == 0); } void test_map_Bump() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/map-bump.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } PrintInfo(attrib, shapes, materials); TEST_CHECK(true == ret); TEST_CHECK(2 == materials.size()); TEST_CHECK(materials[0].bump_texname.compare("bump.jpg") == 0); } void test_g_ignored_issue138() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/issue-138.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } PrintInfo(attrib, shapes, materials); TEST_CHECK(true == ret); TEST_CHECK(2 == shapes.size()); TEST_CHECK(2 == materials.size()); } void test_vertex_col_ext_issue144() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/cube-vertexcol.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } // PrintInfo(attrib, shapes, materials); TEST_CHECK(true == ret); TEST_CHECK((8 * 3) == attrib.colors.size()); TEST_CHECK(FloatEquals(0.0f, attrib.colors[3 * 0 + 0])); TEST_CHECK(FloatEquals(0.0f, attrib.colors[3 * 0 + 1])); TEST_CHECK(FloatEquals(0.0f, attrib.colors[3 * 0 + 2])); TEST_CHECK(FloatEquals(0.0f, attrib.colors[3 * 1 + 0])); TEST_CHECK(FloatEquals(0.0f, attrib.colors[3 * 1 + 1])); TEST_CHECK(FloatEquals(1.0f, attrib.colors[3 * 1 + 2])); TEST_CHECK(FloatEquals(1.0f, attrib.colors[3 * 4 + 0])); TEST_CHECK(FloatEquals(1.0f, attrib.colors[3 * 7 + 0])); TEST_CHECK(FloatEquals(1.0f, attrib.colors[3 * 7 + 1])); TEST_CHECK(FloatEquals(1.0f, attrib.colors[3 * 7 + 2])); } void test_norm_texopts() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/norm-texopt.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(1 == shapes.size()); TEST_CHECK(1 == materials.size()); TEST_CHECK(FloatEquals(3.0f, materials[0].normal_texopt.bump_multiplier)); } void test_zero_face_idx_value_issue140() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/issue-140-zero-face-idx.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(false == ret); TEST_CHECK(!err.empty()); } void test_texture_name_whitespace_issue145() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/texture-filename-with-whitespace.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(err.empty()); TEST_CHECK(2 < materials.size()); TEST_CHECK(0 == materials[0].diffuse_texname.compare("texture 01.png")); TEST_CHECK(0 == materials[1].bump_texname.compare("bump 01.png")); TEST_CHECK(FloatEquals(2.0f, materials[1].bump_texopt.bump_multiplier)); } void test_smoothing_group_issue162() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/issue-162-smoothing-group.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(2 == shapes.size()); TEST_CHECK(2 == shapes[0].mesh.smoothing_group_ids.size()); TEST_CHECK(1 == shapes[0].mesh.smoothing_group_ids[0]); TEST_CHECK(1 == shapes[0].mesh.smoothing_group_ids[1]); TEST_CHECK(10 == shapes[1].mesh.smoothing_group_ids.size()); TEST_CHECK(0 == shapes[1].mesh.smoothing_group_ids[0]); TEST_CHECK(0 == shapes[1].mesh.smoothing_group_ids[1]); TEST_CHECK(3 == shapes[1].mesh.smoothing_group_ids[2]); TEST_CHECK(3 == shapes[1].mesh.smoothing_group_ids[3]); TEST_CHECK(4 == shapes[1].mesh.smoothing_group_ids[4]); TEST_CHECK(4 == shapes[1].mesh.smoothing_group_ids[5]); TEST_CHECK(0 == shapes[1].mesh.smoothing_group_ids[6]); TEST_CHECK(0 == shapes[1].mesh.smoothing_group_ids[7]); TEST_CHECK(6 == shapes[1].mesh.smoothing_group_ids[8]); TEST_CHECK(6 == shapes[1].mesh.smoothing_group_ids[9]); } void test_invalid_face_definition() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/invalid-face-definition.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(1 == shapes.size()); TEST_CHECK(0 == shapes[0].mesh.indices.size()); } void test_Empty_mtl_basedir_issue177() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; // A case where the user explicitly provides an empty string // Win32 specific? const char* userBaseDir = ""; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "issue-177.obj", userBaseDir); // if mtl loading fails, we get an warning message here ret &= warn.empty(); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); } void test_line_primitive() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/line-prim.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(1 == shapes.size()); TEST_CHECK(8 == shapes[0].lines.indices.size()); TEST_CHECK(2 == shapes[0].lines.num_line_vertices.size()); } void test_points_primitive() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/points-prim.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(1 == shapes.size()); TEST_CHECK(8 == shapes[0].points.indices.size()); } void test_multiple_group_names() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/cube.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(6 == shapes.size()); TEST_CHECK(0 == shapes[0].name.compare("front cube")); TEST_CHECK(0 == shapes[1].name.compare("back cube")); // multiple whitespaces // are aggregated as // single white space. } void test_initialize_all_texopts() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/cornell_box.obj", gMtlBasePath, false); TEST_CHECK(ret == true); TEST_CHECK(0 < materials.size()); #define TEST_CHECK_DEFAULT_TEXOPT(texopt) \ TEST_CHECK(tinyobj::TEXTURE_TYPE_NONE == texopt.type); \ TEST_CHECK(0.0 == texopt.brightness); \ TEST_CHECK(1.0 == texopt.contrast); \ TEST_CHECK(false == texopt.clamp); \ TEST_CHECK(true == texopt.blendu); \ TEST_CHECK(true == texopt.blendv); \ TEST_CHECK(1.0 == texopt.bump_multiplier); \ for (int j = 0; j < 3; j++) { \ TEST_CHECK(0.0 == texopt.origin_offset[j]); \ TEST_CHECK(1.0 == texopt.scale[j]); \ TEST_CHECK(0.0 == texopt.turbulence[j]); \ } for (size_t i = 0; i < materials.size(); i++) { TEST_CHECK_DEFAULT_TEXOPT(materials[i].ambient_texopt); TEST_CHECK_DEFAULT_TEXOPT(materials[i].diffuse_texopt); TEST_CHECK_DEFAULT_TEXOPT(materials[i].specular_texopt); TEST_CHECK_DEFAULT_TEXOPT(materials[i].specular_highlight_texopt); TEST_CHECK_DEFAULT_TEXOPT(materials[i].bump_texopt); TEST_CHECK_DEFAULT_TEXOPT(materials[i].displacement_texopt); TEST_CHECK_DEFAULT_TEXOPT(materials[i].alpha_texopt); TEST_CHECK_DEFAULT_TEXOPT(materials[i].reflection_texopt); TEST_CHECK_DEFAULT_TEXOPT(materials[i].roughness_texopt); TEST_CHECK_DEFAULT_TEXOPT(materials[i].metallic_texopt); TEST_CHECK_DEFAULT_TEXOPT(materials[i].sheen_texopt); TEST_CHECK_DEFAULT_TEXOPT(materials[i].emissive_texopt); TEST_CHECK_DEFAULT_TEXOPT(materials[i].normal_texopt); } #undef TEST_CHECK_DEFAULT_TEXOPT } void test_colorspace_issue184() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/colorspace-issue-184.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(1 == shapes.size()); TEST_CHECK(1 == materials.size()); TEST_CHECK(0 == materials[0].diffuse_texopt.colorspace.compare("sRGB")); TEST_CHECK(0 == materials[0].specular_texopt.colorspace.size()); TEST_CHECK(0 == materials[0].bump_texopt.colorspace.compare("linear")); } void test_leading_decimal_dots_issue201() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, "../models/leading-decimal-dot-issue-201.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(1 == shapes.size()); TEST_CHECK(1 == materials.size()); TEST_CHECK(FloatEquals(0.8e-1f, attrib.vertices[0])); TEST_CHECK(FloatEquals(-.7e+2f, attrib.vertices[1])); TEST_CHECK(FloatEquals(.575869f, attrib.vertices[3])); TEST_CHECK(FloatEquals(-.666304f, attrib.vertices[4])); TEST_CHECK(FloatEquals(.940448f, attrib.vertices[6])); } void test_mtl_default_search_path_v2_API_issue208() { tinyobj::ObjReader reader; bool ret = reader.ParseFromFile("../models/cornell_box.obj"); std::cout << "WARN: " << reader.Warning() << "\n"; TEST_CHECK(ret == true); TEST_CHECK(reader.Warning().empty()); } void test_leading_zero_in_exponent_notation_issue210() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj( &attrib, &shapes, &materials, &warn, &err, "../models/leading-zero-in-exponent-notation-issue-210.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(1 == shapes.size()); TEST_CHECK(1 == materials.size()); TEST_CHECK(FloatEquals(0.8e-001f, attrib.vertices[0])); TEST_CHECK(FloatEquals(-.7e+02f, attrib.vertices[1])); std::cout << "exp " << 0.8e-01 << std::endl; std::cout << "bora " << attrib.vertices[0] << std::endl; } void test_usemtl_then_o_issue235() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj( &attrib, &shapes, &materials, &warn, &err, "../models/issue-235-usemtl-then-o.obj", gMtlBasePath); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(2 == shapes.size()); TEST_CHECK(2 == materials.size()); TEST_CHECK(4 == shapes[1].mesh.indices[0].vertex_index); } void test_mtl_searchpaths_issue244() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; // .mtl is located at ./assets/issue-244.mtl #if _WIN32 std::string search_paths("../;../models;./assets"); #else std::string search_paths("../:../models:./assets"); #endif std::string warn; std::string err; bool ret = tinyobj::LoadObj( &attrib, &shapes, &materials, &warn, &err, "../models/issue-244-mtl-searchpaths.obj", search_paths.c_str()); TEST_CHECK(warn.empty()); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(2 == shapes.size()); TEST_CHECK(2 == materials.size()); TEST_CHECK(4 == shapes[1].mesh.indices[0].vertex_index); } void test_usemtl_whitespace_issue246() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj( &attrib, &shapes, &materials, &warn, &err, "../models/issue-246-usemtl-whitespace.obj", gMtlBasePath); TEST_CHECK(warn.empty()); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(1 == shapes.size()); TEST_CHECK(1 == materials.size()); TEST_CHECK(0 == shapes[0].mesh.material_ids[0]); } void test_texres_texopt_issue248() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string warn; std::string err; bool ret = tinyobj::LoadObj( &attrib, &shapes, &materials, &warn, &err, "../models/issue-248-texres-texopt.obj", gMtlBasePath); TEST_CHECK(warn.empty()); if (!warn.empty()) { std::cout << "WARN: " << warn << std::endl; } if (!err.empty()) { std::cerr << "ERR: " << err << std::endl; } TEST_CHECK(true == ret); TEST_CHECK(1 < materials.size()); TEST_CHECK(512 == materials[0].diffuse_texopt.texture_resolution); TEST_CHECK("input.jpg" == materials[0].diffuse_texname); } // Fuzzer test. // Just check if it does not crash. // Disable by default since Windows filesystem can't create filename of afl // testdata #if 0 void test_afl000000", "[AFL]() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &err, "./afl/id:000000,sig:11,src:000000,op:havoc,rep:128", gMtlBasePath); TEST_CHECK(true == ret); } void test_afl000001", "[AFL]() { tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; std::string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &err, "./afl/id:000001,sig:11,src:000000,op:havoc,rep:64", gMtlBasePath); TEST_CHECK(true == ret); } #endif #if 0 int main( int argc, char **argv) { if (argc > 1) { const char* basepath = NULL; if (argc > 2) { basepath = argv[2]; } assert(true == TestLoadObj(argv[1], basepath)); } else { //assert(true == TestLoadObj("cornell_box.obj")); //assert(true == TestLoadObj("cube.obj")); assert(true == TestStreamLoadObj()); assert(true == TestLoadObj("catmark_torus_creases0.obj", NULL, false)); } return 0; } #endif TEST_LIST = { {"cornell_box", test_cornell_box}, {"catmark_torus_creases0", test_catmark_torus_creases0}, {"pbr", test_pbr}, {"stream_load", test_stream_load}, {"stream_load_from_file_skipping_materials", test_stream_load_from_file_skipping_materials}, {"stream_load_from_file_with_materials", test_stream_load_from_file_with_materials}, {"trailing_whitespace_in_mtl_issue92", test_trailing_whitespace_in_mtl_issue92}, {"transmittance_filter_issue95", test_transmittance_filter_issue95}, {"transmittance_filter_Tf_issue95", test_transmittance_filter_Tf_issue95}, {"transmittance_filter_Kt_issue95", test_transmittance_filter_Kt_issue95}, {"usemtl_at_last_line_issue104", test_usemtl_at_last_line_issue104}, {"texture_opts_issue85", test_texture_opts_issue85}, {"mtllib_multiple_filenames_issue112", test_mtllib_multiple_filenames_issue112}, {"tr_and_d_issue43", test_tr_and_d_issue43}, {"refl", test_refl}, {"map_bump", test_map_Bump}, {"g_ignored_issue138", test_g_ignored_issue138}, {"vertex_col_ext_issue144", test_vertex_col_ext_issue144}, {"norm_texopts", test_norm_texopts}, {"zero_face_idx_value_issue140", test_zero_face_idx_value_issue140}, {"texture_name_whitespace_issue145", test_texture_name_whitespace_issue145}, {"smoothing_group_issue162", test_smoothing_group_issue162}, {"invalid_face_definition", test_invalid_face_definition}, {"Empty_mtl_basedir_issue177", test_Empty_mtl_basedir_issue177}, {"line_primitive", test_line_primitive}, {"points_primitive", test_points_primitive}, {"multiple_group_names", test_multiple_group_names}, {"initialize_all_texopts", test_initialize_all_texopts}, {"colorspace_issue184", test_colorspace_issue184}, {"leading_decimal_dots_issue201", test_leading_decimal_dots_issue201}, {"mtl_default_search_path_v2_API_issue208", test_mtl_default_search_path_v2_API_issue208}, {"leading_zero_in_exponent_notation_issue210", test_leading_zero_in_exponent_notation_issue210}, {"usemtl_then_o_issue235", test_usemtl_then_o_issue235}, {"mtl_searchpaths_issue244", test_mtl_searchpaths_issue244}, {"usemtl_whitespece_issue246", test_usemtl_whitespace_issue246}, {"texres_texopt_issue248", test_texres_texopt_issue248}, {NULL, NULL}}; tinyobjloader-2.0.0~rc5+dfsg1/tiny_obj_loader.cc000066400000000000000000000001021364105447200216370ustar00rootroot00000000000000#define TINYOBJLOADER_IMPLEMENTATION #include "tiny_obj_loader.h" tinyobjloader-2.0.0~rc5+dfsg1/tiny_obj_loader.h000066400000000000000000002621361364105447200215220ustar00rootroot00000000000000/* The MIT License (MIT) Copyright (c) 2012-2018 Syoyo Fujita and many contributors. 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. */ // // version 2.0.0 : Add new object oriented API. 1.x API is still provided. // * Support line primitive. // * Support points primitive. // * Support multiple search path for .mtl(v1 API). // version 1.4.0 : Modifed ParseTextureNameAndOption API // version 1.3.1 : Make ParseTextureNameAndOption API public // version 1.3.0 : Separate warning and error message(breaking API of LoadObj) // version 1.2.3 : Added color space extension('-colorspace') to tex opts. // version 1.2.2 : Parse multiple group names. // version 1.2.1 : Added initial support for line('l') primitive(PR #178) // version 1.2.0 : Hardened implementation(#175) // version 1.1.1 : Support smoothing groups(#162) // version 1.1.0 : Support parsing vertex color(#144) // version 1.0.8 : Fix parsing `g` tag just after `usemtl`(#138) // version 1.0.7 : Support multiple tex options(#126) // version 1.0.6 : Add TINYOBJLOADER_USE_DOUBLE option(#124) // version 1.0.5 : Ignore `Tr` when `d` exists in MTL(#43) // version 1.0.4 : Support multiple filenames for 'mtllib'(#112) // version 1.0.3 : Support parsing texture options(#85) // version 1.0.2 : Improve parsing speed by about a factor of 2 for large // files(#105) // version 1.0.1 : Fixes a shape is lost if obj ends with a 'usemtl'(#104) // version 1.0.0 : Change data structure. Change license from BSD to MIT. // // // Use this in *one* .cc // #define TINYOBJLOADER_IMPLEMENTATION // #include "tiny_obj_loader.h" // #ifndef TINY_OBJ_LOADER_H_ #define TINY_OBJ_LOADER_H_ #include #include #include namespace tinyobj { // TODO(syoyo): Better C++11 detection for older compiler #if __cplusplus > 199711L #define TINYOBJ_OVERRIDE override #else #define TINYOBJ_OVERRIDE #endif #ifdef __clang__ #pragma clang diagnostic push #if __has_warning("-Wzero-as-null-pointer-constant") #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" #endif #pragma clang diagnostic ignored "-Wpadded" #endif // https://en.wikipedia.org/wiki/Wavefront_.obj_file says ... // // -blendu on | off # set horizontal texture blending // (default on) // -blendv on | off # set vertical texture blending // (default on) // -boost real_value # boost mip-map sharpness // -mm base_value gain_value # modify texture map values (default // 0 1) // # base_value = brightness, // gain_value = contrast // -o u [v [w]] # Origin offset (default // 0 0 0) // -s u [v [w]] # Scale (default // 1 1 1) // -t u [v [w]] # Turbulence (default // 0 0 0) // -texres resolution # texture resolution to create // -clamp on | off # only render texels in the clamped // 0-1 range (default off) // # When unclamped, textures are // repeated across a surface, // # when clamped, only texels which // fall within the 0-1 // # range are rendered. // -bm mult_value # bump multiplier (for bump maps // only) // // -imfchan r | g | b | m | l | z # specifies which channel of the file // is used to // # create a scalar or bump texture. // r:red, g:green, // # b:blue, m:matte, l:luminance, // z:z-depth.. // # (the default for bump is 'l' and // for decal is 'm') // bump -imfchan r bumpmap.tga # says to use the red channel of // bumpmap.tga as the bumpmap // // For reflection maps... // // -type sphere # specifies a sphere for a "refl" // reflection map // -type cube_top | cube_bottom | # when using a cube map, the texture // file for each // cube_front | cube_back | # side of the cube is specified // separately // cube_left | cube_right // // TinyObjLoader extension. // // -colorspace SPACE # Color space of the texture. e.g. // 'sRGB` or 'linear' // #ifdef TINYOBJLOADER_USE_DOUBLE //#pragma message "using double" typedef double real_t; #else //#pragma message "using float" typedef float real_t; #endif typedef enum { TEXTURE_TYPE_NONE, // default TEXTURE_TYPE_SPHERE, TEXTURE_TYPE_CUBE_TOP, TEXTURE_TYPE_CUBE_BOTTOM, TEXTURE_TYPE_CUBE_FRONT, TEXTURE_TYPE_CUBE_BACK, TEXTURE_TYPE_CUBE_LEFT, TEXTURE_TYPE_CUBE_RIGHT } texture_type_t; typedef struct { texture_type_t type; // -type (default TEXTURE_TYPE_NONE) real_t sharpness; // -boost (default 1.0?) real_t brightness; // base_value in -mm option (default 0) real_t contrast; // gain_value in -mm option (default 1) real_t origin_offset[3]; // -o u [v [w]] (default 0 0 0) real_t scale[3]; // -s u [v [w]] (default 1 1 1) real_t turbulence[3]; // -t u [v [w]] (default 0 0 0) int texture_resolution; // -texres resolution (No default value in the spec. We'll use -1) bool clamp; // -clamp (default false) char imfchan; // -imfchan (the default for bump is 'l' and for decal is 'm') bool blendu; // -blendu (default on) bool blendv; // -blendv (default on) real_t bump_multiplier; // -bm (for bump maps only, default 1.0) // extension std::string colorspace; // Explicitly specify color space of stored texel // value. Usually `sRGB` or `linear` (default empty). } texture_option_t; typedef struct _material_t { std::string name; real_t ambient[3]; real_t diffuse[3]; real_t specular[3]; real_t transmittance[3]; real_t emission[3]; real_t shininess; real_t ior; // index of refraction real_t dissolve; // 1 == opaque; 0 == fully transparent // illumination model (see http://www.fileformat.info/format/material/) int illum; int dummy; // Suppress padding warning. std::string ambient_texname; // map_Ka std::string diffuse_texname; // map_Kd std::string specular_texname; // map_Ks std::string specular_highlight_texname; // map_Ns std::string bump_texname; // map_bump, map_Bump, bump std::string displacement_texname; // disp std::string alpha_texname; // map_d std::string reflection_texname; // refl texture_option_t ambient_texopt; texture_option_t diffuse_texopt; texture_option_t specular_texopt; texture_option_t specular_highlight_texopt; texture_option_t bump_texopt; texture_option_t displacement_texopt; texture_option_t alpha_texopt; texture_option_t reflection_texopt; // PBR extension // http://exocortex.com/blog/extending_wavefront_mtl_to_support_pbr real_t roughness; // [0, 1] default 0 real_t metallic; // [0, 1] default 0 real_t sheen; // [0, 1] default 0 real_t clearcoat_thickness; // [0, 1] default 0 real_t clearcoat_roughness; // [0, 1] default 0 real_t anisotropy; // aniso. [0, 1] default 0 real_t anisotropy_rotation; // anisor. [0, 1] default 0 real_t pad0; std::string roughness_texname; // map_Pr std::string metallic_texname; // map_Pm std::string sheen_texname; // map_Ps std::string emissive_texname; // map_Ke std::string normal_texname; // norm. For normal mapping. texture_option_t roughness_texopt; texture_option_t metallic_texopt; texture_option_t sheen_texopt; texture_option_t emissive_texopt; texture_option_t normal_texopt; int pad2; std::map unknown_parameter; #ifdef TINY_OBJ_LOADER_PYTHON_BINDING // For pybind11 std::array GetDiffuse() { std::array values; values[0] = double(diffuse[0]); values[1] = double(diffuse[1]); values[2] = double(diffuse[2]); return values; } std::array GetSpecular() { std::array values; values[0] = double(specular[0]); values[1] = double(specular[1]); values[2] = double(specular[2]); return values; } std::array GetTransmittance() { std::array values; values[0] = double(transmittance[0]); values[1] = double(transmittance[1]); values[2] = double(transmittance[2]); return values; } std::array GetEmission() { std::array values; values[0] = double(emission[0]); values[1] = double(emission[1]); values[2] = double(emission[2]); return values; } std::array GetAmbient() { std::array values; values[0] = double(ambient[0]); values[1] = double(ambient[1]); values[2] = double(ambient[2]); return values; } void SetDiffuse(std::array &a) { diffuse[0] = real_t(a[0]); diffuse[1] = real_t(a[1]); diffuse[2] = real_t(a[2]); } void SetAmbient(std::array &a) { ambient[0] = real_t(a[0]); ambient[1] = real_t(a[1]); ambient[2] = real_t(a[2]); } void SetSpecular(std::array &a) { specular[0] = real_t(a[0]); specular[1] = real_t(a[1]); specular[2] = real_t(a[2]); } void SetTransmittance(std::array &a) { transmittance[0] = real_t(a[0]); transmittance[1] = real_t(a[1]); transmittance[2] = real_t(a[2]); } std::string GetCustomParameter(const std::string &key) { std::map::const_iterator it = unknown_parameter.find(key); if (it != unknown_parameter.end()) { return it->second; } return std::string(); } #endif } material_t; typedef struct { std::string name; std::vector intValues; std::vector floatValues; std::vector stringValues; } tag_t; // Index struct to support different indices for vtx/normal/texcoord. // -1 means not used. typedef struct { int vertex_index; int normal_index; int texcoord_index; } index_t; typedef struct { std::vector indices; std::vector num_face_vertices; // The number of vertices per // face. 3 = triangle, 4 = quad, // ... Up to 255 vertices per face. std::vector material_ids; // per-face material ID std::vector smoothing_group_ids; // per-face smoothing group // ID(0 = off. positive value // = group id) std::vector tags; // SubD tag } mesh_t; // typedef struct { // std::vector indices; // pairs of indices for lines //} path_t; typedef struct { // Linear flattened indices. std::vector indices; // indices for vertices(poly lines) std::vector num_line_vertices; // The number of vertices per line. } lines_t; typedef struct { std::vector indices; // indices for points } points_t; typedef struct { std::string name; mesh_t mesh; lines_t lines; points_t points; } shape_t; // Vertex attributes struct attrib_t { std::vector vertices; // 'v'(xyz) // For backward compatibility, we store vertex weight in separate array. std::vector vertex_weights; // 'v'(w) std::vector normals; // 'vn' std::vector texcoords; // 'vt'(uv) // For backward compatibility, we store texture coordinate 'w' in separate // array. std::vector texcoord_ws; // 'vt'(w) std::vector colors; // extension: vertex colors attrib_t() {} // // For pybind11 // const std::vector &GetVertices() const { return vertices; } const std::vector &GetVertexWeights() const { return vertex_weights; } }; typedef struct callback_t_ { // W is optional and set to 1 if there is no `w` item in `v` line void (*vertex_cb)(void *user_data, real_t x, real_t y, real_t z, real_t w); void (*normal_cb)(void *user_data, real_t x, real_t y, real_t z); // y and z are optional and set to 0 if there is no `y` and/or `z` item(s) in // `vt` line. void (*texcoord_cb)(void *user_data, real_t x, real_t y, real_t z); // called per 'f' line. num_indices is the number of face indices(e.g. 3 for // triangle, 4 for quad) // 0 will be passed for undefined index in index_t members. void (*index_cb)(void *user_data, index_t *indices, int num_indices); // `name` material name, `material_id` = the array index of material_t[]. -1 // if // a material not found in .mtl void (*usemtl_cb)(void *user_data, const char *name, int material_id); // `materials` = parsed material data. void (*mtllib_cb)(void *user_data, const material_t *materials, int num_materials); // There may be multiple group names void (*group_cb)(void *user_data, const char **names, int num_names); void (*object_cb)(void *user_data, const char *name); callback_t_() : vertex_cb(NULL), normal_cb(NULL), texcoord_cb(NULL), index_cb(NULL), usemtl_cb(NULL), mtllib_cb(NULL), group_cb(NULL), object_cb(NULL) {} } callback_t; class MaterialReader { public: MaterialReader() {} virtual ~MaterialReader(); virtual bool operator()(const std::string &matId, std::vector *materials, std::map *matMap, std::string *warn, std::string *err) = 0; }; /// /// Read .mtl from a file. /// class MaterialFileReader : public MaterialReader { public: // Path could contain separator(';' in Windows, ':' in Posix) explicit MaterialFileReader(const std::string &mtl_basedir) : m_mtlBaseDir(mtl_basedir) {} virtual ~MaterialFileReader() {} virtual bool operator()(const std::string &matId, std::vector *materials, std::map *matMap, std::string *warn, std::string *err) TINYOBJ_OVERRIDE; private: std::string m_mtlBaseDir; }; /// /// Read .mtl from a stream. /// class MaterialStreamReader : public MaterialReader { public: explicit MaterialStreamReader(std::istream &inStream) : m_inStream(inStream) {} virtual ~MaterialStreamReader() {} virtual bool operator()(const std::string &matId, std::vector *materials, std::map *matMap, std::string *warn, std::string *err) TINYOBJ_OVERRIDE; private: std::istream &m_inStream; }; // v2 API struct ObjReaderConfig { bool triangulate; // triangulate polygon? /// Parse vertex color. /// If vertex color is not present, its filled with default value. /// false = no vertex color /// This will increase memory of parsed .obj bool vertex_color; /// /// Search path to .mtl file. /// Default = "" = search from the same directory of .obj file. /// Valid only when loading .obj from a file. /// std::string mtl_search_path; ObjReaderConfig() : triangulate(true), vertex_color(true) {} }; /// /// Wavefront .obj reader class(v2 API) /// class ObjReader { public: ObjReader() : valid_(false) {} ~ObjReader() {} /// /// Load .obj and .mtl from a file. /// /// @param[in] filename wavefront .obj filename /// @param[in] config Reader configuration /// bool ParseFromFile(const std::string &filename, const ObjReaderConfig &config = ObjReaderConfig()); /// /// Parse .obj from a text string. /// Need to supply .mtl text string by `mtl_text`. /// This function ignores `mtllib` line in .obj text. /// /// @param[in] obj_text wavefront .obj filename /// @param[in] mtl_text wavefront .mtl filename /// @param[in] config Reader configuration /// bool ParseFromString(const std::string &obj_text, const std::string &mtl_text, const ObjReaderConfig &config = ObjReaderConfig()); /// /// .obj was loaded or parsed correctly. /// bool Valid() const { return valid_; } const attrib_t &GetAttrib() const { return attrib_; } const std::vector &GetShapes() const { return shapes_; } const std::vector &GetMaterials() const { return materials_; } /// /// Warning message(may be filled after `Load` or `Parse`) /// const std::string &Warning() const { return warning_; } /// /// Error message(filled when `Load` or `Parse` failed) /// const std::string &Error() const { return error_; } private: bool valid_; attrib_t attrib_; std::vector shapes_; std::vector materials_; std::string warning_; std::string error_; }; /// ==>>========= Legacy v1 API ============================================= /// Loads .obj from a file. /// 'attrib', 'shapes' and 'materials' will be filled with parsed shape data /// 'shapes' will be filled with parsed shape data /// Returns true when loading .obj become success. /// Returns warning message into `warn`, and error message into `err` /// 'mtl_basedir' is optional, and used for base directory for .mtl file. /// In default(`NULL'), .mtl file is searched from an application's working /// directory. /// 'triangulate' is optional, and used whether triangulate polygon face in .obj /// or not. /// Option 'default_vcols_fallback' specifies whether vertex colors should /// always be defined, even if no colors are given (fallback to white). bool LoadObj(attrib_t *attrib, std::vector *shapes, std::vector *materials, std::string *warn, std::string *err, const char *filename, const char *mtl_basedir = NULL, bool triangulate = true, bool default_vcols_fallback = true); /// Loads .obj from a file with custom user callback. /// .mtl is loaded as usual and parsed material_t data will be passed to /// `callback.mtllib_cb`. /// Returns true when loading .obj/.mtl become success. /// Returns warning message into `warn`, and error message into `err` /// See `examples/callback_api/` for how to use this function. bool LoadObjWithCallback(std::istream &inStream, const callback_t &callback, void *user_data = NULL, MaterialReader *readMatFn = NULL, std::string *warn = NULL, std::string *err = NULL); /// Loads object from a std::istream, uses `readMatFn` to retrieve /// std::istream for materials. /// Returns true when loading .obj become success. /// Returns warning and error message into `err` bool LoadObj(attrib_t *attrib, std::vector *shapes, std::vector *materials, std::string *warn, std::string *err, std::istream *inStream, MaterialReader *readMatFn = NULL, bool triangulate = true, bool default_vcols_fallback = true); /// Loads materials into std::map void LoadMtl(std::map *material_map, std::vector *materials, std::istream *inStream, std::string *warning, std::string *err); /// /// Parse texture name and texture option for custom texture parameter through /// material::unknown_parameter /// /// @param[out] texname Parsed texture name /// @param[out] texopt Parsed texopt /// @param[in] linebuf Input string /// bool ParseTextureNameAndOption(std::string *texname, texture_option_t *texopt, const char *linebuf); /// =<<========== Legacy v1 API ============================================= } // namespace tinyobj #endif // TINY_OBJ_LOADER_H_ #ifdef TINYOBJLOADER_IMPLEMENTATION #include #include #include #include #include #include #include #include #include #include namespace tinyobj { MaterialReader::~MaterialReader() {} struct vertex_index_t { int v_idx, vt_idx, vn_idx; vertex_index_t() : v_idx(-1), vt_idx(-1), vn_idx(-1) {} explicit vertex_index_t(int idx) : v_idx(idx), vt_idx(idx), vn_idx(idx) {} vertex_index_t(int vidx, int vtidx, int vnidx) : v_idx(vidx), vt_idx(vtidx), vn_idx(vnidx) {} }; // Internal data structure for face representation // index + smoothing group. struct face_t { unsigned int smoothing_group_id; // smoothing group id. 0 = smoothing groupd is off. int pad_; std::vector vertex_indices; // face vertex indices. face_t() : smoothing_group_id(0), pad_(0) {} }; // Internal data structure for line representation struct __line_t { // l v1/vt1 v2/vt2 ... // In the specification, line primitrive does not have normal index, but // TinyObjLoader allow it std::vector vertex_indices; }; // Internal data structure for points representation struct __points_t { // p v1 v2 ... // In the specification, point primitrive does not have normal index and // texture coord index, but TinyObjLoader allow it. std::vector vertex_indices; }; struct tag_sizes { tag_sizes() : num_ints(0), num_reals(0), num_strings(0) {} int num_ints; int num_reals; int num_strings; }; struct obj_shape { std::vector v; std::vector vn; std::vector vt; }; // // Manages group of primitives(face, line, points, ...) struct PrimGroup { std::vector faceGroup; std::vector<__line_t> lineGroup; std::vector<__points_t> pointsGroup; void clear() { faceGroup.clear(); lineGroup.clear(); pointsGroup.clear(); } bool IsEmpty() const { return faceGroup.empty() && lineGroup.empty() && pointsGroup.empty(); } // TODO(syoyo): bspline, surface, ... }; // See // http://stackoverflow.com/questions/6089231/getting-std-ifstream-to-handle-lf-cr-and-crlf static std::istream &safeGetline(std::istream &is, std::string &t) { t.clear(); // The characters in the stream are read one-by-one using a std::streambuf. // That is faster than reading them one-by-one using the std::istream. // Code that uses streambuf this way must be guarded by a sentry object. // The sentry object performs various tasks, // such as thread synchronization and updating the stream state. std::istream::sentry se(is, true); std::streambuf *sb = is.rdbuf(); if (se) { for (;;) { int c = sb->sbumpc(); switch (c) { case '\n': return is; case '\r': if (sb->sgetc() == '\n') sb->sbumpc(); return is; case EOF: // Also handle the case when the last line has no line ending if (t.empty()) is.setstate(std::ios::eofbit); return is; default: t += static_cast(c); } } } return is; } #define IS_SPACE(x) (((x) == ' ') || ((x) == '\t')) #define IS_DIGIT(x) \ (static_cast((x) - '0') < static_cast(10)) #define IS_NEW_LINE(x) (((x) == '\r') || ((x) == '\n') || ((x) == '\0')) // Make index zero-base, and also support relative index. static inline bool fixIndex(int idx, int n, int *ret) { if (!ret) { return false; } if (idx > 0) { (*ret) = idx - 1; return true; } if (idx == 0) { // zero is not allowed according to the spec. return false; } if (idx < 0) { (*ret) = n + idx; // negative value = relative return true; } return false; // never reach here. } static inline std::string parseString(const char **token) { std::string s; (*token) += strspn((*token), " \t"); size_t e = strcspn((*token), " \t\r"); s = std::string((*token), &(*token)[e]); (*token) += e; return s; } static inline int parseInt(const char **token) { (*token) += strspn((*token), " \t"); int i = atoi((*token)); (*token) += strcspn((*token), " \t\r"); return i; } // Tries to parse a floating point number located at s. // // s_end should be a location in the string where reading should absolutely // stop. For example at the end of the string, to prevent buffer overflows. // // Parses the following EBNF grammar: // sign = "+" | "-" ; // END = ? anything not in digit ? // digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ; // integer = [sign] , digit , {digit} ; // decimal = integer , ["." , integer] ; // float = ( decimal , END ) | ( decimal , ("E" | "e") , integer , END ) ; // // Valid strings are for example: // -0 +3.1417e+2 -0.0E-3 1.0324 -1.41 11e2 // // If the parsing is a success, result is set to the parsed value and true // is returned. // // The function is greedy and will parse until any of the following happens: // - a non-conforming character is encountered. // - s_end is reached. // // The following situations triggers a failure: // - s >= s_end. // - parse failure. // static bool tryParseDouble(const char *s, const char *s_end, double *result) { if (s >= s_end) { return false; } double mantissa = 0.0; // This exponent is base 2 rather than 10. // However the exponent we parse is supposed to be one of ten, // thus we must take care to convert the exponent/and or the // mantissa to a * 2^E, where a is the mantissa and E is the // exponent. // To get the final double we will use ldexp, it requires the // exponent to be in base 2. int exponent = 0; // NOTE: THESE MUST BE DECLARED HERE SINCE WE ARE NOT ALLOWED // TO JUMP OVER DEFINITIONS. char sign = '+'; char exp_sign = '+'; char const *curr = s; // How many characters were read in a loop. int read = 0; // Tells whether a loop terminated due to reaching s_end. bool end_not_reached = false; bool leading_decimal_dots = false; /* BEGIN PARSING. */ // Find out what sign we've got. if (*curr == '+' || *curr == '-') { sign = *curr; curr++; if ((curr != s_end) && (*curr == '.')) { // accept. Somethig like `.7e+2`, `-.5234` leading_decimal_dots = true; } } else if (IS_DIGIT(*curr)) { /* Pass through. */ } else if (*curr == '.') { // accept. Somethig like `.7e+2`, `-.5234` leading_decimal_dots = true; } else { goto fail; } // Read the integer part. end_not_reached = (curr != s_end); if (!leading_decimal_dots) { while (end_not_reached && IS_DIGIT(*curr)) { mantissa *= 10; mantissa += static_cast(*curr - 0x30); curr++; read++; end_not_reached = (curr != s_end); } // We must make sure we actually got something. if (read == 0) goto fail; } // We allow numbers of form "#", "###" etc. if (!end_not_reached) goto assemble; // Read the decimal part. if (*curr == '.') { curr++; read = 1; end_not_reached = (curr != s_end); while (end_not_reached && IS_DIGIT(*curr)) { static const double pow_lut[] = { 1.0, 0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001, }; const int lut_entries = sizeof pow_lut / sizeof pow_lut[0]; // NOTE: Don't use powf here, it will absolutely murder precision. mantissa += static_cast(*curr - 0x30) * (read < lut_entries ? pow_lut[read] : std::pow(10.0, -read)); read++; curr++; end_not_reached = (curr != s_end); } } else if (*curr == 'e' || *curr == 'E') { } else { goto assemble; } if (!end_not_reached) goto assemble; // Read the exponent part. if (*curr == 'e' || *curr == 'E') { curr++; // Figure out if a sign is present and if it is. end_not_reached = (curr != s_end); if (end_not_reached && (*curr == '+' || *curr == '-')) { exp_sign = *curr; curr++; } else if (IS_DIGIT(*curr)) { /* Pass through. */ } else { // Empty E is not allowed. goto fail; } read = 0; end_not_reached = (curr != s_end); while (end_not_reached && IS_DIGIT(*curr)) { exponent *= 10; exponent += static_cast(*curr - 0x30); curr++; read++; end_not_reached = (curr != s_end); } exponent *= (exp_sign == '+' ? 1 : -1); if (read == 0) goto fail; } assemble: *result = (sign == '+' ? 1 : -1) * (exponent ? std::ldexp(mantissa * std::pow(5.0, exponent), exponent) : mantissa); return true; fail: return false; } static inline real_t parseReal(const char **token, double default_value = 0.0) { (*token) += strspn((*token), " \t"); const char *end = (*token) + strcspn((*token), " \t\r"); double val = default_value; tryParseDouble((*token), end, &val); real_t f = static_cast(val); (*token) = end; return f; } static inline bool parseReal(const char **token, real_t *out) { (*token) += strspn((*token), " \t"); const char *end = (*token) + strcspn((*token), " \t\r"); double val; bool ret = tryParseDouble((*token), end, &val); if (ret) { real_t f = static_cast(val); (*out) = f; } (*token) = end; return ret; } static inline void parseReal2(real_t *x, real_t *y, const char **token, const double default_x = 0.0, const double default_y = 0.0) { (*x) = parseReal(token, default_x); (*y) = parseReal(token, default_y); } static inline void parseReal3(real_t *x, real_t *y, real_t *z, const char **token, const double default_x = 0.0, const double default_y = 0.0, const double default_z = 0.0) { (*x) = parseReal(token, default_x); (*y) = parseReal(token, default_y); (*z) = parseReal(token, default_z); } static inline void parseV(real_t *x, real_t *y, real_t *z, real_t *w, const char **token, const double default_x = 0.0, const double default_y = 0.0, const double default_z = 0.0, const double default_w = 1.0) { (*x) = parseReal(token, default_x); (*y) = parseReal(token, default_y); (*z) = parseReal(token, default_z); (*w) = parseReal(token, default_w); } // Extension: parse vertex with colors(6 items) static inline bool parseVertexWithColor(real_t *x, real_t *y, real_t *z, real_t *r, real_t *g, real_t *b, const char **token, const double default_x = 0.0, const double default_y = 0.0, const double default_z = 0.0) { (*x) = parseReal(token, default_x); (*y) = parseReal(token, default_y); (*z) = parseReal(token, default_z); const bool found_color = parseReal(token, r) && parseReal(token, g) && parseReal(token, b); if (!found_color) { (*r) = (*g) = (*b) = 1.0; } return found_color; } static inline bool parseOnOff(const char **token, bool default_value = true) { (*token) += strspn((*token), " \t"); const char *end = (*token) + strcspn((*token), " \t\r"); bool ret = default_value; if ((0 == strncmp((*token), "on", 2))) { ret = true; } else if ((0 == strncmp((*token), "off", 3))) { ret = false; } (*token) = end; return ret; } static inline texture_type_t parseTextureType( const char **token, texture_type_t default_value = TEXTURE_TYPE_NONE) { (*token) += strspn((*token), " \t"); const char *end = (*token) + strcspn((*token), " \t\r"); texture_type_t ty = default_value; if ((0 == strncmp((*token), "cube_top", strlen("cube_top")))) { ty = TEXTURE_TYPE_CUBE_TOP; } else if ((0 == strncmp((*token), "cube_bottom", strlen("cube_bottom")))) { ty = TEXTURE_TYPE_CUBE_BOTTOM; } else if ((0 == strncmp((*token), "cube_left", strlen("cube_left")))) { ty = TEXTURE_TYPE_CUBE_LEFT; } else if ((0 == strncmp((*token), "cube_right", strlen("cube_right")))) { ty = TEXTURE_TYPE_CUBE_RIGHT; } else if ((0 == strncmp((*token), "cube_front", strlen("cube_front")))) { ty = TEXTURE_TYPE_CUBE_FRONT; } else if ((0 == strncmp((*token), "cube_back", strlen("cube_back")))) { ty = TEXTURE_TYPE_CUBE_BACK; } else if ((0 == strncmp((*token), "sphere", strlen("sphere")))) { ty = TEXTURE_TYPE_SPHERE; } (*token) = end; return ty; } static tag_sizes parseTagTriple(const char **token) { tag_sizes ts; (*token) += strspn((*token), " \t"); ts.num_ints = atoi((*token)); (*token) += strcspn((*token), "/ \t\r"); if ((*token)[0] != '/') { return ts; } (*token)++; // Skip '/' (*token) += strspn((*token), " \t"); ts.num_reals = atoi((*token)); (*token) += strcspn((*token), "/ \t\r"); if ((*token)[0] != '/') { return ts; } (*token)++; // Skip '/' ts.num_strings = parseInt(token); return ts; } // Parse triples with index offsets: i, i/j/k, i//k, i/j static bool parseTriple(const char **token, int vsize, int vnsize, int vtsize, vertex_index_t *ret) { if (!ret) { return false; } vertex_index_t vi(-1); if (!fixIndex(atoi((*token)), vsize, &(vi.v_idx))) { return false; } (*token) += strcspn((*token), "/ \t\r"); if ((*token)[0] != '/') { (*ret) = vi; return true; } (*token)++; // i//k if ((*token)[0] == '/') { (*token)++; if (!fixIndex(atoi((*token)), vnsize, &(vi.vn_idx))) { return false; } (*token) += strcspn((*token), "/ \t\r"); (*ret) = vi; return true; } // i/j/k or i/j if (!fixIndex(atoi((*token)), vtsize, &(vi.vt_idx))) { return false; } (*token) += strcspn((*token), "/ \t\r"); if ((*token)[0] != '/') { (*ret) = vi; return true; } // i/j/k (*token)++; // skip '/' if (!fixIndex(atoi((*token)), vnsize, &(vi.vn_idx))) { return false; } (*token) += strcspn((*token), "/ \t\r"); (*ret) = vi; return true; } // Parse raw triples: i, i/j/k, i//k, i/j static vertex_index_t parseRawTriple(const char **token) { vertex_index_t vi(static_cast(0)); // 0 is an invalid index in OBJ vi.v_idx = atoi((*token)); (*token) += strcspn((*token), "/ \t\r"); if ((*token)[0] != '/') { return vi; } (*token)++; // i//k if ((*token)[0] == '/') { (*token)++; vi.vn_idx = atoi((*token)); (*token) += strcspn((*token), "/ \t\r"); return vi; } // i/j/k or i/j vi.vt_idx = atoi((*token)); (*token) += strcspn((*token), "/ \t\r"); if ((*token)[0] != '/') { return vi; } // i/j/k (*token)++; // skip '/' vi.vn_idx = atoi((*token)); (*token) += strcspn((*token), "/ \t\r"); return vi; } bool ParseTextureNameAndOption(std::string *texname, texture_option_t *texopt, const char *linebuf) { // @todo { write more robust lexer and parser. } bool found_texname = false; std::string texture_name; const char *token = linebuf; // Assume line ends with NULL while (!IS_NEW_LINE((*token))) { token += strspn(token, " \t"); // skip space if ((0 == strncmp(token, "-blendu", 7)) && IS_SPACE((token[7]))) { token += 8; texopt->blendu = parseOnOff(&token, /* default */ true); } else if ((0 == strncmp(token, "-blendv", 7)) && IS_SPACE((token[7]))) { token += 8; texopt->blendv = parseOnOff(&token, /* default */ true); } else if ((0 == strncmp(token, "-clamp", 6)) && IS_SPACE((token[6]))) { token += 7; texopt->clamp = parseOnOff(&token, /* default */ true); } else if ((0 == strncmp(token, "-boost", 6)) && IS_SPACE((token[6]))) { token += 7; texopt->sharpness = parseReal(&token, 1.0); } else if ((0 == strncmp(token, "-bm", 3)) && IS_SPACE((token[3]))) { token += 4; texopt->bump_multiplier = parseReal(&token, 1.0); } else if ((0 == strncmp(token, "-o", 2)) && IS_SPACE((token[2]))) { token += 3; parseReal3(&(texopt->origin_offset[0]), &(texopt->origin_offset[1]), &(texopt->origin_offset[2]), &token); } else if ((0 == strncmp(token, "-s", 2)) && IS_SPACE((token[2]))) { token += 3; parseReal3(&(texopt->scale[0]), &(texopt->scale[1]), &(texopt->scale[2]), &token, 1.0, 1.0, 1.0); } else if ((0 == strncmp(token, "-t", 2)) && IS_SPACE((token[2]))) { token += 3; parseReal3(&(texopt->turbulence[0]), &(texopt->turbulence[1]), &(texopt->turbulence[2]), &token); } else if ((0 == strncmp(token, "-type", 5)) && IS_SPACE((token[5]))) { token += 5; texopt->type = parseTextureType((&token), TEXTURE_TYPE_NONE); } else if ((0 == strncmp(token, "-texres", 7)) && IS_SPACE((token[7]))) { token += 7; // TODO(syoyo): Check if arg is int type. texopt->texture_resolution = parseInt(&token); } else if ((0 == strncmp(token, "-imfchan", 8)) && IS_SPACE((token[8]))) { token += 9; token += strspn(token, " \t"); const char *end = token + strcspn(token, " \t\r"); if ((end - token) == 1) { // Assume one char for -imfchan texopt->imfchan = (*token); } token = end; } else if ((0 == strncmp(token, "-mm", 3)) && IS_SPACE((token[3]))) { token += 4; parseReal2(&(texopt->brightness), &(texopt->contrast), &token, 0.0, 1.0); } else if ((0 == strncmp(token, "-colorspace", 11)) && IS_SPACE((token[11]))) { token += 12; texopt->colorspace = parseString(&token); } else { // Assume texture filename #if 0 size_t len = strcspn(token, " \t\r"); // untile next space texture_name = std::string(token, token + len); token += len; token += strspn(token, " \t"); // skip space #else // Read filename until line end to parse filename containing whitespace // TODO(syoyo): Support parsing texture option flag after the filename. texture_name = std::string(token); token += texture_name.length(); #endif found_texname = true; } } if (found_texname) { (*texname) = texture_name; return true; } else { return false; } } static void InitTexOpt(texture_option_t *texopt, const bool is_bump) { if (is_bump) { texopt->imfchan = 'l'; } else { texopt->imfchan = 'm'; } texopt->bump_multiplier = static_cast(1.0); texopt->clamp = false; texopt->blendu = true; texopt->blendv = true; texopt->sharpness = static_cast(1.0); texopt->brightness = static_cast(0.0); texopt->contrast = static_cast(1.0); texopt->origin_offset[0] = static_cast(0.0); texopt->origin_offset[1] = static_cast(0.0); texopt->origin_offset[2] = static_cast(0.0); texopt->scale[0] = static_cast(1.0); texopt->scale[1] = static_cast(1.0); texopt->scale[2] = static_cast(1.0); texopt->turbulence[0] = static_cast(0.0); texopt->turbulence[1] = static_cast(0.0); texopt->turbulence[2] = static_cast(0.0); texopt->texture_resolution = -1; texopt->type = TEXTURE_TYPE_NONE; } static void InitMaterial(material_t *material) { InitTexOpt(&material->ambient_texopt, /* is_bump */ false); InitTexOpt(&material->diffuse_texopt, /* is_bump */ false); InitTexOpt(&material->specular_texopt, /* is_bump */ false); InitTexOpt(&material->specular_highlight_texopt, /* is_bump */ false); InitTexOpt(&material->bump_texopt, /* is_bump */ true); InitTexOpt(&material->displacement_texopt, /* is_bump */ false); InitTexOpt(&material->alpha_texopt, /* is_bump */ false); InitTexOpt(&material->reflection_texopt, /* is_bump */ false); InitTexOpt(&material->roughness_texopt, /* is_bump */ false); InitTexOpt(&material->metallic_texopt, /* is_bump */ false); InitTexOpt(&material->sheen_texopt, /* is_bump */ false); InitTexOpt(&material->emissive_texopt, /* is_bump */ false); InitTexOpt(&material->normal_texopt, /* is_bump */ false); // @fixme { is_bump will be true? } material->name = ""; material->ambient_texname = ""; material->diffuse_texname = ""; material->specular_texname = ""; material->specular_highlight_texname = ""; material->bump_texname = ""; material->displacement_texname = ""; material->reflection_texname = ""; material->alpha_texname = ""; for (int i = 0; i < 3; i++) { material->ambient[i] = static_cast(0.0); material->diffuse[i] = static_cast(0.0); material->specular[i] = static_cast(0.0); material->transmittance[i] = static_cast(0.0); material->emission[i] = static_cast(0.0); } material->illum = 0; material->dissolve = static_cast(1.0); material->shininess = static_cast(1.0); material->ior = static_cast(1.0); material->roughness = static_cast(0.0); material->metallic = static_cast(0.0); material->sheen = static_cast(0.0); material->clearcoat_thickness = static_cast(0.0); material->clearcoat_roughness = static_cast(0.0); material->anisotropy_rotation = static_cast(0.0); material->anisotropy = static_cast(0.0); material->roughness_texname = ""; material->metallic_texname = ""; material->sheen_texname = ""; material->emissive_texname = ""; material->normal_texname = ""; material->unknown_parameter.clear(); } // code from https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html template static int pnpoly(int nvert, T *vertx, T *verty, T testx, T testy) { int i, j, c = 0; for (i = 0, j = nvert - 1; i < nvert; j = i++) { if (((verty[i] > testy) != (verty[j] > testy)) && (testx < (vertx[j] - vertx[i]) * (testy - verty[i]) / (verty[j] - verty[i]) + vertx[i])) c = !c; } return c; } // TODO(syoyo): refactor function. static bool exportGroupsToShape(shape_t *shape, const PrimGroup &prim_group, const std::vector &tags, const int material_id, const std::string &name, bool triangulate, const std::vector &v) { if (prim_group.IsEmpty()) { return false; } shape->name = name; // polygon if (!prim_group.faceGroup.empty()) { // Flatten vertices and indices for (size_t i = 0; i < prim_group.faceGroup.size(); i++) { const face_t &face = prim_group.faceGroup[i]; size_t npolys = face.vertex_indices.size(); if (npolys < 3) { // Face must have 3+ vertices. continue; } vertex_index_t i0 = face.vertex_indices[0]; vertex_index_t i1(-1); vertex_index_t i2 = face.vertex_indices[1]; if (triangulate) { // find the two axes to work in size_t axes[2] = {1, 2}; for (size_t k = 0; k < npolys; ++k) { i0 = face.vertex_indices[(k + 0) % npolys]; i1 = face.vertex_indices[(k + 1) % npolys]; i2 = face.vertex_indices[(k + 2) % npolys]; size_t vi0 = size_t(i0.v_idx); size_t vi1 = size_t(i1.v_idx); size_t vi2 = size_t(i2.v_idx); if (((3 * vi0 + 2) >= v.size()) || ((3 * vi1 + 2) >= v.size()) || ((3 * vi2 + 2) >= v.size())) { // Invalid triangle. // FIXME(syoyo): Is it ok to simply skip this invalid triangle? continue; } real_t v0x = v[vi0 * 3 + 0]; real_t v0y = v[vi0 * 3 + 1]; real_t v0z = v[vi0 * 3 + 2]; real_t v1x = v[vi1 * 3 + 0]; real_t v1y = v[vi1 * 3 + 1]; real_t v1z = v[vi1 * 3 + 2]; real_t v2x = v[vi2 * 3 + 0]; real_t v2y = v[vi2 * 3 + 1]; real_t v2z = v[vi2 * 3 + 2]; real_t e0x = v1x - v0x; real_t e0y = v1y - v0y; real_t e0z = v1z - v0z; real_t e1x = v2x - v1x; real_t e1y = v2y - v1y; real_t e1z = v2z - v1z; real_t cx = std::fabs(e0y * e1z - e0z * e1y); real_t cy = std::fabs(e0z * e1x - e0x * e1z); real_t cz = std::fabs(e0x * e1y - e0y * e1x); const real_t epsilon = std::numeric_limits::epsilon(); if (cx > epsilon || cy > epsilon || cz > epsilon) { // found a corner if (cx > cy && cx > cz) { } else { axes[0] = 0; if (cz > cx && cz > cy) axes[1] = 1; } break; } } real_t area = 0; for (size_t k = 0; k < npolys; ++k) { i0 = face.vertex_indices[(k + 0) % npolys]; i1 = face.vertex_indices[(k + 1) % npolys]; size_t vi0 = size_t(i0.v_idx); size_t vi1 = size_t(i1.v_idx); if (((vi0 * 3 + axes[0]) >= v.size()) || ((vi0 * 3 + axes[1]) >= v.size()) || ((vi1 * 3 + axes[0]) >= v.size()) || ((vi1 * 3 + axes[1]) >= v.size())) { // Invalid index. continue; } real_t v0x = v[vi0 * 3 + axes[0]]; real_t v0y = v[vi0 * 3 + axes[1]]; real_t v1x = v[vi1 * 3 + axes[0]]; real_t v1y = v[vi1 * 3 + axes[1]]; area += (v0x * v1y - v0y * v1x) * static_cast(0.5); } face_t remainingFace = face; // copy size_t guess_vert = 0; vertex_index_t ind[3]; real_t vx[3]; real_t vy[3]; // How many iterations can we do without decreasing the remaining // vertices. size_t remainingIterations = face.vertex_indices.size(); size_t previousRemainingVertices = remainingFace.vertex_indices.size(); while (remainingFace.vertex_indices.size() > 3 && remainingIterations > 0) { npolys = remainingFace.vertex_indices.size(); if (guess_vert >= npolys) { guess_vert -= npolys; } if (previousRemainingVertices != npolys) { // The number of remaining vertices decreased. Reset counters. previousRemainingVertices = npolys; remainingIterations = npolys; } else { // We didn't consume a vertex on previous iteration, reduce the // available iterations. remainingIterations--; } for (size_t k = 0; k < 3; k++) { ind[k] = remainingFace.vertex_indices[(guess_vert + k) % npolys]; size_t vi = size_t(ind[k].v_idx); if (((vi * 3 + axes[0]) >= v.size()) || ((vi * 3 + axes[1]) >= v.size())) { // ??? vx[k] = static_cast(0.0); vy[k] = static_cast(0.0); } else { vx[k] = v[vi * 3 + axes[0]]; vy[k] = v[vi * 3 + axes[1]]; } } real_t e0x = vx[1] - vx[0]; real_t e0y = vy[1] - vy[0]; real_t e1x = vx[2] - vx[1]; real_t e1y = vy[2] - vy[1]; real_t cross = e0x * e1y - e0y * e1x; // if an internal angle if (cross * area < static_cast(0.0)) { guess_vert += 1; continue; } // check all other verts in case they are inside this triangle bool overlap = false; for (size_t otherVert = 3; otherVert < npolys; ++otherVert) { size_t idx = (guess_vert + otherVert) % npolys; if (idx >= remainingFace.vertex_indices.size()) { // ??? continue; } size_t ovi = size_t(remainingFace.vertex_indices[idx].v_idx); if (((ovi * 3 + axes[0]) >= v.size()) || ((ovi * 3 + axes[1]) >= v.size())) { // ??? continue; } real_t tx = v[ovi * 3 + axes[0]]; real_t ty = v[ovi * 3 + axes[1]]; if (pnpoly(3, vx, vy, tx, ty)) { overlap = true; break; } } if (overlap) { guess_vert += 1; continue; } // this triangle is an ear { index_t idx0, idx1, idx2; idx0.vertex_index = ind[0].v_idx; idx0.normal_index = ind[0].vn_idx; idx0.texcoord_index = ind[0].vt_idx; idx1.vertex_index = ind[1].v_idx; idx1.normal_index = ind[1].vn_idx; idx1.texcoord_index = ind[1].vt_idx; idx2.vertex_index = ind[2].v_idx; idx2.normal_index = ind[2].vn_idx; idx2.texcoord_index = ind[2].vt_idx; shape->mesh.indices.push_back(idx0); shape->mesh.indices.push_back(idx1); shape->mesh.indices.push_back(idx2); shape->mesh.num_face_vertices.push_back(3); shape->mesh.material_ids.push_back(material_id); shape->mesh.smoothing_group_ids.push_back(face.smoothing_group_id); } // remove v1 from the list size_t removed_vert_index = (guess_vert + 1) % npolys; while (removed_vert_index + 1 < npolys) { remainingFace.vertex_indices[removed_vert_index] = remainingFace.vertex_indices[removed_vert_index + 1]; removed_vert_index += 1; } remainingFace.vertex_indices.pop_back(); } if (remainingFace.vertex_indices.size() == 3) { i0 = remainingFace.vertex_indices[0]; i1 = remainingFace.vertex_indices[1]; i2 = remainingFace.vertex_indices[2]; { index_t idx0, idx1, idx2; idx0.vertex_index = i0.v_idx; idx0.normal_index = i0.vn_idx; idx0.texcoord_index = i0.vt_idx; idx1.vertex_index = i1.v_idx; idx1.normal_index = i1.vn_idx; idx1.texcoord_index = i1.vt_idx; idx2.vertex_index = i2.v_idx; idx2.normal_index = i2.vn_idx; idx2.texcoord_index = i2.vt_idx; shape->mesh.indices.push_back(idx0); shape->mesh.indices.push_back(idx1); shape->mesh.indices.push_back(idx2); shape->mesh.num_face_vertices.push_back(3); shape->mesh.material_ids.push_back(material_id); shape->mesh.smoothing_group_ids.push_back(face.smoothing_group_id); } } } else { for (size_t k = 0; k < npolys; k++) { index_t idx; idx.vertex_index = face.vertex_indices[k].v_idx; idx.normal_index = face.vertex_indices[k].vn_idx; idx.texcoord_index = face.vertex_indices[k].vt_idx; shape->mesh.indices.push_back(idx); } shape->mesh.num_face_vertices.push_back( static_cast(npolys)); shape->mesh.material_ids.push_back(material_id); // per face shape->mesh.smoothing_group_ids.push_back( face.smoothing_group_id); // per face } } shape->mesh.tags = tags; } // line if (!prim_group.lineGroup.empty()) { // Flatten indices for (size_t i = 0; i < prim_group.lineGroup.size(); i++) { for (size_t j = 0; j < prim_group.lineGroup[i].vertex_indices.size(); j++) { const vertex_index_t &vi = prim_group.lineGroup[i].vertex_indices[j]; index_t idx; idx.vertex_index = vi.v_idx; idx.normal_index = vi.vn_idx; idx.texcoord_index = vi.vt_idx; shape->lines.indices.push_back(idx); } shape->lines.num_line_vertices.push_back( int(prim_group.lineGroup[i].vertex_indices.size())); } } // points if (!prim_group.pointsGroup.empty()) { // Flatten & convert indices for (size_t i = 0; i < prim_group.pointsGroup.size(); i++) { for (size_t j = 0; j < prim_group.pointsGroup[i].vertex_indices.size(); j++) { const vertex_index_t &vi = prim_group.pointsGroup[i].vertex_indices[j]; index_t idx; idx.vertex_index = vi.v_idx; idx.normal_index = vi.vn_idx; idx.texcoord_index = vi.vt_idx; shape->points.indices.push_back(idx); } } } return true; } // Split a string with specified delimiter character. // http://stackoverflow.com/questions/236129/split-a-string-in-c static void SplitString(const std::string &s, char delim, std::vector &elems) { std::stringstream ss; ss.str(s); std::string item; while (std::getline(ss, item, delim)) { elems.push_back(item); } } static std::string JoinPath(const std::string &dir, const std::string &filename) { if (dir.empty()) { return filename; } else { // check '/' char lastChar = *dir.rbegin(); if (lastChar != '/') { return dir + std::string("/") + filename; } else { return dir + filename; } } } void LoadMtl(std::map *material_map, std::vector *materials, std::istream *inStream, std::string *warning, std::string *err) { (void)err; // Create a default material anyway. material_t material; InitMaterial(&material); // Issue 43. `d` wins against `Tr` since `Tr` is not in the MTL specification. bool has_d = false; bool has_tr = false; // has_kd is used to set a default diffuse value when map_Kd is present // and Kd is not. bool has_kd = false; std::stringstream warn_ss; size_t line_no = 0; std::string linebuf; while (inStream->peek() != -1) { safeGetline(*inStream, linebuf); line_no++; // Trim trailing whitespace. if (linebuf.size() > 0) { linebuf = linebuf.substr(0, linebuf.find_last_not_of(" \t") + 1); } // Trim newline '\r\n' or '\n' if (linebuf.size() > 0) { if (linebuf[linebuf.size() - 1] == '\n') linebuf.erase(linebuf.size() - 1); } if (linebuf.size() > 0) { if (linebuf[linebuf.size() - 1] == '\r') linebuf.erase(linebuf.size() - 1); } // Skip if empty line. if (linebuf.empty()) { continue; } // Skip leading space. const char *token = linebuf.c_str(); token += strspn(token, " \t"); assert(token); if (token[0] == '\0') continue; // empty line if (token[0] == '#') continue; // comment line // new mtl if ((0 == strncmp(token, "newmtl", 6)) && IS_SPACE((token[6]))) { // flush previous material. if (!material.name.empty()) { material_map->insert(std::pair( material.name, static_cast(materials->size()))); materials->push_back(material); } // initial temporary material InitMaterial(&material); has_d = false; has_tr = false; // set new mtl name token += 7; { std::stringstream sstr; sstr << token; material.name = sstr.str(); } continue; } // ambient if (token[0] == 'K' && token[1] == 'a' && IS_SPACE((token[2]))) { token += 2; real_t r, g, b; parseReal3(&r, &g, &b, &token); material.ambient[0] = r; material.ambient[1] = g; material.ambient[2] = b; continue; } // diffuse if (token[0] == 'K' && token[1] == 'd' && IS_SPACE((token[2]))) { token += 2; real_t r, g, b; parseReal3(&r, &g, &b, &token); material.diffuse[0] = r; material.diffuse[1] = g; material.diffuse[2] = b; has_kd = true; continue; } // specular if (token[0] == 'K' && token[1] == 's' && IS_SPACE((token[2]))) { token += 2; real_t r, g, b; parseReal3(&r, &g, &b, &token); material.specular[0] = r; material.specular[1] = g; material.specular[2] = b; continue; } // transmittance if ((token[0] == 'K' && token[1] == 't' && IS_SPACE((token[2]))) || (token[0] == 'T' && token[1] == 'f' && IS_SPACE((token[2])))) { token += 2; real_t r, g, b; parseReal3(&r, &g, &b, &token); material.transmittance[0] = r; material.transmittance[1] = g; material.transmittance[2] = b; continue; } // ior(index of refraction) if (token[0] == 'N' && token[1] == 'i' && IS_SPACE((token[2]))) { token += 2; material.ior = parseReal(&token); continue; } // emission if (token[0] == 'K' && token[1] == 'e' && IS_SPACE(token[2])) { token += 2; real_t r, g, b; parseReal3(&r, &g, &b, &token); material.emission[0] = r; material.emission[1] = g; material.emission[2] = b; continue; } // shininess if (token[0] == 'N' && token[1] == 's' && IS_SPACE(token[2])) { token += 2; material.shininess = parseReal(&token); continue; } // illum model if (0 == strncmp(token, "illum", 5) && IS_SPACE(token[5])) { token += 6; material.illum = parseInt(&token); continue; } // dissolve if ((token[0] == 'd' && IS_SPACE(token[1]))) { token += 1; material.dissolve = parseReal(&token); if (has_tr) { warn_ss << "Both `d` and `Tr` parameters defined for \"" << material.name << "\". Use the value of `d` for dissolve (line " << line_no << " in .mtl.)" << std::endl; } has_d = true; continue; } if (token[0] == 'T' && token[1] == 'r' && IS_SPACE(token[2])) { token += 2; if (has_d) { // `d` wins. Ignore `Tr` value. warn_ss << "Both `d` and `Tr` parameters defined for \"" << material.name << "\". Use the value of `d` for dissolve (line " << line_no << " in .mtl.)" << std::endl; } else { // We invert value of Tr(assume Tr is in range [0, 1]) // NOTE: Interpretation of Tr is application(exporter) dependent. For // some application(e.g. 3ds max obj exporter), Tr = d(Issue 43) material.dissolve = static_cast(1.0) - parseReal(&token); } has_tr = true; continue; } // PBR: roughness if (token[0] == 'P' && token[1] == 'r' && IS_SPACE(token[2])) { token += 2; material.roughness = parseReal(&token); continue; } // PBR: metallic if (token[0] == 'P' && token[1] == 'm' && IS_SPACE(token[2])) { token += 2; material.metallic = parseReal(&token); continue; } // PBR: sheen if (token[0] == 'P' && token[1] == 's' && IS_SPACE(token[2])) { token += 2; material.sheen = parseReal(&token); continue; } // PBR: clearcoat thickness if (token[0] == 'P' && token[1] == 'c' && IS_SPACE(token[2])) { token += 2; material.clearcoat_thickness = parseReal(&token); continue; } // PBR: clearcoat roughness if ((0 == strncmp(token, "Pcr", 3)) && IS_SPACE(token[3])) { token += 4; material.clearcoat_roughness = parseReal(&token); continue; } // PBR: anisotropy if ((0 == strncmp(token, "aniso", 5)) && IS_SPACE(token[5])) { token += 6; material.anisotropy = parseReal(&token); continue; } // PBR: anisotropy rotation if ((0 == strncmp(token, "anisor", 6)) && IS_SPACE(token[6])) { token += 7; material.anisotropy_rotation = parseReal(&token); continue; } // ambient texture if ((0 == strncmp(token, "map_Ka", 6)) && IS_SPACE(token[6])) { token += 7; ParseTextureNameAndOption(&(material.ambient_texname), &(material.ambient_texopt), token); continue; } // diffuse texture if ((0 == strncmp(token, "map_Kd", 6)) && IS_SPACE(token[6])) { token += 7; ParseTextureNameAndOption(&(material.diffuse_texname), &(material.diffuse_texopt), token); // Set a decent diffuse default value if a diffuse texture is specified // without a matching Kd value. if (!has_kd) { material.diffuse[0] = static_cast(0.6); material.diffuse[1] = static_cast(0.6); material.diffuse[2] = static_cast(0.6); } continue; } // specular texture if ((0 == strncmp(token, "map_Ks", 6)) && IS_SPACE(token[6])) { token += 7; ParseTextureNameAndOption(&(material.specular_texname), &(material.specular_texopt), token); continue; } // specular highlight texture if ((0 == strncmp(token, "map_Ns", 6)) && IS_SPACE(token[6])) { token += 7; ParseTextureNameAndOption(&(material.specular_highlight_texname), &(material.specular_highlight_texopt), token); continue; } // bump texture if ((0 == strncmp(token, "map_bump", 8)) && IS_SPACE(token[8])) { token += 9; ParseTextureNameAndOption(&(material.bump_texname), &(material.bump_texopt), token); continue; } // bump texture if ((0 == strncmp(token, "map_Bump", 8)) && IS_SPACE(token[8])) { token += 9; ParseTextureNameAndOption(&(material.bump_texname), &(material.bump_texopt), token); continue; } // bump texture if ((0 == strncmp(token, "bump", 4)) && IS_SPACE(token[4])) { token += 5; ParseTextureNameAndOption(&(material.bump_texname), &(material.bump_texopt), token); continue; } // alpha texture if ((0 == strncmp(token, "map_d", 5)) && IS_SPACE(token[5])) { token += 6; material.alpha_texname = token; ParseTextureNameAndOption(&(material.alpha_texname), &(material.alpha_texopt), token); continue; } // displacement texture if ((0 == strncmp(token, "disp", 4)) && IS_SPACE(token[4])) { token += 5; ParseTextureNameAndOption(&(material.displacement_texname), &(material.displacement_texopt), token); continue; } // reflection map if ((0 == strncmp(token, "refl", 4)) && IS_SPACE(token[4])) { token += 5; ParseTextureNameAndOption(&(material.reflection_texname), &(material.reflection_texopt), token); continue; } // PBR: roughness texture if ((0 == strncmp(token, "map_Pr", 6)) && IS_SPACE(token[6])) { token += 7; ParseTextureNameAndOption(&(material.roughness_texname), &(material.roughness_texopt), token); continue; } // PBR: metallic texture if ((0 == strncmp(token, "map_Pm", 6)) && IS_SPACE(token[6])) { token += 7; ParseTextureNameAndOption(&(material.metallic_texname), &(material.metallic_texopt), token); continue; } // PBR: sheen texture if ((0 == strncmp(token, "map_Ps", 6)) && IS_SPACE(token[6])) { token += 7; ParseTextureNameAndOption(&(material.sheen_texname), &(material.sheen_texopt), token); continue; } // PBR: emissive texture if ((0 == strncmp(token, "map_Ke", 6)) && IS_SPACE(token[6])) { token += 7; ParseTextureNameAndOption(&(material.emissive_texname), &(material.emissive_texopt), token); continue; } // PBR: normal map texture if ((0 == strncmp(token, "norm", 4)) && IS_SPACE(token[4])) { token += 5; ParseTextureNameAndOption(&(material.normal_texname), &(material.normal_texopt), token); continue; } // unknown parameter const char *_space = strchr(token, ' '); if (!_space) { _space = strchr(token, '\t'); } if (_space) { std::ptrdiff_t len = _space - token; std::string key(token, static_cast(len)); std::string value = _space + 1; material.unknown_parameter.insert( std::pair(key, value)); } } // flush last material. material_map->insert(std::pair( material.name, static_cast(materials->size()))); materials->push_back(material); if (warning) { (*warning) = warn_ss.str(); } } bool MaterialFileReader::operator()(const std::string &matId, std::vector *materials, std::map *matMap, std::string *warn, std::string *err) { if (!m_mtlBaseDir.empty()) { #ifdef _WIN32 char sep = ';'; #else char sep = ':'; #endif // https://stackoverflow.com/questions/5167625/splitting-a-c-stdstring-using-tokens-e-g std::vector paths; std::istringstream f(m_mtlBaseDir); std::string s; while (getline(f, s, sep)) { paths.push_back(s); } for (size_t i = 0; i < paths.size(); i++) { std::string filepath = JoinPath(paths[i], matId); std::ifstream matIStream(filepath.c_str()); if (matIStream) { LoadMtl(matMap, materials, &matIStream, warn, err); return true; } } std::stringstream ss; ss << "Material file [ " << matId << " ] not found in a path : " << m_mtlBaseDir << std::endl; if (warn) { (*warn) += ss.str(); } return false; } else { std::string filepath = matId; std::ifstream matIStream(filepath.c_str()); if (matIStream) { LoadMtl(matMap, materials, &matIStream, warn, err); return true; } std::stringstream ss; ss << "Material file [ " << filepath << " ] not found in a path : " << m_mtlBaseDir << std::endl; if (warn) { (*warn) += ss.str(); } return false; } } bool MaterialStreamReader::operator()(const std::string &matId, std::vector *materials, std::map *matMap, std::string *warn, std::string *err) { (void)err; (void)matId; if (!m_inStream) { std::stringstream ss; ss << "Material stream in error state. " << std::endl; if (warn) { (*warn) += ss.str(); } return false; } LoadMtl(matMap, materials, &m_inStream, warn, err); return true; } bool LoadObj(attrib_t *attrib, std::vector *shapes, std::vector *materials, std::string *warn, std::string *err, const char *filename, const char *mtl_basedir, bool trianglulate, bool default_vcols_fallback) { attrib->vertices.clear(); attrib->normals.clear(); attrib->texcoords.clear(); attrib->colors.clear(); shapes->clear(); std::stringstream errss; std::ifstream ifs(filename); if (!ifs) { errss << "Cannot open file [" << filename << "]" << std::endl; if (err) { (*err) = errss.str(); } return false; } std::string baseDir = mtl_basedir ? mtl_basedir : ""; if (!baseDir.empty()) { #ifndef _WIN32 const char dirsep = '/'; #else const char dirsep = '\\'; #endif if (baseDir[baseDir.length() - 1] != dirsep) baseDir += dirsep; } MaterialFileReader matFileReader(baseDir); return LoadObj(attrib, shapes, materials, warn, err, &ifs, &matFileReader, trianglulate, default_vcols_fallback); } bool LoadObj(attrib_t *attrib, std::vector *shapes, std::vector *materials, std::string *warn, std::string *err, std::istream *inStream, MaterialReader *readMatFn /*= NULL*/, bool triangulate, bool default_vcols_fallback) { std::stringstream errss; std::vector v; std::vector vn; std::vector vt; std::vector vc; std::vector tags; PrimGroup prim_group; std::string name; // material std::map material_map; int material = -1; // smoothing group id unsigned int current_smoothing_id = 0; // Initial value. 0 means no smoothing. int greatest_v_idx = -1; int greatest_vn_idx = -1; int greatest_vt_idx = -1; shape_t shape; bool found_all_colors = true; size_t line_num = 0; std::string linebuf; while (inStream->peek() != -1) { safeGetline(*inStream, linebuf); line_num++; // Trim newline '\r\n' or '\n' if (linebuf.size() > 0) { if (linebuf[linebuf.size() - 1] == '\n') linebuf.erase(linebuf.size() - 1); } if (linebuf.size() > 0) { if (linebuf[linebuf.size() - 1] == '\r') linebuf.erase(linebuf.size() - 1); } // Skip if empty line. if (linebuf.empty()) { continue; } // Skip leading space. const char *token = linebuf.c_str(); token += strspn(token, " \t"); assert(token); if (token[0] == '\0') continue; // empty line if (token[0] == '#') continue; // comment line // vertex if (token[0] == 'v' && IS_SPACE((token[1]))) { token += 2; real_t x, y, z; real_t r, g, b; found_all_colors &= parseVertexWithColor(&x, &y, &z, &r, &g, &b, &token); v.push_back(x); v.push_back(y); v.push_back(z); if (found_all_colors || default_vcols_fallback) { vc.push_back(r); vc.push_back(g); vc.push_back(b); } continue; } // normal if (token[0] == 'v' && token[1] == 'n' && IS_SPACE((token[2]))) { token += 3; real_t x, y, z; parseReal3(&x, &y, &z, &token); vn.push_back(x); vn.push_back(y); vn.push_back(z); continue; } // texcoord if (token[0] == 'v' && token[1] == 't' && IS_SPACE((token[2]))) { token += 3; real_t x, y; parseReal2(&x, &y, &token); vt.push_back(x); vt.push_back(y); continue; } // line if (token[0] == 'l' && IS_SPACE((token[1]))) { token += 2; __line_t line; while (!IS_NEW_LINE(token[0])) { vertex_index_t vi; if (!parseTriple(&token, static_cast(v.size() / 3), static_cast(vn.size() / 3), static_cast(vt.size() / 2), &vi)) { if (err) { std::stringstream ss; ss << "Failed parse `l' line(e.g. zero value for vertex index. " "line " << line_num << ".)\n"; (*err) += ss.str(); } return false; } line.vertex_indices.push_back(vi); size_t n = strspn(token, " \t\r"); token += n; } prim_group.lineGroup.push_back(line); continue; } // points if (token[0] == 'p' && IS_SPACE((token[1]))) { token += 2; __points_t pts; while (!IS_NEW_LINE(token[0])) { vertex_index_t vi; if (!parseTriple(&token, static_cast(v.size() / 3), static_cast(vn.size() / 3), static_cast(vt.size() / 2), &vi)) { if (err) { std::stringstream ss; ss << "Failed parse `p' line(e.g. zero value for vertex index. " "line " << line_num << ".)\n"; (*err) += ss.str(); } return false; } pts.vertex_indices.push_back(vi); size_t n = strspn(token, " \t\r"); token += n; } prim_group.pointsGroup.push_back(pts); continue; } // face if (token[0] == 'f' && IS_SPACE((token[1]))) { token += 2; token += strspn(token, " \t"); face_t face; face.smoothing_group_id = current_smoothing_id; face.vertex_indices.reserve(3); while (!IS_NEW_LINE(token[0])) { vertex_index_t vi; if (!parseTriple(&token, static_cast(v.size() / 3), static_cast(vn.size() / 3), static_cast(vt.size() / 2), &vi)) { if (err) { std::stringstream ss; ss << "Failed parse `f' line(e.g. zero value for face index. line " << line_num << ".)\n"; (*err) += ss.str(); } return false; } greatest_v_idx = greatest_v_idx > vi.v_idx ? greatest_v_idx : vi.v_idx; greatest_vn_idx = greatest_vn_idx > vi.vn_idx ? greatest_vn_idx : vi.vn_idx; greatest_vt_idx = greatest_vt_idx > vi.vt_idx ? greatest_vt_idx : vi.vt_idx; face.vertex_indices.push_back(vi); size_t n = strspn(token, " \t\r"); token += n; } // replace with emplace_back + std::move on C++11 prim_group.faceGroup.push_back(face); continue; } // use mtl if ((0 == strncmp(token, "usemtl", 6))) { token += 6; std::string namebuf = parseString(&token); int newMaterialId = -1; if (material_map.find(namebuf) != material_map.end()) { newMaterialId = material_map[namebuf]; } else { // { error!! material not found } if (warn) { (*warn) += "material [ '" + namebuf + "' ] not found in .mtl\n"; } } if (newMaterialId != material) { // Create per-face material. Thus we don't add `shape` to `shapes` at // this time. // just clear `faceGroup` after `exportGroupsToShape()` call. exportGroupsToShape(&shape, prim_group, tags, material, name, triangulate, v); prim_group.faceGroup.clear(); material = newMaterialId; } continue; } // load mtl if ((0 == strncmp(token, "mtllib", 6)) && IS_SPACE((token[6]))) { if (readMatFn) { token += 7; std::vector filenames; SplitString(std::string(token), ' ', filenames); if (filenames.empty()) { if (warn) { std::stringstream ss; ss << "Looks like empty filename for mtllib. Use default " "material (line " << line_num << ".)\n"; (*warn) += ss.str(); } } else { bool found = false; for (size_t s = 0; s < filenames.size(); s++) { std::string warn_mtl; std::string err_mtl; bool ok = (*readMatFn)(filenames[s].c_str(), materials, &material_map, &warn_mtl, &err_mtl); if (warn && (!warn_mtl.empty())) { (*warn) += warn_mtl; } if (err && (!err_mtl.empty())) { (*err) += err_mtl; } if (ok) { found = true; break; } } if (!found) { if (warn) { (*warn) += "Failed to load material file(s). Use default " "material.\n"; } } } } continue; } // group name if (token[0] == 'g' && IS_SPACE((token[1]))) { // flush previous face group. bool ret = exportGroupsToShape(&shape, prim_group, tags, material, name, triangulate, v); (void)ret; // return value not used. if (shape.mesh.indices.size() > 0) { shapes->push_back(shape); } shape = shape_t(); // material = -1; prim_group.clear(); std::vector names; while (!IS_NEW_LINE(token[0])) { std::string str = parseString(&token); names.push_back(str); token += strspn(token, " \t\r"); // skip tag } // names[0] must be 'g' if (names.size() < 2) { // 'g' with empty names if (warn) { std::stringstream ss; ss << "Empty group name. line: " << line_num << "\n"; (*warn) += ss.str(); name = ""; } } else { std::stringstream ss; ss << names[1]; // tinyobjloader does not support multiple groups for a primitive. // Currently we concatinate multiple group names with a space to get // single group name. for (size_t i = 2; i < names.size(); i++) { ss << " " << names[i]; } name = ss.str(); } continue; } // object name if (token[0] == 'o' && IS_SPACE((token[1]))) { // flush previous face group. bool ret = exportGroupsToShape(&shape, prim_group, tags, material, name, triangulate, v); (void)ret; // return value not used. if (shape.mesh.indices.size() > 0 || shape.lines.indices.size() > 0 || shape.points.indices.size() > 0) { shapes->push_back(shape); } // material = -1; prim_group.clear(); shape = shape_t(); // @todo { multiple object name? } token += 2; std::stringstream ss; ss << token; name = ss.str(); continue; } if (token[0] == 't' && IS_SPACE(token[1])) { const int max_tag_nums = 8192; // FIXME(syoyo): Parameterize. tag_t tag; token += 2; tag.name = parseString(&token); tag_sizes ts = parseTagTriple(&token); if (ts.num_ints < 0) { ts.num_ints = 0; } if (ts.num_ints > max_tag_nums) { ts.num_ints = max_tag_nums; } if (ts.num_reals < 0) { ts.num_reals = 0; } if (ts.num_reals > max_tag_nums) { ts.num_reals = max_tag_nums; } if (ts.num_strings < 0) { ts.num_strings = 0; } if (ts.num_strings > max_tag_nums) { ts.num_strings = max_tag_nums; } tag.intValues.resize(static_cast(ts.num_ints)); for (size_t i = 0; i < static_cast(ts.num_ints); ++i) { tag.intValues[i] = parseInt(&token); } tag.floatValues.resize(static_cast(ts.num_reals)); for (size_t i = 0; i < static_cast(ts.num_reals); ++i) { tag.floatValues[i] = parseReal(&token); } tag.stringValues.resize(static_cast(ts.num_strings)); for (size_t i = 0; i < static_cast(ts.num_strings); ++i) { tag.stringValues[i] = parseString(&token); } tags.push_back(tag); continue; } if (token[0] == 's' && IS_SPACE(token[1])) { // smoothing group id token += 2; // skip space. token += strspn(token, " \t"); // skip space if (token[0] == '\0') { continue; } if (token[0] == '\r' || token[1] == '\n') { continue; } if (strlen(token) >= 3 && token[0] == 'o' && token[1] == 'f' && token[2] == 'f') { current_smoothing_id = 0; } else { // assume number int smGroupId = parseInt(&token); if (smGroupId < 0) { // parse error. force set to 0. // FIXME(syoyo): Report warning. current_smoothing_id = 0; } else { current_smoothing_id = static_cast(smGroupId); } } continue; } // smoothing group id // Ignore unknown command. } // not all vertices have colors, no default colors desired? -> clear colors if (!found_all_colors && !default_vcols_fallback) { vc.clear(); } if (greatest_v_idx >= static_cast(v.size() / 3)) { if (warn) { std::stringstream ss; ss << "Vertex indices out of bounds (line " << line_num << ".)\n" << std::endl; (*warn) += ss.str(); } } if (greatest_vn_idx >= static_cast(vn.size() / 3)) { if (warn) { std::stringstream ss; ss << "Vertex normal indices out of bounds (line " << line_num << ".)\n" << std::endl; (*warn) += ss.str(); } } if (greatest_vt_idx >= static_cast(vt.size() / 2)) { if (warn) { std::stringstream ss; ss << "Vertex texcoord indices out of bounds (line " << line_num << ".)\n" << std::endl; (*warn) += ss.str(); } } bool ret = exportGroupsToShape(&shape, prim_group, tags, material, name, triangulate, v); // exportGroupsToShape return false when `usemtl` is called in the last // line. // we also add `shape` to `shapes` when `shape.mesh` has already some // faces(indices) if (ret || shape.mesh.indices .size()) { // FIXME(syoyo): Support other prims(e.g. lines) shapes->push_back(shape); } prim_group.clear(); // for safety if (err) { (*err) += errss.str(); } attrib->vertices.swap(v); attrib->vertex_weights.swap(v); attrib->normals.swap(vn); attrib->texcoords.swap(vt); attrib->texcoord_ws.swap(vt); attrib->colors.swap(vc); return true; } bool LoadObjWithCallback(std::istream &inStream, const callback_t &callback, void *user_data /*= NULL*/, MaterialReader *readMatFn /*= NULL*/, std::string *warn, /* = NULL*/ std::string *err /*= NULL*/) { std::stringstream errss; // material std::map material_map; int material_id = -1; // -1 = invalid std::vector indices; std::vector materials; std::vector names; names.reserve(2); std::vector names_out; std::string linebuf; while (inStream.peek() != -1) { safeGetline(inStream, linebuf); // Trim newline '\r\n' or '\n' if (linebuf.size() > 0) { if (linebuf[linebuf.size() - 1] == '\n') linebuf.erase(linebuf.size() - 1); } if (linebuf.size() > 0) { if (linebuf[linebuf.size() - 1] == '\r') linebuf.erase(linebuf.size() - 1); } // Skip if empty line. if (linebuf.empty()) { continue; } // Skip leading space. const char *token = linebuf.c_str(); token += strspn(token, " \t"); assert(token); if (token[0] == '\0') continue; // empty line if (token[0] == '#') continue; // comment line // vertex if (token[0] == 'v' && IS_SPACE((token[1]))) { token += 2; // TODO(syoyo): Support parsing vertex color extension. real_t x, y, z, w; // w is optional. default = 1.0 parseV(&x, &y, &z, &w, &token); if (callback.vertex_cb) { callback.vertex_cb(user_data, x, y, z, w); } continue; } // normal if (token[0] == 'v' && token[1] == 'n' && IS_SPACE((token[2]))) { token += 3; real_t x, y, z; parseReal3(&x, &y, &z, &token); if (callback.normal_cb) { callback.normal_cb(user_data, x, y, z); } continue; } // texcoord if (token[0] == 'v' && token[1] == 't' && IS_SPACE((token[2]))) { token += 3; real_t x, y, z; // y and z are optional. default = 0.0 parseReal3(&x, &y, &z, &token); if (callback.texcoord_cb) { callback.texcoord_cb(user_data, x, y, z); } continue; } // face if (token[0] == 'f' && IS_SPACE((token[1]))) { token += 2; token += strspn(token, " \t"); indices.clear(); while (!IS_NEW_LINE(token[0])) { vertex_index_t vi = parseRawTriple(&token); index_t idx; idx.vertex_index = vi.v_idx; idx.normal_index = vi.vn_idx; idx.texcoord_index = vi.vt_idx; indices.push_back(idx); size_t n = strspn(token, " \t\r"); token += n; } if (callback.index_cb && indices.size() > 0) { callback.index_cb(user_data, &indices.at(0), static_cast(indices.size())); } continue; } // use mtl if ((0 == strncmp(token, "usemtl", 6)) && IS_SPACE((token[6]))) { token += 7; std::stringstream ss; ss << token; std::string namebuf = ss.str(); int newMaterialId = -1; if (material_map.find(namebuf) != material_map.end()) { newMaterialId = material_map[namebuf]; } else { // { warn!! material not found } if (warn && (!callback.usemtl_cb)) { (*warn) += "material [ " + namebuf + " ] not found in .mtl\n"; } } if (newMaterialId != material_id) { material_id = newMaterialId; } if (callback.usemtl_cb) { callback.usemtl_cb(user_data, namebuf.c_str(), material_id); } continue; } // load mtl if ((0 == strncmp(token, "mtllib", 6)) && IS_SPACE((token[6]))) { if (readMatFn) { token += 7; std::vector filenames; SplitString(std::string(token), ' ', filenames); if (filenames.empty()) { if (warn) { (*warn) += "Looks like empty filename for mtllib. Use default " "material. \n"; } } else { bool found = false; for (size_t s = 0; s < filenames.size(); s++) { std::string warn_mtl; std::string err_mtl; bool ok = (*readMatFn)(filenames[s].c_str(), &materials, &material_map, &warn_mtl, &err_mtl); if (warn && (!warn_mtl.empty())) { (*warn) += warn_mtl; // This should be warn message. } if (err && (!err_mtl.empty())) { (*err) += err_mtl; } if (ok) { found = true; break; } } if (!found) { if (warn) { (*warn) += "Failed to load material file(s). Use default " "material.\n"; } } else { if (callback.mtllib_cb) { callback.mtllib_cb(user_data, &materials.at(0), static_cast(materials.size())); } } } } continue; } // group name if (token[0] == 'g' && IS_SPACE((token[1]))) { names.clear(); while (!IS_NEW_LINE(token[0])) { std::string str = parseString(&token); names.push_back(str); token += strspn(token, " \t\r"); // skip tag } assert(names.size() > 0); if (callback.group_cb) { if (names.size() > 1) { // create const char* array. names_out.resize(names.size() - 1); for (size_t j = 0; j < names_out.size(); j++) { names_out[j] = names[j + 1].c_str(); } callback.group_cb(user_data, &names_out.at(0), static_cast(names_out.size())); } else { callback.group_cb(user_data, NULL, 0); } } continue; } // object name if (token[0] == 'o' && IS_SPACE((token[1]))) { // @todo { multiple object name? } token += 2; std::stringstream ss; ss << token; std::string object_name = ss.str(); if (callback.object_cb) { callback.object_cb(user_data, object_name.c_str()); } continue; } #if 0 // @todo if (token[0] == 't' && IS_SPACE(token[1])) { tag_t tag; token += 2; std::stringstream ss; ss << token; tag.name = ss.str(); token += tag.name.size() + 1; tag_sizes ts = parseTagTriple(&token); tag.intValues.resize(static_cast(ts.num_ints)); for (size_t i = 0; i < static_cast(ts.num_ints); ++i) { tag.intValues[i] = atoi(token); token += strcspn(token, "/ \t\r") + 1; } tag.floatValues.resize(static_cast(ts.num_reals)); for (size_t i = 0; i < static_cast(ts.num_reals); ++i) { tag.floatValues[i] = parseReal(&token); token += strcspn(token, "/ \t\r") + 1; } tag.stringValues.resize(static_cast(ts.num_strings)); for (size_t i = 0; i < static_cast(ts.num_strings); ++i) { std::stringstream ss; ss << token; tag.stringValues[i] = ss.str(); token += tag.stringValues[i].size() + 1; } tags.push_back(tag); } #endif // Ignore unknown command. } if (err) { (*err) += errss.str(); } return true; } bool ObjReader::ParseFromFile(const std::string &filename, const ObjReaderConfig &config) { std::string mtl_search_path; if (config.mtl_search_path.empty()) { // // split at last '/'(for unixish system) or '\\'(for windows) to get // the base directory of .obj file // if (filename.find_last_of("/\\") != std::string::npos) { mtl_search_path = filename.substr(0, filename.find_last_of("/\\")); } } else { mtl_search_path = config.mtl_search_path; } valid_ = LoadObj(&attrib_, &shapes_, &materials_, &warning_, &error_, filename.c_str(), mtl_search_path.c_str(), config.triangulate, config.vertex_color); return valid_; } bool ObjReader::ParseFromString(const std::string &obj_text, const std::string &mtl_text, const ObjReaderConfig &config) { std::stringbuf obj_buf(obj_text); std::stringbuf mtl_buf(mtl_text); std::istream obj_ifs(&obj_buf); std::istream mtl_ifs(&mtl_buf); MaterialStreamReader mtl_ss(mtl_ifs); valid_ = LoadObj(&attrib_, &shapes_, &materials_, &warning_, &error_, &obj_ifs, &mtl_ss, config.triangulate, config.vertex_color); return valid_; } #ifdef __clang__ #pragma clang diagnostic pop #endif } // namespace tinyobj #endif tinyobjloader-2.0.0~rc5+dfsg1/tinyobjloader-config.cmake.in000066400000000000000000000005251364105447200237150ustar00rootroot00000000000000@PACKAGE_INIT@ set(TINYOBJLOADER_VERSION "@TINYOBJLOADER_VERSION@") set_and_check(TINYOBJLOADER_INCLUDE_DIRS "@PACKAGE_TINYOBJLOADER_INCLUDE_DIR@") set_and_check(TINYOBJLOADER_LIBRARY_DIRS "@PACKAGE_TINYOBJLOADER_LIBRARY_DIR@") set(TINYOBJLOADER_LIBRARIES @LIBRARY_NAME@) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake") tinyobjloader-2.0.0~rc5+dfsg1/tinyobjloader.pc.in000066400000000000000000000010321364105447200217660ustar00rootroot00000000000000# Generated by CMake @CMAKE_VERSION@ for @PROJECT_NAME@. Any changes to this # file will be overwritten by the next CMake run. The input file was # tinyobjloader.pc.in. prefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=${prefix} libdir=${prefix}/@TINYOBJLOADER_LIBRARY_DIR@ includedir=${prefix}/@TINYOBJLOADER_INCLUDE_DIR@ Name: @PROJECT_NAME@ Description: Tiny but powerful single file wavefront obj loader URL: https://syoyo.github.io/tinyobjloader/ Version: @TINYOBJLOADER_VERSION@ Libs: -L${libdir} -l@LIBRARY_NAME@ Cflags: -I${includedir}