Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 435086 Details for
Bug 583890
media-libs/opencolorio-1.0.9_p20140911 ebuild and patches
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
files/opencolorio-1.0.9_p20140911_update.patch
opencolorio-1.0.9_p20140911_update.patch (text/plain), 270.90 KB, created by
Jonathan Scruggs (RETIRED)
on 2016-05-23 17:19:05 UTC
(
hide
)
Description:
files/opencolorio-1.0.9_p20140911_update.patch
Filename:
MIME Type:
Creator:
Jonathan Scruggs (RETIRED)
Created:
2016-05-23 17:19:05 UTC
Size:
270.90 KB
patch
obsolete
>diff -Naur a/CMakeLists.txt b/CMakeLists.txt >--- a/CMakeLists.txt 2013-10-08 23:59:34.000000000 +0100 >+++ b/CMakeLists.txt 2014-09-11 20:08:18.000000000 +0100 >@@ -24,6 +24,7 @@ > option(OCIO_STATIC_JNIGLUE "Specify whether to statically link ocio to the java bindings" ON) > > option(OCIO_USE_SSE "Specify whether to enable SSE CPU performance optimizations" ON) >+option(OCIO_INLINES_HIDDEN "Specify whether to build with -fvisibility-inlines-hidden" ON) > > # Use boost's shared_ptr by default on Windows (as <VS2010 doesn't have it), > # Use std::tr1::shared_ptr by default on other platforms >@@ -116,6 +117,17 @@ > set(OCIO_USE_BOOST_PTR 0) > endif() > >+if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") >+ if(OCIO_INLINES_HIDDEN) >+ execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion >+ OUTPUT_VARIABLE GCC_VERSION) >+ if (GCC_VERSION VERSION_LESS 4.2) >+ message(STATUS "WARNING: GCC Version < 4.2 - disabling hidden inlines") >+ set(OCIO_INLINES_HIDDEN OFF) >+ endif() >+ endif() >+endif() >+ > if(CMAKE_COMPILER_IS_GNUCXX) > # Enable a bunch of compiler warnings... > # http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html >@@ -165,7 +177,7 @@ > > else(USE_EXTERNAL_TINYXML) > set(TINYXML_VERSION 2_6_1) >- set(TINYXML_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR}/ext/dist) >+ set(TINYXML_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR}/ext/dist -DOCIO_INLINES_HIDDEN:BOOL=${OCIO_INLINES_HIDDEN}) > if(CMAKE_TOOLCHAIN_FILE) > set(TINYXML_CMAKE_ARGS ${TINYXML_CMAKE_ARGS} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) > endif() >@@ -190,21 +202,50 @@ > # Set minimum yaml version for non-patched sources. > set(YAML_VERSION_MIN "0.3.0") > include(FindPkgConfig) >- pkg_check_modules(YAML_CPP yaml-cpp) >+ pkg_check_modules(PC_YAML_CPP REQUIRED QUIET yaml-cpp) >+ find_path(YAML_CPP_INCLUDE_DIR yaml-cpp/yaml.h >+ HINTS ${PC_YAML_CPP_INCLUDEDIR} ${PC_YAML_CPP_INCLUDE_DIRS} ) >+ find_library(YAML_CPP_LIBRARY LIBRARY_NAMES yaml-cpp libyaml-cpp >+ HINTS ${PC_YAML_CPP_LIBRARY_DIRS} ) >+ set(YAML_CPP_LIBRARIES ${YAML_CPP_LIBRARY}) >+ set(YAML_CPP_INCLUDE_DIRS ${YAML_CPP_INCLUDE_DIR}) >+ set(YAML_CPP_VERSION ${PC_YAML_CPP_VERSION}) >+ >+ if(YAML_CPP_VERSION VERSION_LESS ${YAML_VERSION_MIN}) >+ message(FATAL_ERROR "ERROR: yaml-cpp ${YAML_VERSION_MIN} or greater is required.") >+ endif() >+ >+ find_package_handle_standard_args(yaml-cpp >+ REQUIRED_VARS YAML_CPP_LIBRARIES YAML_CPP_INCLUDE_DIRS ) >+ set(YAML_CPP_FOUND ${YAML-CPP_FOUND}) >+ mark_as_advanced(YAML_CPP_INCLUDE_DIR YAML_CPP_LIBRARY YAML-CPP_FOUND) >+ > if(YAML_CPP_FOUND) >- if(YAML_CPP_VERSION VERSION_EQUAL ${YAML_VERSION_MIN} OR >- YAML_CPP_VERSION VERSION_GREATER ${YAML_VERSION_MIN}) >- message(STATUS "System yaml-cpp library will be used.") >- include_directories(BEFORE ${YAML_CPP_INCLUDE_DIRS}) >- else() >- message(FATAL_ERROR "ERROR: yaml-cpp ${YAML_VERSION_MIN} or greater is required.") >+ if(YAML_CPP_VERSION VERSION_GREATER "0.5.0") >+ # Need to also get the boost headers here, as yaml-cpp 0.5.0+ requires them. >+ # Don't bother doing this step if we are already including the boost headers for shared_ptr >+ if(NOT OCIO_USE_BOOST_PTR) >+ set(Boost_ADDITIONAL_VERSIONS "1.49" "1.45" "1.44" "1.43" "1.43.0" "1.42" >+ "1.42.0" "1.41" "1.41.0" "1.40" >+ "1.40.0" "1.39" "1.39.0" "1.38" >+ "1.38.0" "1.37" "1.37.0" "1.34.1" >+ "1_34_1") >+ set(Boost_USE_MULTITHREADED ON) >+ find_package(Boost 1.34) >+ if(NOT Boost_FOUND) >+ message(FATAL_ERROR "Error: Detected system yaml-cpp version ${YAML_CPP_VERSION} is greater than 0.5.0, and therefore requires boost, but a boost installation could not be found.") >+ endif() >+ >+ set(EXTERNAL_INCLUDE_DIRS ${EXTERNAL_INCLUDE_DIRS} ${Boost_INCLUDE_DIR}) >+ endif() > endif() >+ set(EXTERNAL_INCLUDE_DIRS ${EXTERNAL_INCLUDE_DIRS} ${YAML_CPP_INCLUDE_DIRS}) > else(YAML_CPP_FOUND) > message(FATAL_ERROR "ERROR: System yaml-cpp library was not found. Make sure the library is installed and the pkg-config file exists.") > endif(YAML_CPP_FOUND) > else(USE_EXTERNAL_YAML) > set(YAML_CPP_VERSION 0.3.0) >- set(YAML_CPP_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR}/ext/dist -DYAML_CPP_BUILD_TOOLS:BOOL=FALSE) >+ set(YAML_CPP_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR}/ext/dist -DYAML_CPP_BUILD_TOOLS:BOOL=FALSE -DOCIO_INLINES_HIDDEN:BOOL=${OCIO_INLINES_HIDDEN}) > if(CMAKE_TOOLCHAIN_FILE) > set(YAML_CPP_CMAKE_ARGS ${YAML_CPP_CMAKE_ARGS} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) > endif() >@@ -225,25 +266,17 @@ > endif() > endif(USE_EXTERNAL_YAML) > >- >+if(YAML_CPP_VERSION VERSION_LESS "0.5.0") >+ set(YAML_CPP_COMPILE_FLAGS "-DOLDYAML") >+endif() > > ############################################################################### > ### Externals ### > > set(EXTERNAL_INCLUDE_DIRS ${EXTERNAL_INCLUDE_DIRS} ${PROJECT_BINARY_DIR}/ext/dist/include) >-set(EXTERNAL_COMPILE_FLAGS "-DTIXML_USE_STL") >- >-if(CMAKE_COMPILER_IS_GNUCXX) >- >- execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion >- OUTPUT_VARIABLE GCC_VERSION) >- >- if (GCC_VERSION VERSION_LESS 4.2) >- message(STATUS "GCC Version < 4.2 - symbol visibility hiding disabled") >- set(EXTERNAL_COMPILE_FLAGS "${EXTERNAL_COMPILE_FLAGS} -fPIC") >- else() >- set(EXTERNAL_COMPILE_FLAGS "${EXTERNAL_COMPILE_FLAGS} -fPIC -fvisibility-inlines-hidden -fvisibility=hidden") >- endif() >+set(EXTERNAL_COMPILE_FLAGS "-DTIXML_USE_STL ${YAML_CPP_COMPILE_FLAGS} -fPIC -fvisibility=hidden") >+if(OCIO_INLINES_HIDDEN) >+ set(EXTERNAL_COMPILE_FLAGS "${EXTERNAL_COMPILE_FLAGS} -fvisibility-inlines-hidden") > endif() > > set(EXTERNAL_LINK_FLAGS "") >diff -Naur a/export/OpenColorIO/OpenColorABI.h.in b/export/OpenColorIO/OpenColorABI.h.in >--- a/export/OpenColorIO/OpenColorABI.h.in 2013-10-08 23:59:34.000000000 +0100 >+++ b/export/OpenColorIO/OpenColorABI.h.in 2014-09-11 20:08:18.000000000 +0100 >@@ -55,6 +55,10 @@ > #include <boost/shared_ptr.hpp> > #define OCIO_SHARED_PTR boost::shared_ptr > #define OCIO_DYNAMIC_POINTER_CAST boost::dynamic_pointer_cast >+#elif defined(_LIBCPP_VERSION) >+#include <memory> >+#define OCIO_SHARED_PTR std::shared_ptr >+#define OCIO_DYNAMIC_POINTER_CAST std::dynamic_pointer_cast > #elif __GNUC__ >= 4 > #include <tr1/memory> > #define OCIO_SHARED_PTR std::tr1::shared_ptr >diff -Naur a/export/OpenColorIO/OpenColorIO.h b/export/OpenColorIO/OpenColorIO.h >--- a/export/OpenColorIO/OpenColorIO.h 2013-10-08 23:59:34.000000000 +0100 >+++ b/export/OpenColorIO/OpenColorIO.h 2014-09-11 20:08:18.000000000 +0100 >@@ -279,6 +279,12 @@ > const char * getEnvironmentVarDefault(const char * name) const; > //!cpp:function:: > void clearEnvironmentVars(); >+ //!cpp:function:: >+ void setEnvironmentMode(EnvironmentMode mode); >+ //!cpp:function:: >+ EnvironmentMode getEnvironmentMode() const; >+ //!cpp:function:: >+ void loadEnvironment(); > > //!cpp:function:: > const char * getSearchPath() const; >diff -Naur a/ext/tinyxml_2_6_1.patch b/ext/tinyxml_2_6_1.patch >--- a/ext/tinyxml_2_6_1.patch 2013-10-08 23:59:34.000000000 +0100 >+++ b/ext/tinyxml_2_6_1.patch 2014-09-11 20:08:18.000000000 +0100 >@@ -1,7 +1,7 @@ > diff -Naur tinyxml.orig/CMakeLists.txt tinyxml/CMakeLists.txt >---- tinyxml.orig/CMakeLists.txt 1970-01-01 10:00:00.000000000 +1000 >-+++ tinyxml/CMakeLists.txt 2011-03-01 21:10:38.000000000 +1100 >-@@ -0,0 +1,20 @@ >+--- tinyxml.orig/CMakeLists.txt 1969-12-31 16:00:00.000000000 -0800 >++++ tinyxml/CMakeLists.txt 2013-06-18 17:10:59.000000000 -0700 >+@@ -0,0 +1,25 @@ > +project(tinyxml) > + > +cmake_minimum_required(VERSION 2.8) >@@ -13,8 +13,13 @@ > + tinyxmlerror.cpp > + tinyxmlparser.cpp) > + >++set(TINYXML_COMPILE_FLAGS "-DTIXML_USE_STL -fPIC -fvisibility=hidden") >++if(OCIO_INLINES_HIDDEN) >++ set(TINYXML_COMPILE_FLAGS "${TINYXML_COMPILE_FLAGS} -fvisibility-inlines-hidden") >++endif() >++ > +set_target_properties(tinyxml PROPERTIES >-+ COMPILE_FLAGS "-DTIXML_USE_STL -fPIC -fvisibility-inlines-hidden -fvisibility=hidden") >++ COMPILE_FLAGS "${TINYXML_COMPILE_FLAGS}") > + > +install(TARGETS > + tinyxml >diff -Naur a/ext/yaml-cpp-0.3.0.patch b/ext/yaml-cpp-0.3.0.patch >--- a/ext/yaml-cpp-0.3.0.patch 2013-10-08 23:59:34.000000000 +0100 >+++ b/ext/yaml-cpp-0.3.0.patch 2014-09-11 20:08:18.000000000 +0100 >@@ -1,11 +1,18 @@ > diff -Naur yaml-cpp.orig/CMakeLists.txt yaml-cpp/CMakeLists.txt > yaml-cpp-0.3.0.patch >---- yaml-cpp.orig/CMakeLists.txt 2012-01-25 14:33:58.708744000 -0800 >-+++ yaml-cpp/CMakeLists.txt 2012-01-25 14:34:10.989085000 -0800 >-@@ -238,6 +238,7 @@ >+--- yaml-cpp.orig/CMakeLists.txt 2012-01-21 00:52:48.000000000 -0800 >++++ yaml-cpp/CMakeLists.txt 2013-06-18 16:40:03.209535420 -0700 >+@@ -235,9 +235,15 @@ >+ ${contrib_private_headers} >+ ) >+ >++set(YAML_COMPILE_FLAGS "-fPIC -fvisibility=hidden") >++if(OCIO_INLINES_HIDDEN) >++ set(YAML_COMPILE_FLAGS "${YAML_COMPILE_FLAGS} -fvisibility-inlines-hidden") >++endif() >++ > set_target_properties(yaml-cpp PROPERTIES > VERSION "${YAML_CPP_VERSION}" > SOVERSION "${YAML_CPP_VERSION_MAJOR}.${YAML_CPP_VERSION_MINOR}" >-+ COMPILE_FLAGS "-fPIC -fvisibility-inlines-hidden -fvisibility=hidden" >++ COMPILE_FLAGS "${YAML_COMPILE_FLAGS}" > PROJECT_LABEL "yaml-cpp ${LABEL_SUFFIX}" > ) >- >diff -Naur a/ext/yaml-cpp-0.5.1.patch b/ext/yaml-cpp-0.5.1.patch >--- a/ext/yaml-cpp-0.5.1.patch 1970-01-01 01:00:00.000000000 +0100 >+++ b/ext/yaml-cpp-0.5.1.patch 2014-09-11 20:08:18.000000000 +0100 >@@ -0,0 +1,12 @@ >+diff -Naur yaml-cpp-0.5.1.orig/CMakeLists.txt yaml-cpp-0.5.1/CMakeLists.txt >+--- yaml-cpp-0.5.1.orig/CMakeLists.txt 2014-01-30 09:45:54.000000000 +0000 >++++ yaml-cpp-0.5.1/CMakeLists.txt 2014-01-30 09:51:04.000000000 +0000 >+@@ -140,7 +140,7 @@ >+ set(GCC_EXTRA_OPTIONS "${GCC_EXTRA_OPTIONS} ${FLAG_TESTED}") >+ endif() >+ # >+- set(CMAKE_CXX_FLAGS "-Wall ${GCC_EXTRA_OPTIONS} -pedantic -Wno-long-long ${CMAKE_CXX_FLAGS}") >++ set(CMAKE_CXX_FLAGS "-Wall ${GCC_EXTRA_OPTIONS} -pedantic -Wno-long-long -fPIC -fvisibility-inlines-hidden -fvisibility=hidden ${CMAKE_CXX_FLAGS}") >+ # >+ add_custom_target(debuggable $(MAKE) clean >+ COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug ${CMAKE_SOURCE_DIR} >diff -Naur a/ext/yaml-cpp-0.5.1.tar.gz b/ext/yaml-cpp-0.5.1.tar.gz >--- a/ext/yaml-cpp-0.5.1.tar.gz 1970-01-01 01:00:00.000000000 +0100 >+++ b/ext/yaml-cpp-0.5.1.tar.gz 2014-09-11 20:08:18.000000000 +0100 >@@ -0,0 +1,446 @@ >+¬ìiQì}k[9²ðù~ 3Y R«¯Ìe°K d2$n >1¶×6 LÞìo«Ôm»ÛnÛØÆ<ìVK%©ªTª*¤+q^^WµÚ:Ýð6ØÿÆRx±ß~òM7ùN?9;Ü÷êʸë;ÿC¼©´¦ësÑh:4EmêòA¶8ð>íGû{A>Wyúo¿Ì^©Ñll4/ªðá»n?ú;º^þð ô÷ý¡ªàçÓÿûï¿_Ä4L³Yª6dòìÂf¼ýA¾R1FcÒ'cjDUÏk¢Y¥r©yE¾g)gÃ_ú rÖlÖ6<ùòåË:WÕúé·¥O¥ÕN^WË%U2%ûöä¼T)_ÔÍ.Ju£W~ß9<Ú=ØG«@Ú_OÎL¹ü\wÖÃu]U³æyùûVsµ¹ýê5¥ÌY*Å+¯öv·ß4euéQÒ$ãÊÑÎqë9Ø{¶ºd* >+M¬ ^O¼þMðòMX*UTùBí3£>mÿñÇ6¡T6õçeq >+¯Z4}]¯þQÍ<UkIâÊ»W{'Û¯_Cxß~<I~òjëd.¯öy¿»ï½~ï_oo¿$ˬÏ{²üÃ×â:¿m½ÁÚ >+ßØz¾A-!Ëæ¤iØÛ"LTkÍRµÒfï6q¼¼ì´ôéݽg'Ç{GdyÇ')p"*ÔD½Ã£Zn,ýÕ>¶öw¶A¨j¥Y/ɤRRªrIÖEý*ÍzzQ*ëN[Éúúoä ©º(Â0d:Ü÷YÔKXýfÒ¨£[;ÏNövHüFÿ9àaSh}ö¡ JÈrÒ©£3£ìÙì0ì¡ÓÏc¯m'·jµ²iÁØzýzoçäÍþ.Rzkïäé.0ͱbè¢Rúlê Q&²TI0öª¤êÕF5nßKÈ´ý·¿åÑwÞÐóV¶ èÏSY¿h<I{óD'yä¯|þõ÷£ ®nFí2°k8þj²/W<°HÚËWG¿o·uxLñ¹Õ?+P ÆêféÜ ³4ÈÊWÏVs<9~y¸³õ¬/$`ܲYoÕÐf´fIõ@Þ#P&¿}A0?óÕ6jÓuT½¨+ÓX#g«?4kÕ¬"Qíè@p6;þ$×I+ÏYNeØþñGpRlåÅÞÁSÒHàåF]=y/ÖÿÚZÿóãOòµ³îl¿9<Ú!µ 2ó$mLô³,R«>¦éÌ×QRiØHé°>ɵ<MìéAA¹k»Ð묤¢>6åAù°61L¾V欬?k÷xÿ ÓÝÎãÄüôàh >+FC£ãã70ÒSl¾¦?Q<÷dËwsçSåûfKå >+uu% ,ÖÛÔâ7ô6½Ï+Ó=ÙdÆ×Jf<:xs¸½sòl÷ðÛ óê(ùÓ¬vàUôIM¨OØð§Õj£Iwþýf¤R?6×ÉîþöÞgÞÑ·ìÎWVE,²U^ÞõÌ={[OwöNÞ<¾û°f-Èb%ÙrAíüÙ[?óS ¼°¶_mýkçÛÃí»Ç;ÛÇowH¦~.ñÎG- Y໯_ìï¤éÀ8zwtxp·T;«VLµán8Ë=¹ò5-úùgÿgütuáíî>w.áª`ØþðõõáÁ?ôÉþÖ«o'ÏööV}O.@Q©Ö´Á[ võKÀ»Nç°¤ »ûÀ¹{{'¯w¹ð¸{¼»µ·ûçêB'Ïvo½Ù;Σ/_,oo¢8ïE°Åö6iÔ* 0PíoW»}ðêõîÞÎáÉîÑÉý7 Ö,'%JÚ£Z2-è æpëð]»!ËØyègè*©TäL|6DeAøî.ó=yõúàð¸NCÀ, )תõf2Ëeìíîÿtò:sò|oëEZ:1¾TëD½zä³nðîæuRìîþ öï¾xs¸uïñ»×À>[ûÏH'Gª³Â<~:éäÐhLžÏr(`Þ¶ûf×½-]׺¸8çíîñËg;0¦Ø¬dý´_nÈöÒ?èùGÀjA5;Î9Ùùãøpëäà5vÿñÚ~¥OwwAÁ·æ²YøZ¡t¢./OTj$Ä`%üÊøFìÃ[> >+ù~ øákOâ7½|=±Á¢\& ÐÖkF >+êiëo+Õõrµrjÿ@î.0ßRt PPfõü¤)ê§P6òâôÔ?¬`¡U¢*Ð1u¯ÚÐg¨÷Y7ãüúÁ´sf&ÎÎ>¾-ýÔövÈØ&d'e(*°ò«Õ¢F×-Þ¸Ñ)·ÙìzZºoÃ3¢ÛÞs£GÔ¡N^,Ö¾'blÊ©!+«£Ñi*ÿïõÇ5òäÕqú½ßd¥[¿o«ñVÇjÑl©/Ô]º´] Þº(¬mJ¡²¦LRÕºFðWe&Ô£ØP*°vÀq[8×q£¸(7è±´Ù"vs%±F!C:R¡·ÍêàèGÑN&½VTbÙ"-qP¤´Ïh}Va¾ÞTK*È 8(cGwr/yöñ¯¶]©7åÙÛ9:"Ì¥Ôfj+³Ï·`?Ù9<DÏѳÖä*©VÊWD|0p4÷Zd%Ø&íjËG-}¯¸Í]<¶ï:ó* ¸nºTù(o9W=0Bà´pòYÔIk®M 3鳶ÖV!PàãÒéI5I&8Ò9If>#ù©2Á/6*M À|ÒjÅ·¤w-*-[[¡UÕ·ertúùÖ^2 AjýþvÒU6ÉßA3#¤rºr¸ózok{'"W¨4_g¿µi×ÂLJÌc÷,WᡶÌ3΢9[Q¶ d¢¼Ùò_fTdC°Âv·{:ÔÿpüÁ Ó%+ø/J³H$®WÏ{ô=l¤,QÓèÓ >+|ÁDÐæèãÃ;ÇYAbìV#¿'OÞrò«ü_D½3]Ù|6åGæͳKó®ÚBüÉí2'ÈF;¼[зm:Z¿ÚZ'ÐCs Dk4Ð,5Ð]Ȫ4GkßôýÀ ÏrMàWØL_~Ü<+5MÜ4:\%Néçæ\ °¶ÌÐÁï2p´fØpåE®0<3õhvõZ }l° ¾«ô¯¼Ý:ÜßÝì :]®=¶u c·]ݲ°E-Ï,Zïè&E¦ßÐPjÄÅëãkÐs,Í¥QMÄ`#gkç@ÀïLðuËÐ2ÑFýtÜEÙ0Ç_ûþÖö{%ËÈîÙ0²ÍúËi ïî[«éhéÑá}ÐÝvH&1³ô(¹ àLÕ 6Zûý÷<(ùF,eI¶úÇñ9ã/_iõréQÇY¿»üJ6©ËIiÝN¬lZ~þ¦¥a©ê ¯«5SGµÝ>òúðàõÎáñî pÀtûÑÑÁMÖx@Ë ag²ÜnC×a1Üå¶þØ>¶Û:FÇæc`@äMÔ×{ïÐ*H%0YæZwͤü@áQ:çÊÔ]0tCYâäõÁÑqfÈMß4%R¥cpV³£9¯¶\_ ÐcHª$÷É´p~[mYz¸áæ_»ó£µ@Ì@tÆëÃÀÝBïxçø½à)½Ùßý#x¯·÷¦-¡ã¨;äÄÒFM¡{Á*VusbÝðË·É**M)¸oäû{ïiÒ®ÙVe3<OjN >+& ty´§¢EÌÔÌn\È6úVp=³(ýtôN-·¤ððÚ§+þ§µê4Ñ:FÿJâ<FùCü×,>=ô·¢iÁ_ÿs]üwÇy¾ï?ÄÍâóÓO?·À-x\ZjÏÎ`05Ò`(7.jÖF¨±^+&¼çÉ¢d·BÁytÝÚ«FÓ¯æA¬bx®YGW²&ÈæÒÛ Ïª_*åªÐÖõزjzWJ1¹ª^]<NoêÕjÓ.ÜÃ{1èºmè« >+ì£öt8ÿ}ÐÒ³A£] K4çlÖúEZuþÉLØÎ%¥[?pJ'KKØP(^±0.ÐÝEà¥ýÓjËÒß ÇÕÄoM.jiKëæ¼ >+ÝÀ-ÜÇêt"Õf(»Y< Ç{îZ' ó8A$`A¤à[ ÍKWá%.Ù>Q¹j9«Sâ´Ê5@ä#ÛºÎcMøQè´Í^Ù¯6Í&A[_¥ßl^¦Ñ¥êEx£ù¸ªUr~¡Î~;Û =ã>]ò,FSiʺ=ó¿Ïù?ÏvµvU/5ÉZEo|Hþ cڧׯMý¼ÔvÚºWä´Èè5×!Õ¨34g׬´Q&m >+TeS¬+N-\»ZV@ Gíz PF£ >+àPRç¦ÒLâE¶rù(-±¼j+Ñ$n)¿W6Ê ¥fÝ G[!µÔ mh½.ÎKi XÜö¾±¢5ÛÎ5r^Ë¿íõ¥4ÎÖ¬³¸^MHlX5ìÇôþú]Ƕ¯ÖÙ<Øô"´¢ÈÊç/gédÔîI©±_Ô+PemaöÚSR0{\-«_°km/k¦®cx%$N1ªM\ôÐÔ¤ HZªé«ÆNÒ´Üv8/aR«;u¬Þzlq@Mëëî&pÌñËrtðüøíÖáÙ=BwÆï»Ïpa~ë×úÞÈq¸µü<'[ûïÈ¿v÷?^â*ÔÁáÒî«×{»;õh»? rèrÙÛ}µ«ýÇ+LAíA À^ín¿Ç§»{»ÇïÖïï#ÌçdìÿÃãÝí7{[äõÃ×G;iÅþîþóC¨eý?0iíCÙù^U-m½ÖbûÈöÁëw»/^{Ïv ñé´lëéÞNRtj{ok÷Õy¶õjëÅ-uP0[Ò:òöå&a}[ðÿ¶u@7là<®A/ÛEßîí¬ÃÝ#DÈóÃWkKN(q`@¹ý >+¢ä(YðùÍÑN y¶³µg=лû9òm<LÉwüÓ5ÿc¨èÄëÝþw7x°ÿgñé¢?ú'ÎcÐßåôɧþè÷ú{ôŧþ=¨ãûºß½ÿ¾ì¿Y|0_ÿQÈý% 8¥\Âe£_q}³}{ò®u«´6teë·ôÿ¥¥}qn6É»ÖÚø3ÓPõØÚí׶ÍwukÐ0§0vÃop×ï`YÙ¬ÿè^bþÇÒa²¯Ì¤½llõ½¾&=øFÖËíÕømÃÂ×»?|í´þÛÔ俨Ð8±:®ÿAt/àüaüÏâóä ¤ñÉ4Õò_ÎDÓÚóó l½Þ%çÖ}P®V?YúÒÒ÷éxèÄeØIÒÛ¯~)Uͺç¿áÒReeuéëÒ#øÿTjæK×aìV[?kõÒ9nÑzמּF¼5¬Æ>&ï ©joYæmÉ°NÞ_®+|JÐÙ.HsJ!(67åtAáW$½FÁ²²ÜnáòêÏ ¨FSon*t ýò-ò~Ü_lzBùÛÊêϪ\î,w,+i±L®5Ò8«Ög Èþ^X ûø~9AÉòÇ÷ÜÖ(m×ôÔÓ. 2~wæY½ú¥ñ÷¤W6·óq£vÑ8;B}Zñlm:ÿhY~iÊåêy[õrûtä¨i®¬fÞ/2W˶ÔgDír?ÜýÐæ{»Ñ¸¨[¼Æ%aZÔü >+7 öm²,¯Ú Ù>.=ú¶ÔæTTR/ØUÂEé¶ç.l*pÔÔ®gÕÊãYÆ'Iׯc·¯Ë?¤ýâ±ÍG0Y2H7ü@¾÷;È|4yý`&ú±CY¬©ùÅÖÓkü:ñ¥ú! £¸m5å»Hg2ÑÖ Y¹ÀE|oª -êP¥j >+ZB"©UK¶«ÒîB|!]m¤^O x¥ú¥5ÀÐçLj«\S1ÏêÏr?2òÞkujüdéTÆ?",-Ds ¢£²ú«V4ëÐQ@h´=èISáÕpüèä¹1Ñ@WaÈ-¯.ű©J9ùQÂÊYUªÚüÜUÙ!¦'aÅ|Ålmâ¢Y]·Ñ»õÕÄé#åÓ¶èíÓWºI vL{ßÚÐõ >+ ø-]®¬¥°2xftõç,S¯WëkD \µlÉ®Vmº@ÁmËj·Ê¶¦úO9³FÌgñØÌ-o&°ÅV«WeÙ§Uåwlºíw£Q:àbÈõ/õL9XeýÊ»îjùC²ºKjeIIC²¨÷!.´¼ëH\HOäym-xyú6ZØø DõOy¼vU oz«&6Þñ?} Z[ªA¦ |ÿ_Ëøð?ë1»'G{¤ý0w|QiÅÌ÷¯¢»ß2%{ý,x¾zlWË«i® àj×Êãö»ïP¾Úími´V9ØIô=Ý3M >+Çɶ̦e*·#µ³=Ñ´v×Õü5"/$ò.×æBWqL¥f§OØåójqôs>Yùàl"Y6øó§A¥8ÿ.íÖ4ìÓf}Ø/å9ËËzÑÉ-ædQ¶DoFh+æmÍ:mÀIÁÁù®Wkvó*>-þºæN+ÒÀ|uN 7¸À2æ@îÙm¬$Õ¯¥µwÉMͲ]Z®VL¤Â&ÂVÞT¶°E+½ Óì6/üù8DbÑMjµÔCüÎÿB«Eo°ý /PïYíª+ µJ!±ÚË¡DfZ¨éäʧgä1°YZ@Uë¨$&dÕ,}60;Wª7ðÒd.ñ µÕ¶¥DÐG uÍré¬ZÕIÕ9Ì@õ+«â8j¤,k= BñªÂ!ºA^d GË)L_ÄÕßÉ[#>%Ú©£Ð >+¢´£{öäÈÒ\Î^%Ï2×O·8 à«ÐÆ°A:&cÖfe &!Ø/ g¥N,U×åÉ¥²"¤9+÷PÀ%;Ü1c¯°nñe"0Ò¶Ñ*93l{Z0|-~mA|Û)MÝX]þ¼þ¬"ÿϤ¼ÎÿË Ëÿ°à!þg&üïlüZIÎ4³7ìæ«t >+n=iojL³u¶h-uiTÕK~ÕÊÚî2FÓFc3u`Ü6ZæS4þÛäP×Ç¥¬çüO>ÿY|qçv^¡Òc}eSÏ{|ãÃ·È ÜIûlÃ[ZJ¯E]7L²Z-3Ñx^*£ñªÚ8@\ë祥´õÓnÕO+èf Öl"ùé'xø¼0Ó¬5(LªÏ¹l±hc¿¡k"ý QulÏ5/Tìv²vÚ¢âeÍôºÔÆȾZúº¼Û\zô¹To¢ºþ¹ZÒä ò, v<l®X;ðJÔ?ý=øÖ·ÌNE¯$z²`ãz¡¥¢¢Îªõf!ôDïìU| >+'I÷,ÊÓ§w-ûÒ©¸ù)Ü}%j®@¶+DÞ¶ÉVü®XX¥dýFAí¢iWP`ttÖ}tèªjÛ·{U¡WÜ?w;Þ1|-¨ æú frE»7;ÊØuÖ±#(`êu,i6p}£¢½ÆS<2CÚ¹IVh)¶)ä7Â2RÑb ]¯jÍT쵦%$&8W«¶g¸}ÝBÈàR¥/{Tà{ý)ÿ[ºÖ¤ê¸fþgß3ÿSïAÿÉgRófÅ÷&s$ڮͫÐ"ÎX~.xÙ®¤õ#Édÿt7 ²í×CLÆix@¶ü.ÈÓy"7ÈÎÀCÉM¼¦£k'Û"سíU\nκfÙÔÖ=¹æ"0fÁ¿e§"&")ó'o2É»}sÙl1ÅJ- 2ÇóMüÏXí©ã:ù°îøOßöÿÎäó ÿäÿ}ÿp©|,¯¯¯§GÍl¯%½IØr*Êç,lðQkVx pÇÕO¦ÒXias7íÿµÿßónÿ¿Cîÿɧs}¾}g^wdïJ°Zפ¬³½+KÅ|9µR;+<¯Ãól%<kÏeßÙüÃ×" ßF; ?9Ö¨g!ᢲoxZ¶ÒoíÌh}ÖZ0º,019ÂËZ·¹H;û¼.IUOô :úù?ÜØÿ5O!ýf=ÝWðïFíjì:Ë´æyú;æAþÏâkÛ¸j,¥?mX~úûL4Î@ö--í_Éã#/=Ûy¾»¿IVü¾ØÙ·çÝ=^²åO¶ÞìcäÇÒ*ë óUAp§ÚHT³¨úÍ¢;°*&IÂO)Ô_úÊãN*~®J¦¬!^´ÓM¹¹_öåÂìýò7»òWëÏÇø ÐKö)sùüË$ójBÃQYìdÑ*voü_ôÕô&EuU4¬¶Ãô¿>ÇЪ4¼Þ©?þõ1ïÇPËy(øôìO)ß:<^Y}¨Õùæ÷O4â§æ´6Ñ `í&PË'Ú`Ð"Fk. m²MMb¹VÒĦ8ý«NÌÌÏþ¦ÀZïßluJucßþ ^§øÝÔ¥hÎÅéÊòÿ6Wÿm±\mCI*êh˾ï[-nX#'ÍÔXA(g1#&ÍiWó,Ý÷øï°~&ßw;8³ÁögTó1;$Útįõ¶·ö¶- >+ÖÈÿ6ÖH+izå«XM [;ÐÌÊö¯m§YÛµ¤\iQÌÒAz_Y¨7ºk·âãÈüçñ°ÔÞùw*XZïGêÕPî&+ÈlEO]9¹p.j ¯DmX¾Úz="A >+C[ÑSW §¦öÛ9i&^ >+0£ß¿ï̱«k ÷¸²i-+ÛÞ§Æã¸Z}3 ¯ä°EЯTüt~±î*ZÓgÚü´äãØn§î7ï?®uõ©;¡Õôn))ê}«ÏÉéd±Ûà¸êÅÅéÔqÝ×ãz6}o¢ö}Äîö²U óCbudÚ1±µèîõ-WÒGÇôA|¯1}ÝÐna:1Ä.k0G¬´fMR6N*êÁ°&t,ÊÉ:9ÑØ-ÁK´w[yÞÓyõ- F²±I=@}¥]Úv30KîU¯Êa#Ìý±`B·¸ÀëPº±ð~}ìªÜfÖ ÙfwæNåÿoX0÷¾3ÛÅÅöô´ÀbM st+cR´ A]±7¿üjºYíéY ÁÔñ¡ºf ¥VÿÆ >+:¦jW-p6SQ ¦A}m_<N<^í-âªvUMy¼tºÛ7üØ; @7ÃÖ)¸q6g´¼ >+vW_×L¬v [<&ØYÝ83ºtÎíÕ÷ý¸oè×ÇXhUø3MR5<ûã[;{jaY×âIêZL{ëbIãá×Ý »òøûRþ·ª(Çiµ;½Q£&äkuÿhu)Y+¶~ú>D¦¯³GG'Ysúm«ôkðTLþ#æXMªÃ¢ï,|\-ÍZíe×Vµï[8ë©Ù`_¾O´ÚDE¢Q÷¶RKÖó¬g%ûÉ48}Ä(Ïÿmüô²·°+v (T¦º¼ÜÚ¶·²³`høóxXM¬^S« ³Iúµ½Ûùã5ÞTÓî]R¬o?ìï¬t5=å}ÑÍãßÚÙ³ÃÃÞÍû¼päÇHw^»~xQya*)ÿÛPª4´ónæµÍjSWêûZØþct¸Á = [ù1}ØÜlùqÖÚÍLZb{%;öÚ>Ü\-À§ Zài1·Týsúdðóõ$9%3ä=±×çXoôÉ F'¤>éBQÙ¸jl4¥ÏdÖÒ*u \ÿacw¯ÿûñ_³ùt¼rçâ¾ÒpsW>ô xøSgzÆû:)é 'ÉA;³ù$û¬[×rY>Ç#i ÙÊÈ#\|0i@Uï¿@"Ú4Ju£.¸ÛÂöãQ:ÛåÎLúÎî~ËÞ}®Rç[²<Ûó5$ï]ý9ÛDszÚXÎ¥H\È'Êr)Y7)îÙ(è×:AÐ*ëÄÄm0½=|^®~L/RoSû¾'êõ«|O·/ê室WU3 ïlOz»ÿÞ_#à {º¾s^k^ÝFÏìBo÷aüý´\U¦ÈÖ<fHo嶹2Í{t{8RÏ×Ó~¨²NÚuå>Mñc·ú¿ªð¬äÇYÝ ÚCú½=ÊmqK~`¿µI¡@õ¶ô_æÊög¤$*`Ã+Q!Oëâ¢R¥VmØBâOåm_!º*ö$ÓN>TZmZ±Hö8mÚ`¤6þs·qô¡ªåj} Ù:¼£ý8ð«mÜ&IZN¨h ´o=H[±¬óÁOE]¨Oä@s1yg¥²®ÜX0Úà&ï¯ðü áÆûuÜmóJ«i@´U&?*»)¸ß²ÜΤ1^5Si,à6XDÊ ¥;síuÆÐ,2Áo1¶hêÇ7¹ù©`ú¹ü*0NëZÑÂ8ÔåS#ë¢tË[泫FI|yûo >+uѼ¨Â²fQ¥b2T¥* æìM»¼I¶,§$Ù$ÛÃÇNó`2ÌíÏD\4K.úÚa£5²ùÚa¢µ,åè[áìâÿUér>$ÎÓª¼ >+8âíà÷úé·Uw©ò¹R\i<Tâø)Iö½qÅà!«â1ÊîÇN#6I5µú½jå=*=H/ESXãÂ3ç$¶÷8ú°<Ü_®Á\otÿ$mûµMøPù;ùÒNZåt²B*[ð:mâ"ú¹IÐC¤ÊblWÛ/çÝ{åÃ?üzùÒÁÿ9î 4EY®kD¥JmÎ¥éõCh½åoáH®´éHCUô#&vwDÔÖE³:ÓatÇÓxÞhµ^*i(O¾ uSÚ~¨t±I:uå$§uÕ?·LâÝfÃÎ|¤u>lO¡D~ÿû¢:csìaÀSäáÍúW}<«^ÈbÚ¾`ÙÖMÓ¨&êþC jeýCWÁåë«J¥ÕùÊÍ´fF ÜbWI ß¹¨àªð÷Cw4ìaµöïËxv5«ºøëêC³qu.«åFr¸úcOÀËJÎÑMâÇ ò³|s.0SiÅèNòfÌÿÿ:Y¡t¡,R ¹ Zåæx_7Y:¿(7KëØ©¾@ÿÖ sGDëÙZI÷¤|α lL¹cc»k·gª_®~¨ê«ÚáYÕCA¾ !¾vz =ÝMówÒª¾ßº8¸åÙÚjÌdîHÃ"ÜõÃYÛª5MÒ¯°}9Ö[³Ë6¨åès´6 V7I§y8ºkÉ&{ðÉVE§»V¦5'oZ[cbôí*"È5î(4» >+¹ÎðÔKéÛöë§Çcë%LÂD[>CB¬¥ä:8ý·z#rz[jÙÓmfI¨N:V=-Ìÿv£ îVP`OLò?pî5Q yr>Êi¿%ë[H¼VÙMu WnÞwx[r&ªl), øîÌúiåꮼÝʸA#kûФøk,5<Ó]éÓë1#'n4¦÷¬aÿ»%0QÉzCDÛbã¿×ãbÜ ÊØ!Ã2C,*ü´:Uªßlâ0x¿ 3~&iÌ >+c¢èkG£Û"(BδÇÖØH¤ÕLSÿÍá©3EfÚ²±Äûub'CÒ®|¨¼ >ÚÔpÈwù¹»PÓH£`@'¾àÙ,%Æ:0¥&«ñ´´\ÞDý¢VBzûôê_¥NÑ:iW!z\º,ñÓý&MíåzÌ|Ykî;ºÃöªÉ££veyh2èÃO nöa;xèuí2ßÅ-,l +U>2´¤)N»Ú®>«ª-ÕÖ2¥ÚàÕÕ¿Öߺ!¯/êê7¹îV ±j_Iæ5KÀë4\§þ HÅF³z^¸|5vÍiéóàÐÇågÕzµyVälÁÅy©<ØiùBGñµC5æ|Ô¢B1Dx¢¨7O*Õ½ØrpU½TãÀ8O/Ô'Ó$+ÏKå²Ñ«"eêŬÕYªßpþÅÿs·v6Rg¨PÊIâqùNxC<¾,Æú@ >+^È«Ëä¨\ªÕL½eÇ'¥Î 1ÊÇèuÑJ8d½9ywUISÊÆóWá^23Pø¥2>³ÄN«õÐU²Ì|õ¡rtï (Ê®Aàòh4É[Óh~Æ2R£ylý×ѧqVª öÄÑÖë×i¨é³IúM+*8{lÎñ¡Ò lÜ©á$ÓäMR÷CÅ >+Ñ4<Ä2L#$m¤P4%yì¨Ù´²&IhMâvA¶»òÀÁ¯Á¾î:ØJ:6ÉÕvõвëf²°HH'brñIYhyÞJ YÿëèC%%ü&ù)!i^!9:ÞÛ®V¢TO^Í\F~)U¿!ZÎMþL~fîÜuVÓyt¯OzÐ'±~/x£·lôLmwðøì-pvûûoèMN2á÷ËÏD¥dÊöªYÇϤÿÓ4&IÎMSíâ#*ìöÂ×·F5ÂüãÖ¢IêQfùÄÖ±l qóg£æYµhµ #áÊ9:Ù¤ znØ8«^5F$h©Ú+®$ü÷q¤VRtäj¶W߬)ÍW°Ciâí³m¥3u#Êå+~á >+8H×äeÅ¡°?ÇMR«6%Y©¤ZÁÍy6&$¿o9±w4«s0Æ÷äº&fóv5·ï¾ÔØJQ3AéVÈÞ×AP«ý®e¯_å¿~m½ÑÖú«éÅëè»0µDyÜÛîéVÄÉ$*ÓkèIí¢d6¤ÛG¼`c¶×àÁÁãë{2R#?T:]G$:JÀâßèÍI(<K.e\<T¯¯¯¨Lßi×g±8ªÕ¢ÑÉßeüCÃKÊ÷PrÍ6ª¡¨w»¨s=¼¥¥®nw¨~¸ë"òÉ®KÔI7÷´ >+/¿+bÐпúýkп >+^»ÝÜ$í¾®µVêg 6é÷].ɽø^t»A$@î¤Ax+n¿1=¦+ 'ÖÜîÍuúïKÊ «tû±L¾Ô;GWMY*Oò$ÍÙì¨OäeþQjÔ/ÊU)ÊGÆsÍc`ôP¡Û¹ÐõTýXMvc/éÈ×Ù2ÂßVHèÚÅÉ;§õî½a¿FTo¬PªlNðC#æªYΦæ8é<@ Màãn»q®¯²HtjIÅû{e±~4!6îf,ë°¬=x çc*àLR]ÒkaÅ >+CÄB¹I½$Å°sÇ,EÔ±àCÕÇ'í4|ÆRäjËîÔP¢fôJÉG8 R$ ÷«*lg?\:.ùp¹í|¸ÜràÇüñaSøá¿gøvÀúëåÈ |¸p¨PðýÆÏ'}'ݯíÛd:5zã{>"l'²kó¤RÏÿº9 >+<½ áªI²k >+?VV7Éå >+µ7b¦)x)æåIѨØ'«VS^±)iaügw¼ªIAÌiñsÒnÌÖðÈô%ÿB >+±´Úö#*êãpY$_ÚÆåÈÖ J{ÔW¤¤wOÀëñÒ0õã«Údø«H # ½5Ü].Wó&¾âðê´ZÕòʹI<xÖP² <TÞNmÁï×÷ÝJ{yb\4dÖ ~y±lñgÛèøsf «Å9rÉ¡$ 9QD´O0ÿ/.¶çrÿ6ö 8&?}ND)^ùèi·þ§¤õx¸m6¹kRíÏ©¯«0`ÕÝñÝ(иþ$;õñù'´®%?Bz6í/H£Ã¸À~ý5{H¦ÿvéHíÎÞt|¢t ¦w÷<MYÏ9ö¿=ãtß|Aü½Êú»=Ó4#FSØ= ųÝˤ*ýÚØÙaïÞâ(îCu}]´$!Tvw=ëD%¿{·µ{úF'×ùë7Ì >+`ã|¨ _ºÛu'ÿÌ6ô±ó>Ô,G+ÆCÎ:ʾÜ>xïª >+¡ftÞS¬h± >+<wòæ&QíHÍ>Ìy[níê:ºÂà× ÈÏÖ¹Ür¿Wm6â´AÓs1Ýáf£{à°Îkk,¤g'·Ãïx2Rg¤íñpC¹h,B_qD'ÉäË4Q§nôw°G>Xnêᡧ¥¨Oh¯{ªn¬VT%ñDFóD뼨4J§0iÕ¨ÿôÛJ×Á嫯²ZÜáï¾4ù°|ôâ÷|6vëÏêüòÓî¿ýµm°vÆEåôöúõJTH©At©ßRã·VªªP¾"ò`ÜHÝFµ1ÔI6¹(¶wEª×«çÄÞºFD¥t.Ê5ò嬤ΰAÊPº0z^ªà½4àÁð3<ÁouÁ<Úñ*{d¶Cë. Ùö@6±hNñ{¼ ílüT©~)}jÖ¹TÆèÐ8Ã?3snÒ*Då >+E{EI £g.ê¸Tuz=iß>¿Ø}Qþk÷ÅaMñÃ<×Lü±_ýóí¿»/¼Ïzûégy~éí¾ø'ü;«©«§W¾}þt\xÿOïKæè)ãå¾-/_<¿Ú}ùôLqxvÜÓ?+ÿü,~Ö/ÎʪôôLïÞ^þµ·ýC¹ÿÛOîÙîK¦ø¿O¥óîóî¾`Úñò°ú|:}wôôËüó¯?ÿø³¬Î_¼sÞØü·º >+í©É¶çÍé;'ºÐ/Êúíïv_<¿øßÿ<N!ïÙ»óK¨CåùïWïþ8´mEXÂ~;å?á´±l^ìÿ|{ø¶ãÏ£§ÑÔãüùö¬,ßþÞnû·àhÿL{grûéùâwÀÁïW¹ÿê.vÐí9dþ(ð#nWËÕµ8âl@µ¥¯Mlö`.©¿1ËÓnEV|¼ãòæÀE÷ >+ü7t±6`²ÛÀéãîi 0Ûŧ¥n/Ãô*b /ô$ß½z¦,t¡Äòª Þ5h/;oá$¿Áãm®¤f½hIÛâÜÇ*¹Wý2f¹Öö9tæV4×Þ>EßÆ~udÔ¥@éu-¾cà òº6ö);evh4¥@ãu-¾cà ñº6ö)vZÖÈh,(5J ÆëZ8|ÇAãumìqk >+À :>|³N3øÝL¿oíÙVà8ù±|·s©0Jðë*ùÚ?°£´Ríd>ØÇë«Ú¿ÏÛ¯8¶iøÕláZ¨ZûO¯[óYUá ·[}sçkfþ¸ýí|LéÄKqViÈå%´&êæ»b%¤°£¦÷ïKnyÁfãâhÕõäî»+ÃLk÷ãCecc#ûǾþî®#{2¡ÖçÉ-"ÞØw^Êïz÷f,Tk>Ý{YJÛ Ò_íÜ=OÙæÌHëín<¢îjãMäôÕí³)né,ç7s+hÒK[ÕÁûLsÏ$ÿø¡ùxq:Ö[Ú;þøðêì<TZ?I'ÙFX+à±ý#@&åæëºQ¥Æ8!¬-h_s7¥öÁhA¶áp7.|Å7˼Èñ=î QfÊã-¡¶2;ø»@/w~[ÊcèÈÜ"vÚæÈ4¯^¸¤TÒ)æ¯N©æPÙúÕÅt¢q.å`d¹]tX+Oúf¹NF/FOô~bkÝÃëðòÒ\"p ¦~+}8Ðmhäµy ×æ»Þs¶F@²ÆðÀ!Æð >+Õlöxõ§Ïö^y FSG·±j`@ßBCöØ6¹bqÓ«Õ® ÞÛP9tDÞÏeè¿î=B>Êå!ð8D³)Ô§¢.:|âè -K§è*/âù7ASÑ 4"rï¿']¼6H.Çzöv¼·$½c©Ýó¶'á{P¦ ÉgJ²(ÜâT{^+=Pÿ¸LdQîzNêO#NìR´k°4úfOó÷W¦smq©ÒsqqF±¿lÖEÂNcÔuR >+^5N77ßì'wÝï<;ÙÙvr´óï!·©¤1A¹¤¾]Iî¤g?Òrp¿Úzm6 Ô9y§?"®Ù\ÝfªñäìP±»ÿûÖÞî³ýíÐ0ðÐâù\Zëx'ø@&ÈolNzi6n'÷v·FîcräJ¦×tþÏÞþµÕÏÃJÚ/DÏM[ù /g_íêv¾Ë« 1ÜX=ÜâG»4ëÙöÁÅæ ¶BCsÝ9Ihßb{V,ÚóR·§hµ%=áÇ:ÔÞLeÑh¶¨ù^æ^+i%ÝWWZ°~-¼,îQ³~Õ¥°µ>© >+RÕTðOö{U¡S¨I£=J°ô·¿%ßMu¶`6EÔ¥25\cÿVÕIoTK¼µpX"±(Þ$vüÛ`ÌÆ8ö}-êÞ¢ -k6ðrÕ|yÿ`ÜoÚñÛ/`w³ømÚ>Ì÷Ë/¿ôð,!S¹¤ü4ø(Húï-0¾zeuuƳøêpU¶_ý"geLgìÙrs7m«Ç_"éFY=Ø%?þ-ôk~Êa¹A2!ÞKÆ÷ ïWòÎmGiÙvÐ{ÿ%`î_ÖzKææÁ<Õ£¶øë É÷ã£ã>Ü5&?õʽce_ÛÊë¦ØD|"* Ø¥Åb«)Pv£ú wtlI0Ó° Ú ü 5E@7ø[[Ô¥ØÍ6:÷Ð% >+Äw{Þ$·³ï ªM¯òý$ÙgÈÐݬþx`ÎÌ$;X4wºÝÃÇiÓþõ÷6gÐhé{0QÊ0Á.c$ZÒuìycãlÕëy§±U q_HROk¦$WƤ ]ªÑéu¸q; SY뾯m=P12$óóq`¤¡ú81:àFfl:°> *sx¬bÄqÁuB¯m ÎÀ´éàë\ÔÆÅ{mÐÈÀð.©ÆÛÑex Hï^Ãëò@ [¿¾½tcë`*Kºq0^òbÊvó¼t9õÒXíõÚ§k,s£®ÏcË_»~W0&¸Ìe{kÉõãv2sù%öÑ>Ø>ݤ¶Í5l,Y¿ osÚ»ãm Ü)óѹ«°Ã`§°I7׺h¢,ùïìá7© Æ,_ªXô3ø2Aø9M´'¡´ðR# Ísþ)º<§úxóÑ yT2.q/¿éªGNÑ](ýz1àס >+íÍQ½#£»&=ÑnBüì]"ª¸ ÒzoúÜñ40P^ÂÛ&Úµ'ç»/°²~Ýnç¢ Ì««jDÑ=Á³ÝC$#&Ó ÊL@Qmê:hv-{ûíx »KÍ`-7bwóG`®áb¨M¯uÔì 0Ð79%FFGîDÉôØóB÷0G-ÚOã0gþð²Útèpòb,ÆêÝb¯OçÑgü9Kh' ä"I ZÌXÅÎPÉeß$½ì{¼v¥'T`ÃèIßãAÈÃÛ£AÎ kÉ#Dä 2ýÍÀ³ëÙ£-¬D¥&1=¨®(2@³¬}7&üìyð-uè9BWÃÇð#ä·þ4wdùñVh6pj >+yDéliDUÇþÝm°Öë8P2»4Û¼qàônÉ[KbÀ*)C#ÆS´2!;07Ö»q°o[dzXó;÷¾è[Û)£Jïì>+¸^ÀQOüu#î8¯§I¤ z.:Jo«H¹(YGÇ5c¿°°®¸qDYDj´ÛerÐ@Rox1¶;N%é£ÁmçÚ³.-gTÕ:zO|jªJAzÆ2N^@o»ô£oÝfïHJ÷T/ù5QT >+»ëMg]<ÃÐ3äL|"Éã5¨,MÚÀ^];ËEFu.õÊÁ7 :ݲððypkQ MÚfóºg ¿ÜXé.³4hI¾.E¦ËnøúMHVÝð9}.¦§Çµé~M2þëßþçá³x+q^^WµÚ:Ýð6Ød'&átåöæuPJ}×%øøý¦Nòl?¾ãæ0îpßoBYÀ=ú?Þ¼êë?8CS¤Ñ¦> dãï®ö÷|¾/ÅxÙyµ{|¼s!!G'/O|ç©Ã=ÛáÎ cÏvNÂ-ÐHGév´åûKßCAÔõÇ)»¤¼^9yu´}òûÎá*ùÿ¬´SO^ì¿Ù>9±1Ií';SÒW»ûüÛ¯ÄMÊ·sÚ¤Uòä y±½MµZµ¶Är.NÏ©Úþ4¦º| "L|Ã]ú>cé{ÐþJñÒR'VE-Æ}3ü²0)U ÙÑ¿hü÷oÜ°AãQúÔÉ@ËÆÿ,>0qøc@×Éý˧^oé_l´2u¼c¸'URó >+"²Wh¬âM>-rª×ôFYÛmßWé1l=[{Çí[ûÏövV2aP)ü$ÿäÙÁöÉÑñÖáñJ>ýh{koëpeùï vѵ¤®Þ;ûÏZåìï$C½ÉÈ`a Úq|îÐaÑRØã¡06÷hÑ~d\#"O?v¦|34·ÄC±ÖÜ %e¬È:&vµôfÜr# ¯[G/\/NlXìÈgÙÉ[ï}èGBFïREíjf"äÖ{ïr®h°Ø¥Bq)Bíú¤¸õÞ² £ÀU.¥\*O¸÷§÷q¨d`xÌ$cAÄbËp6ã¾T=½yâ»bðTÍQÃMýÒ >+ÆØlÂÜ£F2r'©á!o<f{={í⨠'tîjKJÇ7×/3Äì$ÍÍP)ÏÝ+ô¤çsî»C£f²f0À }iÏgo|W ¡7C2 ÏëÀ´#$WF1éJ9À@iR_É ü OåýÂ÷©G9̯ûi>}9=¿{nÁªOVÆÖW½(<V,ô~}OóñÏ]|ì ¡Ðq ´tWrÇ]çfÚþ3{åæfØ£QÛ}î FPßÐÛÄÞìõaOGÌaÐ*áJû:äÐØÜ$1tA9ù±#hkß½3bââmø®ã)÷h¾¤Ø )r$óCáFT3wÎDý ID<@AÌLjOFÝ.36&æ±/bãz^ g°ìt0çE½ÐÓ4¦1ZLBÄ ÛY¼s¡T*rO{^èºRÆ·¹ÛYßs4b >+täPA½(R:ó$çnAÌ7BÉtR¥´Ýx-'&ÎnAæ >+}K0_;A0ôJÉ,¤Ö#(`Òw¹v .#Sj|Qt³ÂýE(¡RRKíKÏ1áW=E,㮣|GZgû¾³8Ò`ÀÆß9_˸}çs|J:2ÃÃXªó¥síï âÈs&ºñqâhø¬ ñ(§ÒÍ`pQ{· ]eÇÈÐHF !¹*rÇb_sÒ@øÞ3÷Bu1¢Ðñ]bMµÔWtèuÇ»±à.A@íÐ:5ß÷Žê¿ç@y¡ÃF*7ýwwÂR®#Ïu9gg(sÔAîFìIÈbéËÅQfÀàóÿtÓ#©ë»^ìù"0Â:0kº©¥a$</ÀÞµ2pV,\ fS&¥ >+¸«Ii7b©áº ÜJe,]P >+âЫY÷$l1Î5bÅ kTKn&¦»ø(r ¯iȱCfh÷Ó= ßBKÐ{P¸Z!hjhkíÄhxÊ×>ÖaBÃ4êù¡:èûnÅÅ]¥ £QºRúaàgv·0á)yQ =Î}í¹ CFÓ6s::xdXà çÑPøL ½þx·0árãø*\×WP5Ù¸Å^⧾Eh<é1ßç4V¡¹uÐãj«ZR'tDDÒjhÙz¨bRÐyCu,|¡ {Ë b <¦¾rc<3Ù}4±ïÇ3Üç1ùru,´f¾ }b ½¦|wVÖuàÐHºÜåW>|ÐðÝÁ¡\Ïq̵¢aL1YÛe@FþånáÚ÷Åæ§éÉúPïÛÒwKÁMä*×ýÈWum²¹c¨¨q=©b?ad85:òn<VÙY8TR(×xÜ1nä*fv*cw >+åTP ZH7¢~ȵã¹jxeJbpÌt8¦\Í£(òOGÃ;f0íÌ!Æñ´ö%3®¥Å»38nf1FÑÔCqìhíNb>Ô$2óÂX;¯ãæHoèMÖ3+æc`Aià.\úÜÑ ð¾Ãµù¡q#!r`¸ /ÖþÛSö®^ý|ó=F¸Ë"êàøÓÈýB¿2N%âéi92ÃIlÆNº_èwÏs´ñ\{ZF8Kg$ÆKsjè÷='ò#¦YàE®ö4r:ìdäÊÜX§Ó>¾E #í¸>Ó!5tøPͪCÑe!Ñ/5S2t=m¨ç(ηæ³XÆ£@ðÀ0×<à.Õ2¸];ùNbÙpÄ2EìêÐ1aÄÌ-Åê1eíêj_Shêá½d·¢®,&ã(Ncár&Ælj~¢h%e¥G뺡%ó¸ëÍï>½ PÁáÔÑ÷÷GMѯ>~ ð[ABþƦñ|ålQì(ßì(äÉøò¨w9¸½ÕrbÏnÊ)¯Ny׍¾Ü "°®¦éRiÊ?î&´Ç÷cîùÜa!5Îð{æcÊ7÷Ð4¨DÅ£®XºÃt§-æÍ4 *).¤ãÇMÌãFÍàÚirAA9×Ò¦¥Ã\a¼ö¡Î¯*· ÄàalhÄ].TÄ°øÛ#Äå®}°Ôrç,³%Fl̸cø|ÌìwigÒ¥r'záçÄèK'}¹<Ô®« ÃÀÞò:bãnI»uë±ÿf±G}S©uëvC(ÔmÝ×íW>Ì0Ô {ÍÞõ@¡Ì6/ém¯Ä[ UûÑ$ÌI ñMB42¦M Í1ü¦ÌybæÍ?6 yHã¥÷Fé0T^,DàNÛ96éBù§wIý\9]2.$!d |®Î=*±+¼yجtÿáøÂPÁeÄ© p¹\xÍl! aX0O@¢Ê=i3µÈóY)`I8b§´êò äa0µ èYéYIPáZ}Ð0 ¯<ÏöVBô9á1òU¤tìÐQNöP©ø,ÜÄO\vÃ(ÃR̸<ðÈ2åµÈBöjmR1ÇW*&2\SáÉyعþ@ÈE+õ@÷¾1 >+Q*þ£yã!µ9XÑÐS!¸±¨\Þ4óÐú¤.à ¥;GÈyóôM¸ 4vX=Ìúíô©½ ô >+1^ä¡ÇÀÇäýI8@æ_9]Pz1åPɼØ÷aiN§14':èÒÍ=OBD®©ÑÑD®UsAé0{¶¥d )u§ØíÆÚß!Ù4è¥<ªPû:r"Æ#xaM¹û@¯LïáI¼®¢d±òæí´e)êóê °5¹+vb2$±PKIÈ(EuqÎîx Y9ÍxFqPç#íâ*Îò@²<É\¦^L9Lh;óS ®#âɺvϺ¾#I ½É±ÚVáÐÂ8o d 3JxÒ4åQw# ysýÞÉê=ó©1«ôüY7¶Ìwd4`¡ÎBm@ÉçQ0´SqNü;J¤OÓLKå:îD6ÎR¿£¢Ðø1 û@£8bb[ÝçJe¿£AG`$]*îÆÇ£Õiæw2R¸Ê®1:v¸b¾îÔC¦¤ßQÊP0aC©Ï§@ùþ,ÙèÙw2Fr×]Ð;!üĦ¶õà2£PF®ºKC'f®8¾Ë¦·Þ1äjóÌôcÔÀÅ\g²®_Gú¡ÆgÒÚ¿åD¸h¹ÈD"òåø"pp5Ã8dóæ(ã(ö¡v9íK.o9øå¦ÀEèª*f^IKNù3³ês[\Äê `K¡G+No÷Ü»yä¢ YºµMÇÂñtbí,iöÀE£¡ØësQø®ÐNJÁb¸bYí3ãÄ òuÆY~¸ÇýfPré8*cí¾Ì<ß¹ÝUÄf_fÁÓU2mTDÃ^ؽóaßaf¡Òe*4Å*Ú*ø >+y[ú½53û¡S¾çh×w©z0úñÁP\tE§8,Xì0t·{þ³Ì/³pÍ]ÊBá:<`BF±TC/)ÜÔä¹U÷éØûû#'bêñ31ÇøC÷_"ºÀmSSáp´3næ?]8|®ñ}Ç^#s¼2þ¨û¥Gd¹qD/FÒ8Ö^é6Ù9Ôn}Þ7ÄS»±/M¨´äòcÇc3÷s0¦q×9(Ù\ÇÉ)\6·ph®aÊçR9!wDÇ2-ìtÒ{ÑiOÈ8Tʧ2jΦ*tD¶pfóâ¡g4Q0ÚQ·w- [£á.G\ Ìx3-ó|åä/g4e¨Ï"*xèûNað~ãØDÒnä8GÁþdp¿pS'5XI+@!fq?õ6@Ýe;ì¶hìÆß@ÆÎÍLÒ ?t >+|l¸|ã#kÉh/³¨ >+ùãÈUQJ¢<ªµ ÖB§7ç-$*5ócÊhìyÔðÐUÜxC{üÊ<WJßs"JZ*6ZÄÄT´ De@ýX+_*ÍÕøÐg»MOXLT*ã2ú±ð<í19!QÉ\a¤ñ@JzÌÊ~8ÚZô*ÛÎØ( >+ÑeÃÝ8tÔðEO9ÞpÍ®iÜ- puqîû*mÜ>b²Æ£Â5Ìc,pµCÕhG¨O/°ò¾Â<påCAAüÉúaya|Ó RLpO4¦:97 çú¤~Þ\S+¨«<TäTű3-Ù3"tL c.=©Ô::ö§íÅ8ÕagCy¢Òï®ÚÆÇþ ¥ò?Vá®çrÎgBu?1¶¹B0W¹ 3Ú5h·§ö,(ÆW8>Ô£F¸àñYh7qú ÇxÚçaè2/?ºÙ >+ÍƯr|ó¥/°{¤@LuÓsa¯+ü=гE:p}9IíèE@>¡ãZ¥§$ST0WOc1³ÐÂ2têò£=®C2)[án_½;y2¸ &¢Ò÷<¦\»þðñÇ37óæÛÂhÐTiháRmâÈmSî,ÅþPôYH2pG9ìÞ(vÍٺؼ_ª9Ùú1^×aìy&òX4ü¥ßØÙîÒ~Ð@.GÈ ¢uÌJïYHl3n ]/bB»*ÔÌÜÚ¼:o~Éc[3é:êÀxÌó%¥½Yôò¬´ Ä6s¨a`ĺCu3É&²éÛŪ!w(¹¡ã¹sÔ9Y÷Xp£v×â:2ÔãIÆ=ÅâÈZ=PkÖÔÒa亾E1gÂ¥T+3 ³ëR»«Ôb4ÄPy*ÜHÇú'±ìÏ2»«Ô,<×a¾öOJq1Úý4s#äæÍý4jE:txäØ÷¥Ñ,f«r÷ÁK5 jy®ÅAGa@/äÆ7ó4¼ÿ4׫PÏÂ0hív¦píÓQF" >+ âÒ7~ÌUZÃ×Ï¿· DLh<¡ZDÌ}: çØ(rJß Ú $e¯ýth¾2o®iE¡rÍ5î ÒX@D¹í9Å£±tP®¡F15Øï ÜÁ9';LíÞMÀu@a®÷@c:ó.Ó£¢¾on$cíÙA4òÎüºtÙü { `öA Æ`QÞl¿ãêÓ]ºÔãXù£®ÔÒ¼(\ÿfþðCaa<·rºÖ¾g\®ËP)st0éc1þ>·Û w\'òðq_z¡Ëá³/ã ¼ ºÂHjj¨z:6ÒñÞÄ=K}ì¢_;£MäR¼:Ò ·f±ßàýíó¨ÃÇ2ÚA<üÉ ³Ôzï(úU¬\͵KÀñüßÊV÷ýºą-ih(ofóMI½£è® >+Ðø÷%¨§\ïf-SRUï(úí^K.¥r%r6üËôßýFy^ |"Hû¥J-ûçw%öö®yÜÖ5T,¦Zz¦¡x £íAy` b®6:y¤}¸xñC Xe >+¬â+_»xÉjìAÁ >+'rùØ]¿u÷>²J,=ûU¾ë TBg"!è(0fíá¶X%ôTìS&¢È#éxïa Y¹µ{£¨G&ÀøÊLbCä]by[¡¹-VQÆHã >+ÑÌ|%=17PÏ3?Ýa¡!×wýÀ¡fPÉÄQ=pÄürDì2ÏÄ&dÒS >+sÄ$4»núÞa 1`ß >+ª$ \MÂr×-Ü;ÌLºRë1 l1Âi>wkB·È[5b8¾ï3í£r¾÷νz9Çf,Ò(æ/¹væ{OøGL#ô}'"/2ð#g >+§ÛúöÕ+Q+&Oß7÷½Úz=$øv,L± >+¹Êç -æóÞr×Qé+ßQJ ÅwBzijòFf¸auÅC¥ñÝÈpIÃÀ£üÉÝÙ9§J Ð!àP<¢©Ñ4ìÉÁéO_ÓA¥`Êý»BiÎ}ÊÕ®0ßs1&|OÇ0 7;£¹¦;»Ì!ÆðxÇñ·ó&9Ä+ÆCÉw}íËá:Á\1ùÆñ/#j/ô(mç½Ã¡Ú~0<×Þ1É?Rhï©çd+rßs\E¥FéIhããO=$»þ@æXòXó(v ká)´c&=÷=ìÚÉWØ¡!$]Ï=Ï¡6ù½T÷d®ãæcLÈwuÄ'áñ¹¡Ì{WÆmL2îû< >+|c<GåñwÍV³ÉÎeëE >+Cfbx¹Àí(CÑòLú&PHE?æz^Û]U®w2Æ8¡á¡ aÈà &¡eÌR¿£¤Kµ*é{»w¥7µiJ*û¥u½X(JÝPs+æép´$n_3¿£ =Å @=`Ò8ä"¡Í4üRÆ26i øÉ}O±èÙw2""ãHSE2v}>â·ÊLK¹#_FÚ äÎëYMXÌè®[÷nÜ4¢kì bãÀ<èø,v¹'hìs6aH\´X\ä:ÜWiDÁkiÜ©9]F`°.Z(.a¨ YjÊiGLÝá ,÷<Îs"LpÏ|/𧠺bfaV}n<&5ÿ<È RáÄf!궸H1*£Èå+DèÑh'Ýk.·µ±[ã"Oî1:Q,ÁCÓ§pUÝ}bµ;Ì,ÔD¨ñðØñ}ãùÃIDåÞcþ3KÌ}ÆÒ1*CáSóîÞ»ý3ãFÒ5&ÔXñ¥Õ÷Ýuóü3Æ÷U"íD¸Ü3á>ÞfÜw½ÀóÀÜV~PÄCïï»7Ì2ok·æñ(UTÄTIéÐÄ>0˳3ï9aƳrdq%µ3üÑÎ÷ñ( Àd2ãIW+è)Ü|qéÆq¥`Q Dû¡?ï/ñP1å®ôëSùÃÜÇC$!}æj7&f!£Æݳ"Xèqn4®J¡PÃïâ¿ÃGJSf@@)ãø<ð¦p¹à¡EsIîÇ¡ÃB¥}Î]: i4/fÝØæXE±ë1Çó£(dºfªBgAdÃñÌ.M5gù|sý¢£Å ËàÒ¦|£I½åaSÿ7Bjêé0¦:vc&EÉphwí]¦¸?HI2 >+º.w 3j¬äà >+ÓÙë(´ÛqýkQ¡èh§Ç&Lg¼H0 >+] I¤×õp6Ât³ð¨Ñ4öAÂà ¤î¤ÇËÂÇÝ]x(Åcűôc×\vÈØÃ)ÓÙIrÌeû1<¢@L!ëaÃ|ôke\Å=¦}å:¾v@)¢èï~ûÜq£ØõMèIí¶j÷p(ÁÖÁ<³Ý*µÂS0'Pw´Ønþ8VÏ =׸^(ïfÜÿp¼À(ègBz^ AÀc¼Pù#íû°SýFÜϯ© ×õµg¢0Ò7s> ôGTÇCapêIOÎÀA{÷BgîÁ~%ê²8?dB:|lÕ«Ü+Vñã*Ô4sVRmÎÞãý÷U¸¢FÔíÑΪ»»î#«hÊ|éøèê(SAMDª, ÀXµ[;sÆ1¡ÊØ7* >+YÈRRY@VYåÛÛK£XÒ9ÓHxòúÝgy[¡¹µ½öÀ¸$òYlt\Á§põã§;ÌÌwð{JǦG¸Ïa¸|/ÄûõB¦2¡¹Ù >+ûý0}ï0GDx7qcj0üX 1ÚÝé÷Ó½Ã!bÇDDL\ù2F<YãÎLó¶y[:ùÌ\0F_F*¼áðÂrļ-ÊÝfÉHj|H<pÄ}æ*02Ì^xª<Ð(n%HÌeHoñwÛê bÇu£5wngËÌýD?gÂó|.cáqÇç#Þ65©Áû~:âÿ³÷ímÜHºû5ùmûllÏØîåvÇÉd7±gãÌ^N4\-eQCQq¼Iþû)4ÙhJe¢$ÊiÍ8¶ø64P¨z«P¬&ÆXÒ#Ϫ?D÷{Ü:DåiKÎç1¬/ØÛFѯ¢û°Êç´µPê9÷ß6ñÁ^k\ÞÓî×ÆG¦Là^ø©Jo|×Ðý«M¯Vþ'±w;_Ý}ÌgáágáëßéG·Ia=þsy@«wa¤Û~åÁEmNúÚç0Ì×f1Ðè´½Lb®²Â«w<"oCDzæf°SR¥Ã°£àηêp.~8ó ³J×/ROL`Á`¨N/Ñé&êy]¶a×Í >+ç¹)-\Ás*íèãu]Ãa×æt°l0ÍøCýúì >+ØÕ5 >+ lÕ0G£,¨m8¯rºvÖÐèµÆæ H:&7cæi$òmó0Ì59¦"±Õ( >+Õ%d )sJËÕ«ñ«ÚG[ÍÎÒ¨©thöÚ¹åh¼×¢!uÒ¥°`"¨³Éø9Ofí e1¡TDÒHìµ¢±u¢ÁGºà¢DKPþbDãªDãÝECr1üJ"8çÛ{N[±°¢q ¢AµF°®Pâ|{ì/F{[ó ï*82g£k©OÇ»Xyå+<Õuw GHûè5!F ` a³xÑs-DãD#ÝͦÔEIDÄñM§#¢q=EpKl^¾Txyê7~ÉÅÒ¾¸@½NFĸÒR1ôÚ`æk3ÌÄ:åÓP³à#Ázi¹ Ã|iÃ,1¥(Æ¡¸Í534óúeƶÎ* f9¨`8ÞÄ%e34óÚÃle[Éâ{¬ô&¶_JÎÐ0Ìk³· ¯Á!ÊÝøÂöôñÖj®Ù0äzM á<¶a6oý©k6Ì,Z2¸%fL`6oâܨa·keBªH±7&2^\¿ù" ¯hlUî!öjn0(Àw µSLqÄé8ë¸âÎú ÇÈ 7Á5.qØ N[$N¸AÒ¨4%L]§ÙtXi§§¨¢kaØ꺯qÚ:qòk®w(ÍSç=ÒèÃd8m8E¨0ZHâ5a̦6qÀÒ¢18mD±{¼õ4"!QÔçÛ#ze,{ûwÿÄ Eâ3¹t ,aÁ®(Ø.qÚþÝèq"Á"0q*4Èuz»×¶IÞó÷VR,eÀÈcF2x§Aê¯ô2RMeT{¬·×1*~M7]^(\§4ètZ²D`/¢s°"xB Ñëà¨TG%×p1gÁë+ÂG ´etÓâR^¼âAß¤Ò CAõYpWõ°KOÛÀ¢Ñ ×W½pT:8X2¬ ¸ð²¼¾"H¢X(-SùúÛõ®ÆÓ¨4çn« ¾°ÖÚ{ 4Z®È-h½ÏgÚ"ö¿ùèh¿@#U-×ïÓÙ9¦Ð´Ñ9¢}tE$q°ÛtôÞÑ3`ò"FjA± >+\R1ßwä½?ðeÁ´mÅø@µÁ\IðF®¿@7à AOr2`-$sB׿i#t°+Ü6Uq{4±q\yÇ vAZõpÓó ×@4xÌQf± ÆëÁ^iv TÒeðÂ\àë|÷® >+áâ£hlP4ÒÁsäLô Zpê7¶5äòhlP4ÒÐà¤õÁ0î"HÒ¹¢`â Í©`OsRiÅÕFmoM½ÕL&äZã6q,çå1Ìm¿¢ÁI¤ É"E^sÙØ2ë¥:kÉÌ ï QsÃ$£pFonÍ ×Z4Úb°Ìá@6Aµ Êö ¼6¹ð>¡Ú´ÅY0i¦Â,D©ZÛp "8àDÐ (#Á°öM¾ÛÝDð`.Z"#r±hTt"x¥)¶^+÷Àc&AÜZ.KθªÛA¯JS^jkoÏwaåFż"H±¥Z(¡3uÜXäU¥Ø"xDÛ½BÈ$½¢ø¸¡Ü3¤ë¼kC^©È±H¥BÉ$V«í¹jgwëÏ%D°AJ"7F#â+á¶sÕb6ö¿>ºU"0f/½Á#ºDøݵdsÁrD°Ád¢YtaqÁA,pÎ,Ó1$¨÷Ô)#׿$v«è®çÁ&W¹áê:mô²AÍ9!Áá¬Ó>¬½ecÛAl¯Hl¥Á >+qq 騩g_ýZô ¶ï³Øz5ÖxÁ >+*7vå×®_bû>f*R(V$RQè/pÍ{Û÷Yl}@Ä >+- >+\Sì¨6¶çôR×ɱ}ÅGo,Áé ÚÍ]v¥këؾÏb-'ZðÈ¥ÕGÀ3Ûb±}ßUÄv=±54ñ[©0gQmìÈÁ«\gÄvkÄ -vDep4¹õèÚ^±½¶Ç·b»fÜVì FL÷FmîÎûíÛ?òuÛ5`TÈ°¬¡oì¦k$¶ôë&¶:§{'}$ÏÌÄö/¶sÇP¤ÄU·þù=Üéñ¶¬sʹ³*óÖH AÂÁW`åVX®úÐýçî~Ì·J¦(U[âÑ»m*ØÐ&?h÷Ë¥"¡¸ .p#ÞÍCÙÐ?h÷SÍ@É´HIÞ-W¯WÞiÇË{Úý>"ðpA#¬¥pĽc<¿Z_k\ÞÓî 7ð÷HPÄß-Ñbèþót?·.IÇbC(~íîßüãíØ u!©úµÃL4F¤¥ÁÂ0ç5_ûÒÛa¯Í0S,#>O`"æ*ô0Ì:̦ó ¼BST$¼ÛAÐÝ=óEÍæsAâD¨¿ãqçÒÇqÙa^#ÈcÅbéÜnÂOƾ[Îæ Ýs0óRË2-x.´&võÃ|îa>Å´%VÇt4Á >+!Õ¦ýÙ0»kÿ0̽Òv1(Þrà(g3ù*9e¤3@s«y¤8¬úêùͳZ|õjü*ÏT¨ >+\*£É ãHyÕ³A4¶C4 Qt!ë5£ïvÏæÃ0hlh £ÁÑ:ÍDk½v öB7hlhhæ >+ÖÛ4¢`/F4®zÐ ï*#ÊMtB.¼ãa_¦ë Ë Îi©£xÃã¢Þ-Oûæ¹÷³¢ñîG¤%È%Fo1æëg5n óq}b×M4¼CV!)À3´ò^`øêæZ23Æ»h Ç áI/pÄzJ/¢±Å¢a6ÈóÄr±\{¥²>äµ8øU&_LHûâvC¤Cþ³<È°v:þ0Ì×f'LÒó཰ëbæKff71#"¸p¾ôKÌyýè!ǬEXi£Ï"ºÄ¡a×gçzd±vÂP&,R2/½äsa^_i"¨jâMT>xÄÌùÅ.ÖìnM æ ³v iB¬5È«Mäë_4»Zküa^È"RLg¤wX*Tç©Ã¼ÃLÞã²V!v^¿ù" ¯hlUî¡òsáDkF¬#âÌqzOÅ)^B41Ú¢sf]b¸g§'& Ê(Æ.0Ñ y(+ â´uâd¨! ) °çÅ;Þ®~ á«A¶N¸zÖ /òJïLK â´uâ<å3% Üxeý&Ê.]ÉÄi#âdqôÞ¥ÁÜ!PQA®¿«l»¶íß%þG'sÎ)e£Üðâ¥ÌA6"N*ò¯] ½ãÛ/Nïy{«ÄI)Ãvc«µ8¼ëµ8 â´wXâ"WF"¸V×'u¡kºéòBDấAKNIKºD[¢ötý-W"¸$Ñê¤Á  l¼ìÅA¯¯Z,³Òq<SHÈóNx5@^_ôÒÉ!ÈìÒÚ_Xjû. "x}EP#dw °MG óî«YhDðú h?G)²Âc,1WÌ-°¼ÏgÍ"ÛQ >+F¢±J°hÞr|δD0ÅI ØY'xäiI¹v"x}ÏÎD°=o'PË}òE¤á9Í/Ì#Þg÷ý^½n"¨mÄ ÃÕÌbI$=ßef×Aßïå·ë&|C¬ZI£$qÁ"8àe`ÐziçÒ¯ÕFè6*aW¸mþÊþâöhâ¨EBªÄN{v 7=¢q DÃ(Ò|V\9dÄå4ƶFiP)Ó@«CÐ8Ðÿ£hlò¤¢,×4E± 1ÉÏwã-ÑØ h + PoZjå.Q46LDc¢cÜQÕ>:eðÆ¢ÕäDc¢abÔH°x¯ðæZ. anKDøý æµ%Rq©c´RDÇÅvjm?Yêý ! X+<Q8*b5ðA4ÑH !á©TÑ 5'ñk ÝäjÀûl¶jÓPé)ð©lÁA/Q]+=eJiÁ'ßÄyUWb;àµA$¢g*(§5è;âæÙ]|yÁk(Yæ\: Ä! j}C¼}ÑêA¯¡2¦±i74s¿ñó¥Ø"xDP¢Zb¨e)¿±®*ÅvÁk%4lÛ`aÁ-Á÷ëÁA[.(h+¤ÆNÊ×O Û¼]Ù^*l§uóAã°±ÝÓW-[á íê@Òê¸ç!M]ÿ<±k+øŶAÃAü$BRé#fû÷Æ"x-DIì%µi©àY´öÖÕ^ »\P^·^QEÆ9ƨhôîrÄvÄ纱ީõs¨÷ëßì¶ÕkÑؾÏbË)#ÌRδ2FÀa/Ö¯±}Å6"'6ØD<æÒsA¦\óÄö}ÛÀ¸·ÆQª± >+(m,dk2¾ÕëäؾÏb«uÒXêöܱÝÀÚú ¶ï³ØrOµ§ @ë2Ûúe÷øXÕAl×$ i7Æ2i7w¹ÒÕ .3b»5b«'TYÉTrɼåJ];m{YyÛÛà°ó1eî)ÅâL³ðº}b»õG¾b»ØR$ôZú ¨Ã.7@±ý£g\7±Æè²ApýÀÈns$aÛ?´ØþþápàG±ùøãv|óøÉó$ËÏ>üðçñÈ7?|æû#È÷ÑÑÁô£æЯi§f?IôQô!.)U¹TÎæ¿ìì´©<KB Ü8䬧RJxíUôJ×Yå¬UÄVíVJ+O Ík)Aµx¡FsD$;ºw)AµÄh£'`½¶!2,êÞ¥UÖ"ãÚpA°éÞ¥UÖ¢6VsÁÓÒàóZJPe-¦[Á%GQy-%¨²RiÉCZÇ ×RjG_9+Øb,5ZÕ~ª¬ :¦GB!È`çµ ÊZ,¦QZD¡÷ ·(¤Üçµ ÚZ¤$àÿPæS²n¾ ÊZ´ãæâ§C¥¡¬«¥UÖ]:D{.°A0§×Rjß¾,y2:p#-3Ý» Z¬=VH¸`iÿD#ítrªdLQZGÚÓNPíÜçZ[ÚÄ,Ab÷´{T«-ñx¦e)Á¥Ó¨²¤%®råZJPÔGègEQx)mWK ª/ÉHÂ4]bôu¿ÕJ²`vÆÖ{D¹Ô$ ÚYI,Ê0-E=f] ÊZ¦4.5PØõ±ïj)Aµï±1Qì°&sé;mYj9Lp+îÁJiH7Ýè ÚÑYgåsŵ±«¥ÕÖ4&NzMA\Kk-éj)@µóEÎÛÖ9@AÞ~ ª¬ sÐNm:ÖÃàFóZJP=çЪ"ñ=ç_jµ¥þF@ÒÆ@5Á Z£°.á`z;á£îz¬UkKi¥óÜ`$´Ðl+KPE&£¬+Aµe ªµ/2(1hÝNº÷Å >+P$#,Äc©UìýÊT;úaΩ´Úè´ºG¿ÕJ2%D¹¥44@U:I.@µþÖæ]ô)uHê¸e ªû>DãÌ:ïÁ'B®TÇt\ÆW;©0Ï:¹UÖâ¨ÔkÎÀWÅY7+KP-·ÄÑ >+qÔà= ¢®ÇJPÝ©#bÃFC:¯Õö]¥ çQ=cgÅJPÁ"là¤`ì<Óç/Aµ±Á¾ÂVº¾Ó%¨VócJ=ÖÑQÃÓü®Nà Úw1Â#E Ãé£)AµÚ¼ mø°·RÁlwÙß/@µsß /´»ÅÀyT¡ Z6î(¶ V >+Ø£PRt2VªßkàS*<g0Ñu¶b¨Öîë%`D#evO.AÕ±¾@1 fëæ~ ªµÂD£·AQtÊwÚ²Õ¾ÑõE0!à_®ýTÍ`±C¦¹#ÈG0íÈèÌ`¡Zìv¬hD)X«N' ZI&ppN¨Á2Réx÷$ ZÍn9ç$yôJPpÜqþTÍ`EPÁrÄ(£f;ͱT¹BÔ`+1Rï@î:=VjÙ 54ètHZ8ì$¹ÕFHP`ܺ(¤U:P=îøX ª/à±À)gÞFCêyrªÕ&t#ÓH(ê ]ßiTSÎøxª5øDÜë¬KP-»ÜÆÍuDuó¥ÕKRΠ>+$ñu2Vj5@A´²å/AµÆ{MõZR+(ñ«ìñ Úw±ÜÀ´±ÜUh}Ïa >+Pu¾Ku{3ô >+ÃZôqe¨ÖV*þvZ æÀVUJå5¾Të¿HΠʽQ(Ý¿ Ú¸%ã¤ÁH®çÆÛÍTíYXe¤Õ0½Be\ª%;«÷q´4àeI^j£ >+)sK%eØ}×c%¨ÖVR'£ÊDæ JãÐÍýTE òyð¨ô¬KPm-Q+I`Vqö^P-ëóX)q+£,æñî]JPÓØPÀ,'TdmYjk èIº®^GtEã¹eªÕ$ÅÙrDN,SÊfmYj5TÂʤ)hÒèº%¨¶p1r0Tà×£ >+%¨Öîc>pTL®E9¨UGá%De`2¸®T¥Þ >+èo f<¡í)AµÜRÅ4p;ã´[ø ã¨[ê`±¢^` cÏl¼Õêd¸Ò:-~b >+lǼ\jG[ÑD!J40I®r¶Õ²¨Ç*Ï8û®ÇJPÝKجFKâ@¨r®ÕçS« >+@»y'c%¨Ú{'8·³)CL°ÐÝ|)AµóÃÀ>HC<?¸c%¨:ÚCÁ<çr<#YÖ%¨:Ò+À´ÊU¾E¢c}%¨:çÊ ê%¥Ymdw=Vjç0jASYìKPW >+P8&c; $¿±T½.5Nòä¸*³:PmÆ%{%Èeá,{I%¨:¯ ÓÎGq ë=Êy}¨VÃ8Ì.qF%8F<³T+càáR^¿Ô#ÃmÇKPm!²jEÒÉýú~ªåüF¥ó9¤F; MÒòç/@µLèB$¸ÑéÚªtmKäTËÆÁ_Þiå&r+óÚkªeã&®ÁgàHD7÷KPuV']È£÷.zÁÎY7¨:¢è)ç^£Æíuι*AÕÑ6Âê´!¸ÃO.Aµ|3äÒNrMÛiÌ»/%¨V[ÂÔW.EóGÇ;/©Õ®ñE ÚÀ꽶0%¡êÖø >+Pí¬Ä4% F@NµgI¿w³²Õrì0èA0D@rt ªö+0Q[0x¨ £ïæ~ ªt!ØÍÎ Ò}®ÕÎ}² >+A³Dt Z¿Rb%àû@\©+AµöqÚ"ïÀFõ9½¨Ú¯UÔÑ%N929¦Õê1PQÚ2p (´ñ®Óc¨)¥³, uXszKPíèÃ|Ã! .ìȳ²ÕòdKÌJ$)Q)°;ÖWjµ¥O·Ð`¥cÈCÇ`KP¶$V5K >+jÄx×,JPuìØ0qà«HLÚ¢ºZJPuF·@4F¡£<6¯W j,Km)Ìïh'/Cµª#j¢Â¼µã0¨ZÆ¢!ÜY=0U]k)AµzL >+f<ÑÊÁpÑt¹Õéö0ÇAç7Y êõ} >+Si3æt:¹Uçö(F{àà¦R¥}Ç-KPõú>ÃhéTÀ8" >+q×c%¨VƨP""«¤àħT>e¬U¯%EDÚÍ:QËlPí¬L·ce¡«£u)AÕ¾&JF Þb¯1°ÕNÆJPµ¶4±á¬=¥È?3î >+Pí»° iß0¸./©ÕÖBaV kÑÞsÍ»9JPõ >+/Âå¼¥ÜH8îF¿Õj<Ç^QÔGm×c%¨vôYÀNP륣c´9²Õjþ´psYm=òç\¨vVRr pTñ >+.^7+Pm-0³¢²EMÂwãRj½$rÐTÅ \ªùI©Ú)ãMÁÎd>¶ÕrKDÀöà`ãÁÝB&û%¨Öîs¶¶"Yb¤ÞÚÙýTwA½N» ÷6¥"¼Tjçs:: «Z"ïÊó¥ÕÚJ£Ù9x Úw±) ÇKöÖy î0ÎÞkªÕüéòv'ÀØâvûtK¹*Aµµ¸ÀpP ç÷|¬ÕÎ}®åÐíéªcJ%¨ÖiÐ/EE\ô ÚZøÙÐ`©)í)AÕùàÅd°8Vó)¨6o¨$Ù`ÀïÆà°vøT7 åV! ÄLxATª×_s0·Ñ§%|£éfe ª®Å(dºJ [¬÷ÚåZ¡ZÿÅÿã0è,×`ås|¬Uû/Ê:ADLÛÍgæJPµ_ÒÁ$\âµ N.Aµ¶"p%g &g ÚÑWd{Ab¥åÌP5·$ÃÀ >+ íÚÁ äsH >+P5·ÄJgcb±õÄg¯UçZ[î,vÈ`æ`~ On)AµÆ9nçÔ++¡Nà ÚØEÀ*h&cÇzì¿ ÚwñÈy `IB>D-: SjGGCÁ0Íud|ÛÙTÑ-"vz¼+hu^.AÕÞ«IÒ^p%Ô}~ò2TkÓÒ§ÌPãSçÝè%¨ÁZFò2pÌA£ àzÁ.CµïBPÀ)äu{ÚT^.@ÕY?"yJ¹Ìg Zͯ±µéÔ7pR)w8í >+î4ª¥¨C#Å!ä]èfe ªöUrQaÚGð¹·,AµóGÉÁÂsÉrþÌ®e¨{E(¸Qvmeªµ/Lè(eJwG+Dèz¬Uç18JEm@v¥'})Aµ¬O¥óëÀßJIôNfÏ¢Õ² 7ik ^±È¹Ö%¨vå2iÓê >+[ç³P-ʨ§>¹[^Ãélª¢%Ø8PpPãòjBªÎ»H÷-y`9ðáÁ Z_ 5Z¦môLö¾XªÏÄ >+æ¸R+"LÃì ZINhõàq-¯f\ª}1/x`Ô9 ÄË] Z>FÑ<-®ËÁÀæÌ®Të` â`F,Éùü%¨ÖVB|Ð¥ðt'ËE ªÂkê8Å.xdÌñäT;_¢~âÓéo² >+v£_j£pB112RzT@4çô ê' >+ÝrqÇx§ÇJPæOÎ)µ)ê¬ôâì½ ÚZEhDÎñB#dWKªåc >+="=R^¦3:ÿ¥ÕÎ-àQíÁoÉ#îæKªÎµ Òxé¡òªh ªåü3*8r1 íU$óäT«Ç¸nA £ ÒVä÷T;_q`àÁ¼Â γ(Aµln:ÈDØbá,7õ jïX £\Î/Aµ£Ï01(l¹#NaLL7.%¨Ö"W >+Âj`b#åx_ùdãTÛcÀÀÿ¡ «{(¯] ÚA%¨FìÎ÷ jO<bÆ]J¥>ÙUª³A¿q£¹²V >+3JPíèJbéhó"g© zmIsFàH"}¿»¶ÕÖl8ì.@YHÉ ó»T[næV¥]T§:I.AÕY70¼ ³ç)`GúSg¡j=&x:%9zw"¹ye ªåcQ+B8¶Ú ¬Å(¯# Z<Gª, &:Êø+AÕ«<X"°@»=W¡Î+AµÆ<1étèÉ»JPu´ÇGRNsÈϧ êl´4zª#3$zÃè,r ª}c"A >+KKAr HmÞ][jka"&^C×´Ó%¨:¢H élÉÀ7àzeÎ_ªýJƵfQi§2ûØxª}¤ãÐ'"Ràx\Ç|BH ªµÜ-ªLèª o¼Îö¨ÚGy-Ð¥#ë¦Ìò!)@µñt >+#bÊSp1÷ùìTÏù©ñ§GKM>»£Õ®&ÓFø'¸+wïRªm¥Ö@ìµGXk ÙK*Aµ=Æ8laF#öd/©UgªèplQnP÷'-CÕDÀGRóVúóÇ >+P-OÎNá¨| >+ü¯ÌJPm-R Ø\Ä S¢³b%¨ÖVbëÁ1ð'.-A3æTë½W¦4%* [jká>PA±«hpÊÃ9j]jõXЩ¿Á!"pvÔä¬Tí «¢%@¸%#bÊT£ÓƳ´Zô1º|®Bªf}A(H{¢ÉûÅTÍ`ãsX'À榺ú}KPí|I'@ YP!º¼»Õúb(` ÜÀ =é£p¨V%ȶ1åk[æS&j§ùKPí e2\o¡òÉÆ%¨ÃP^)@P ®]>¨Uó1° J`æY+wr êx2è÷`l`BYãÐá>¼Õ¾¡¬!¨DàwàßQw Ú¹O 0-ÁÊyA)Ë;ìJPíÜO3 (]0Fý:%¨V[Ò:òÈc üs-r&d ªõÅÚÓøµÁ`'0ôO>½¡ÕèZöÓD±5RÛ|2X ªÕ0ÎR ½2T1FS%ëïLYªó.k¥gé1¸9¢XjßÅ2æwê-Îy¨vô9 >+>Ý u³rNo ªÕÉÊJG#JDdARóú >+Pí¬naXó(Hépaoe*AµìÕ·óÂ1¸?`ªû%O+íuZäËsªÎI±ïVL wÐ÷åHoªåÀ± )ÎãJº¼[°UÇ`mº|CIIÆíDoÅ >+Pí»`,<²éáyÐJç|TË.@J¤AÐr¸å6GH >+Pí¬1Õ µÕ >+enYj¬Ã4¥pHzVJcífe ª}§Cébx3ºKPíÜGÈHjW"ì¤Öù]JPulP\Ù(À±Ë·2 j¿t®Wà:8L¯;Ç`KP_÷P8$ÌÐ|¾eªí1AÄDî|Ô³KPݧF >+®ÒjÂ@ñS^bg÷PíÜOáèÀ" >+RE-¢3ùv¹Tk+# é®2¤à¡"α¾TëK×Gb.PíTÖü%¨vô)ó a¥uéÒÊnôPíè«tLv·KFǼ£U{|^F K'ïòôøe¨V[bÃ9¸ÑpîB§4ÇùKPæGÄXMªD½"Ù" ZtÛn"òtÉ9ð¨V[²ïNw`¶· ù|ÎUªû e÷ÂÇFXé|?rª}HJuÅÞªàÕÙþ¾¤e¨Á¦0;°aIA\QKóºYYjç>k"óéQ¬ðª?á°Õ®¾EWR%ÿ´ºò9$%¨ze¼9 >+ >+$°`Ë«Õ%¨ö]Îs%¹ÇJPý:2tI:ù,ü¡>~ ªeãFYè8a¢¦vv¿UsK$Èq:1ä[eKPõúèZ.ÅÅHRânÞ¿_jeL .^)$S)ÖÚ±¾T©ÎÅ6!÷k¡s¨[8¦Õ¾Åàe#Àþ*"i¤{x¡ZIquÁ)E-Àð òy·`ª®ErXEX"l¾e¦Uk~+!^ιB!æ½ %¨V'GælôÐ'0·ióÙP%¨Ö³ H$wfQiaN.AµMcºæº¾pÄåìôTíñô¤u| MTx×_JPµyðeD+-Ód>% ÕÚý´a#ÇÀëf$ø@;I.AÕÙ2Æd¦cÆÃA9ï¢U[dæ°uVi ç»lJPEvÐïélªìVýNáTÍ¡G\ºfQ¤IæS4KP_¼ÏzM á<oe*AÕk) Ñ`L Á/Aµ2FGbo´H÷¼ Ú¹ï=ÕÜ}Ð àݤ?ªUgA;®¸³>hä12ÈÄ|cªÎQ`AH\>*Sݸ Z¦¤¢kPWiÑïà.Aõ±>͵ãf0AzïµUGFI¼ÏÞóÆKPN&h=XAëÓ]¨Å¼ïµÕúÈ8áC. [6Kr ªö+= !§ۡNçT;÷cH7ËaN0JÉ«<%¨:k¤¦Vµ×Èz{¬ÕgjDº§* >+úæü±T« Ñëà¨TGYÎ(Aµãâ£JgdKàE2]*û½ ¨ze´ VZ&F½"¬Ó%¨VÃG¥Ã[kCeÇ`KPíèÇÆBéh±$gÖWªsGA´ÖÞÃÐh9x]9wtªåc>z2R@ïbOÀ9CµÕÎJ£-rD§4ÄÁæ»Ò >+Põxºa[§ãñÔbóaJPõª(lm0é,«à̦UgÝ å@!±Â`~9¡9>Vªßw\hdJ´>æwYj£Ö1-â3x¨!¦À:Sj#$Q£>RB<{|%¨Vny >+Ó0Ç}^ã+@µ³iI(¸@! ã.ò|^_ ªmJ¹[iÅ¥´Ok,AÕÂ$ðm¬NþÔT+c$RdE¼æ<±ïd¬ÕçgT FøΦÕKaÁ HLèïM(Aµ=ÆX]ÍTPåÕýù0%¨6¦bZ*<i`p !ï²)AµãÆÃ`©N#M*¯ ê5¾ôT ¸Ï0oÿ)AµzÌ£t´& ´Lð9S¥U¿¥8Fàaæ¢ÙV Z³éà7Aé@|Ì2VjùXÊs¤2eËT¦Õyå½UçÈ%%â+áúü±e¨V[bÌðé ¡Ó ¶,@Õ+#é>0ïί·¨_Yj=qfL:À¸{pÌÅTëV'$8®C]¸ó±ÕÎJâ<2LGÎéfeªe}mlÝ/¸U!ÂÌç) ZûÂT¤"Ëè°10 ;ûRjß% b¸¦Ø1îøX ªæÞXÒéB!é¨ÍÑT;_,'@è"6ÝXát7_ >+PÇGS7¯¸ >+ó´Í5ïYª#$é°GGDP&]RÈ\ö,JPí|IYX°ï`¢¸7*Ç-KP$SS¤à9CuÞ[]jm%u,'̹wÒGÌ+ÛýTË8wþSél×ï}[ªó.5oýA°ÂýTëW2ã-§ÙR[âQgKPK§p(".(xu¦¿ñ³U¯ð² Òeh1Næ¤%¨V[Frʨa-E:;§Ó¨¶Ç$2:oà/ïÁø¢¼O¼U³>LcM:j,ï)Aµ|LsaÓ6t·a\» Uªy²D$!5@I@ñMæÉËPí¬¤ÉA~1§+O;)AµïÍ!qd*"èø|ÿKªµéæRþ!8 HL>ªÕk`áBûþ÷T+c2eÇä¨Ru\j{ÌÅ LðU ÂyÖé±TçÄÀ±·Ð= àÁcÍ>r ªÂá2Ñ/"ó !%¨ö]qú%l²^³Qê£ÖélT½DëEPªÙ¸'*Xoè÷È( >+9׺ÕÚ(71ÆG¨é¦nôKP-Iw +`)ôãÐEyOb ªû Ù¡J4>Åò3)Aµ=æUÈ`PóÐñ:ý}±Tû.§cËL·08b=Íç ZÏipäA`¦å2bÙéäTí#å2ðßHåA浤T»*êI7È:ïe¾ó±U×Âá308Û¸`s-ËPíÜÇó½EQÚè|ÃTªÎ¤Yp¸t¦3æò½Õ¨¶ÇBJ×$æw::Å#fò T¨:çNXbA>vRªm¥b:8#½KÇ snO ªeÊJoqBYÐ'"ü] êÞt«· ®±àÞw£_jc}[¼hÖt³,Aµ2& Ê(°àÜfp>¬UÇaLºËUJ!¬LG/AÕ^RÔ+è$¼PÊ+÷ò ZãÓ LIB¥¡U6ß)\j5?Þ;¢4tV¹e ª´ã3N´SÊÆ|B{ ªÎQT4å1^»ö#tv¿Uï¿;6 hR+r®ÕÎ þ/q+#D\«l÷KP-çBZ$éÔ¨=ͬ¯ÕgÝê¤Á ÂIº-kËT-É"uºé¼)Ï@õJ%yªåÒ © g0°IÝïy/Aµì!K<.¤¶ÉÁËñ±T;.(vaÎbýý/%¨V[£Dc`18ÕiËTqvÖ¥x>eZw >+ jÿ%PË}_i¸ANç{xKPuAQd¸¢Y,¤ý½ ËPí|q5Ä >+úÃ);ßÕRjÙ ¶ì`:rÀ%g;{I%¨VqÚ. LÇJì´Ïû_JP-»H7p;åÑaÅ8E9¾ÕöHZ,»DLà óÞêT=_å:eR,(x+÷ªËP-±Â J õÙ¨¥VùT§ÄÒm4ö²Éw> Úù¢£F}`Ä{ ³æ/AÕÞ«¶D*.Ó@RD,?{¯ËP-Sú´;I§e«a :¦Tj{ N)àÐEÍE9Î_jßEB¤G4ÈòJeÈÙé¨:*6B¢§Áü³)Ú³¡¡ZI§$ån9%Ã#ÞÉX ªe}È2çÑ *÷X ªd¦±`pmPÞÐFȶÕÚJn%Zb`¥ic°¨vý%t¶DØßN²ºõT½òNCX!~¶òlÅJPÿ-xs'¯ç¬T;÷}HpsýTk9Ã$J13<ßcUjg¥NGm:ûSÁ²9ß²Õ®%©~0ÆéQºß»¼úVj{ÌzOÒØ>rõ>ÇJP-ç§0BªÁG¥Ñw£ ÚCN8l°@P1^äôJPu.÷Ö7¤A DX·U{|àK=Jw®QÞËSjÇÅ¢ áÌïà.Aµ2f0èuUÜtd z/¤JCìíÂmY%¨vôv>&¯c[ÖÍýTk_xr^KDÊÝkwºvö¥UgBz=» xº#£=¨PË°?nþçá÷ß=ÿæñç?>~öã³TûÇ#wö O濵_Kß:ð£XøÚïþËþ¼1¯öï»ÃÃûè?Nññ9ðûaòʸÉøèÁÞ¹ë÷V0Ö¤¿¥àíßÌ~Ì «L0Ìk!àïaÉ(ûmàýÞús3rMIZxrÆsé ´x>{&ÿ}M~nÜþ±³9p4»é½Þ:¯L3>páÃû§:yù8ý£}p >+?é\N<ò)?:xñùÂ'.ÍÉôó?<0¯ÂÑ¡q¡Ió¶ùµÏ£ýÑAh¦~ggöåæ?ÇÓpÇà¡ Ï?j¦áéÝù÷ÒOi;;óéߧd~i>ýtþÄWãc»Úb}ú4Ó?: ÓãÉAúÆ÷ªº3×4¿·ÿmÿ3ëµæqzí úÃÁñ«æÇ7¡ùµùjìMï¥=>}òäxÿ^ópdî5ÏÙ7ø;üsþü«}ì{s8ÿþ4¿÷MËÿB%>Äùû|o&/ôOV<`ÜÞxò|Útÿ(پ̶õéËÏï5¥7/8]\ñÑ£ö ßÝi»Óy÷^*áN*ånWÌy!ðÁì+wºo6¿þ¾ÜÌÜÀþeîSí,cV[¡CÚÆðT0¯>j^OF '?¹;õ^Ú¯¾MÝ^ûÎwOAé¦@Ȳ³Â$ 7»o~²²0uGWtbÒwn¦Î:·ýðîªb[©_«ÜöÉõÍ£µJ=:+z¦R@Xî¶SÎ?=7»oiÉ|&¯×ùÃk¶æ¬J×÷Ù£« >+ê´ÎZEu·õ3·nËÿýÄo3»r' kwO>ØÖ>ûò\¹.~ÎÞdyúw¯U5\ñóÛÏÌTHRKe^µ÷û?û¬¹s¢xsª:[¨Ê<HZ'}×ÎþõÑGé3óbþü£ýd>>íó·Ïd}öù¢j|[coÔ4öÆÓÖt²C>pû0Í÷c÷²ýî_fÄb§9³=r_>üà×?¡½4]<ݤ;'mÔü<LÍ~<æéèÚãWðøl¶Ìº#µá£ÓVáÕsãÒÛÂí='ûåUnÿxKÇ)nÂ4K!wïè³[èNuå-?YQõ,WÚÚ ·^bu-©ÔY)ïÒ3ó²ù6Íi]]£æéD«Êäk©µÅ6ûÇKÄc½÷èxéB]÷æåû2áÇ|%_û*[ô¶¿Ã(Ì^?E: >+ÿγ3ÔËë®Þͨì®E®ì©ÙßÞSÝ?Ú:ÿrÜôNÑâB½¡ _ªyöÌ'¥rã¹³3Í£½Ï®àóíþ7@§?i>ýþÊürg©ÖôÐpeNuÃìãS¬$ó³Xòè3ôÉèÓ'þüç×0wFÍç-¿é¼ðÂWú¶·ò3#.'iÐY ú4è>ùG¹AÝOÇÑó;ݾþñ÷Þ=(ðÀôó{ñÓ¾ÔÇÿý×Ç~|üÕNsç`<ñ¦«âîÊRûï?|ôãß~×4;]ûæ§Ñ[Z·h'g¿ÇcX?ÀËÛƲ Ipã?K6=¥¸qzTáÃÑë1¤9=OþVò§ãp¦QjågxéñäÓ¶µ/uÃ'g?¼ø¦|øAçÞ¯$yXyøä«ïß ¿ÜÝýð´ëÑÌÃì~¸,M³¿Ò¹75pÃö¯;³úzo´îÌ>~0+ûIøeÚùwæÕÜm=ܲÙè?ÿêé£çÏ~|øÃw ]üwn¦ßî¹|Ù "?ùjObqOþöÝwóã[J,{ÅB~÷íÃgëºÂ/(ûìÑÃïþp§@½Ï®ã,Î^®èñÌmá+o«d5½^YÇãX ÌÅâ¾ø×wnòwek4¹À]O÷ÕÓ'S!s=Ò5'³g¯n°´þ÷ÊÀgªãìõ¿ô©<µþÎ%Öÿ.ãçÔú_Z®ûp,*ÉHç¯~0s~8>x¸¿ésAF\ùâõðsîÒü?¯ïÃÑǪ#ÍpÎÏÿèôú?RþKÃ7Õ³~þàó¿8þcæÚ`#u¼MÿÌNëAð ÿ/ãçÖ(¤U'O¿zÜf$=ÿËsA¾$ô\>RcüÕãçê!ÕÏqCè~(D¦7ïüÅ¡Êföeçù÷Ï=ÿÏÇ?Üm~û¹?}þÍ¿=zþünZÊ¿¥µ!>ðý·OþþYÃfßÏO¶ÝMéVß<zÔ'Ó£ææBRËÍÆ' sûo#0¡¡ØÉ´YÒV!3åv±Lâ)é³£dCÓ¼Þµ[RÇ\ÅøæÿÌýÛxëü'ätþrÿñÓÍÿ¿>üáÙãª4@ÅWß'0¥µ@M×\îøæÿx¹áóêp?lD=ÿ© l)ÿ¢aþ_Êϲ\÷<9H|0[s{fÒü)üBãæ3øôæýfFá¾y=ݳW¯Þ4ÏÆG&ôïá ùf21¼¹ùÉ,9àtdVæÞd§i@HàçVóñ«ÐLæ_ì4è >+À/Ít2öÌÏækWýÄvÌdû}GísÁ7߬ªÎj×9ØÉþr|44?À·É¦ñhÚü8z&Gùã'áuó?cèÿ1/Cè3ÌþÎòßiÿõG{PùqóèØö>î©i¾À[z6ù×& áNip¦í_èàüAÛ§³Níª=UÎÒxæRèr)Jj%ïæ§Tl¿eÝK_o¿ç×þi±é÷´ñ¿màÂ}£RÞUþ÷UµYíï4¿¦÷H¥÷õû¼¾|x,¿æìÍ¡¶ Oºï*?üZQhµä$$î86XkÕìóû÷ïç7bóÏæÝm^5Y ÷lÚ|7>5ÌÄ@~WJk.q:JRCТ;Í?<Ü7oRÒÖRËKóc'-R^æΫÑÑÑÝ9öàÁ¥ö.Î亥¿×÷ÍѾyÕ½ê ôéJc~k>RSÙ4Å!J/5&é¦ÏÏ >+%¦ÜZJ£BÛßÖÒ[Í×ãýýñë$Éõoö ûIé=[øêGϽåî7gn5Ï@Úäi3vî©w|¹ ù¢Y¡nS9ܺ^n >+ßGò>¡'çÃÍOKºzq>Ô¹Y+íÀ׺"¹7ÿ·ºÉâó§¬Y©09=H·¿NÆþØ==<ÀGÁç8W©hîãÃ0£8>Ì5þóÚ:¾WøÂæèeZ³¿_ø+}aô¢y¶7G¥ >+V¾íôÚÃg¾ý¶y8ö³¶ù-µ»ûñÇ¿ýÿýÿ82vøóüyYgb;«ù<mQo÷}àk¯ÍQã&£C`¯>#öMc!4£OÞ¬üxn¦r]Æ%Nd§{aÒ=ÓºAGÁ[x=îº &åjð »z)tÆl~è5~37Õ<<ÁjòÿkÊ5íÞXù >+s[·×¾Éèh/éîî×£ªxeþ14ûÁ¼8^`sC5O²ÎlµX÷íï,9¹å7¸å]õ:s³y|0r vÝíhøo;þÁîî1ôán7Á¡ÐûéÁÝ]Ú·»; ¿4üóíîäg÷Â/M8r³gA>ýÇ4`övw'Ïu/-Þ&ÜÞ½ùñkÿæÆîÍf/$qþÁíùCÿlwÁC S_Þ¾ úúöíüÔtîÇѽ´5±¹ ÓâþîüÛí½07³`éF½ûqÚz|0«r¾y%Àâÿ¾2o¢EñT;S6&}3 ÒfþBÚÎMQ³?>ýê)áX'Eûxl/Ï<5/Ê/@èisè¾7SèÎ7Àú'ÝIî#v¨í<¹éñ¤}̼éì´ÿÍÓ¯ö÷¾zøðûßþÇÃýøcýñw0Çü¿þß«ÿ÷âáÃOãÇ<ü÷Ïü×ÿÿ#þãø«ìßþàÓ_p+_^íÇÜ/Æ_>üêè³ 3 cÀ%Ñ$yG.õ´ô¤zä;·õǽ¤#^%uêõ îpcÇ?7 Ü`'ÉÆqÐþC?ÏÇ8Z©ÇÈ\oþë¿in´r0/ÃÏ @ï¥îÎN h×G{æpüí(´m¼1_³NMi'á*^¤+·VîF·ß³Ö'~o%éÿèéß~óíæ×_v L>¢ÏÏM^}II{9o·ª4?å*è{å¦Ë(R¹4¿/ÎÛÊqãý1´ýòõ×ùeþ<íÜ˦Ó7Í,§ñxÔêaá|Î_c& NüO]2'øä+IÐk°4¡ Æí5/Ã&OÑ[iËØLúfkvLsp¼¿?KöXÙ Ò3û)/Ýkùì¢{§ô ¾¥·Ê-~ØÍóªÓx5{ã{móóCí«Î1½[W ,ìËìÚÌÞjÏý¤ÞÁ]äÒ;½Çz î4|¥×JdÏ?n|ºJÐG?G.ttþëNCb]IÕµ$kÆqOLíhÿþtaä[ /F?C3á;ö&ªdÛ¼í¿à«ãWf²ï¡ãv>J?X4Íýãªù/³ÿTSóÕäAágÇ@[DS f8c?ßýæ©yyêD f¯ýý·§ Ã1û b >+1ÑؽÑaÛZìÃ?^|«ûÍÑËãÜDà®ßQ;:QGG^g°³,±UÞE¦Ü6qÃk`=@èÌ&0FÕ_Îh>£ z¿ÜB5é15¿´rüucÓ8 ¦<àÝsþqB,¾K#c"¨à14 GÓÅñÿÒ¸Ç)~ >+tzâ9poÑ=zÍþ¿ ¥ê>ÿ¬Ö}Kç¾<LæCùÂ;4÷»ùFtofòÿe& N ø?ÈnL@¿á_ ÎÑJVlü,Âþ^<«dâõZm?Q9½n7k9ñUËNUOwõ®ªþk3íÃMó·ã× õ'#cÁLïÞ´@;òîå¢_:a§ùq|ø(í«{p¸8IK$[øhƹOê_ÏïÇðÔþ#åÃíÞ¤·ñîR=é±qµ\Ñý5Åñê÷9E=ùø/i¾|ú}IÜxÖíìMôdúz<ÿ÷ÜÞô=õLî¾É;Ý_pÀÙkRT)~¹þæ§Tó½Tå½UèjµÍ*¹JÞÅg"ñh6µ¡ðýUn-ﳤÇDúoìØ7Í7{.RÓîÎnþ4V8·û`&Ißô¸ï 4ÿ%÷}ªúó3\QÝ\wd,=ݹR¾=À!92m§Ýþ@ôLË|`MO jKü/ëOÊ èBRý{~×n{Oÿe»ûàÅþý»E´ º åÒI7?´oÚ5β÷¾ÚìÝiàFòåÎ}»ÚÝQ³ü½ ÐõîÉÁ4ÂlýKØß|=ìû³yûI~n¥ÀuaÝ_Ïûégîí+¼»kà ? vc³$þLáÏÏð-)6ôþ<?ßÁ¿.¿0¿#Ôþý·ÙúÃí0:y_|{pjÌ^òó]ÿÛî/ÿ¼¿ª$Ñs%ç»Nðй!mf{ÃÛ!J|·WZ·0JÁ¡Öl¦G`~pÁ?[WqÑÀÎÿ¢³'`;øË7-émë8©ããÉÂ'ÍIii¾Þ¿êõf¿U;Íâ|°-¬ÕHó[)¦ó×{·4NQ´îÙ[-Ë¿ê=#?Ø>¶Ð þ{³øsëDÿ¬ ÒÅ;e§¹¿;µ&'ýî»å~ãWÖ #Ù±´9pr¾fÍÿöåB%æKáIÑ)ùYTfQÙÍ÷Òô=ñÈîtöÐÉ©¼0Ö'ίÐ"¢³ _¢=aÊvo>~u8EËÿN~çL¤cåÒµçÑÞøÕÌ<õMz´?:<urYV5kn|>ïMût2iÔg»t¾oWo+Ü®ªA >+Ú¶¼áT¡é F9:êâèªNãÕ;ûþªvÏ^&´scÞëòdWª'Ôë§Ó_\èÊUßÆo«¼'ùU8£ôùlýxàäh:_»×L¿¤îïÞj¥©c½Ð¶kÌË9mN¯_ß:/GW¶n>ûÿõë§OÓHMÒh¥¥«½ññ¾O¸ÑDNõEîy¸åõÌX`õ0×@FÎ0)]\.íÃjðÚ>¦ÙÔîÆZ¬¬oÉx[¥üd¥WØýÞy¥PÈÊ"Äb<1e Íí1`ãÉÓáÄù¿fO¦èîÛ(OÄ+o¤ç\údæQúëdô3¸V];Ú{Â1êo5ßìÁ÷?Yaz»yTèA;@×?^~É ÂW6L/¾ß;~#íÇHîNoSȦà=0¨4Lð²7Z¬4¼Sa·"x±W0J¯ÞÜ_·/÷m]¹¯n´®2pc`G®W8ý¬.îQÅË;Ãvê¸ß¬Ùs2[ËøÈàNâ{6zSñ!ÞI¾ÖÕUù³àãÉéÅ}Þ¤ :>½|ÞÌK¹Ä·ßï_õÓÿ³óÅçó&®úº8O_ÎÜÎuê¶Ã¡Ìáêls¹!Ò¬nÉÛF´éºb±¶¶Ø½sS²²ÉY==<::~5s(ÒFÂ6G,9£ãýã6e%º{¬´î7ôõÁ/+kë¯õ]ÈÃØÉ.ÿ.Øñg¾ïO<v¦û/;×huñ_ç!^]øü§`»'#æ{2û2¾ÌBñC8>êñ·´£'XÛ|ñÞ©Ù¸$¯ûp ï+;g¡/ñY}i'ËY%´²svoÒ >+¼uL¤¿]Û¸ ¥ü´@Úó#?Ö=Ñò¯\ñ,Ùù»ó°Kǧc -¾×óÿE,{÷xf7?µ¿îÏ]ºUºPvçwp¿õN1dB±ÌW§trâãÌ Cs;YÛ·iÒѧÕíÒ䣿½Üû·Otþí¥¾¿½~×ϧÞíó¿ýt©ÿæéñô(Ͷn¼¿ÜIýÑ3° PÀqnîÜ]P*;¼×ÞkãNæµys£w 1é×Ìö¦ÓÃ?^PöÃ4¸ÕëîÄOÎnÍO¹=÷$½kÐâgËmZS³úßV·kõ uîϲ$%9X_:è¼R°²üÂ(EáÓép¢æ^nä\!uo¼;¦v E. ëÛ³Øë²w2{äv×!m,¤{*0îAûÒaá¾ù{÷PÇ=4£,«Û ˯mHl§ .Áû¦÷Ûicað[¿¬ÿký~¹wÎ/ÄWª÷ιéôûé@¡vØáÓÉ®4úø·Ùλé*È;)$tÀñK®Jï¹<·jþé¸=ÉØÏÄ/¦ûó¬ó~ÍÃmü?LKÂoîëÝ`|ZPZFfíêÚôIáJ¡¶¦·rÀ;¿å§<=al½õ èÊêRp??ZGDbÞÕ³$IG;ûÒänõúë¿={údÌâËðûN×Y«'}çiütªÉ;à«A/ü½´ûÇiÙïuhüøàv* ò¹3>H ã£p·]´üÿ{[öQ»izu]Ñ`î5váe~mtÜÂDÑ_0·ííüoW63Ò±öÕtn÷¦[xâ$ïRîJÕï2ù ¿YsD²7Ï×riãÖAÎä~Ig &2¿ñÛO9r.?þ2n-~¡ÖO÷úç¢ÓÉèpûS3]ÈM;ÓA}ù§HY jþO(èTV¡¤i¡¶-¤f©¹I¯üí¾×a£×g~×å:É:Ïw+«©¯O¬/Tèö[¬¥Qèϧ±µÍOηG§*tëd¿ûÇ6¾ðÔéô/q²¸¾´ïåôÒÞûDq}i?NÌh¿ð«»Hç?ñÙÕeËSË®''=ÈöÉwXQ:UÊòä:UnSx¤Ø[}Ð|EÕúÔÚÄ Ô¬ÕúíêÃSE-¬ît,ËÉÅ?5öØùé÷IÀþèhzò÷>ü3G¥w;7à½èw3{·OJ09¦'àÒs%1cõ§@ÒÊàø`qSJb;3FyF£3¤^gSßÖ¶Ñd¬j&)àwOOUz+7.arcfØü;]6äMï{:¥]ãénV »õÕδ¨3½Ë>_,è¤>|ÑñÑî}wŸ/>ûêÛµø>{ÑÁý6J±Ø¤v¨µÊ'ܬùÊë,xÒ{¡-Í;£ÎnXst|°Ó¼Iù¯ó¡Ìdºw*#h§y5N;Í^ï¦g¼NGm{±{³u-áåÚþX`KYe|9âÅìþÄ`ÓK·`ïk/pq³sV,WeÜgñô½;OÝéµÂÂjL¨ûç[Ʋ#Ç}NTJMþçÒ°t/Øc 33rþ{Îj{¡×ã þ=íÅ¿êýÕÛþ³jÿÿìôÍwöþÂ]ÚÿÅpþÏ¥üôç¿õ£^¾Õié§OGó»/.oúðÄ1é6'íãt¤@{-[{Èö?¥ >+零§§ _H*û^Züü(_ÏÖþ2»£ð¶I&UôArêÛOÓáu@RµíYv|ð{.Û#>¿LâÚ¬ìp·ÿâñKøn{£È'ù³YÖñg ¼:1Å¿Øî47ï6nÂ×{&Wþþâ³ò»ÚÚÒ\¾¬%ÄÚ<;·íÙq¹¨zJ,j?o÷Õçãqé[»øÌb#æmh¿:ëØ?ÿyÖ©cgÿþ=)ÖúãOº=ºs·½wã´Z=û2ôJKÏÒ'm ÝðQú×ì@ÑÖ¾¥ãQÉtKíÍg[Eæ`áB¾bqó½3óoý8^,;Ýå|³Û\3ÒâÁy«·vV ]UI÷ÔÿgïkÛÚÆï¯åW¨éu·°4ïºíyx/ç´Ð-´Ýöâr xIì¬í²»½û£dY²-[vBÚsÙ-{4F£Ñh41&,p6x+nËüÍ8·Åñª o%(_´Å¼%±·ehïÅF!öOÝs*y(fÈ8Y!¯xÊ )þw#k¶7Gôð îbxþô7¼BÏôÇd¶»Ãö}²!io¸¯¦umS²S0Ñæõ=AÍëÝ0Ä-Oƶáʨ%ñRoqYAd(0åÏ[¸jBAÅ%Ãã¾[«j5yø»¤8kñíÐ)U96Nêp·ÄÞ,füÄyÃÔ`ÿßÒMï®ß þá¬:OÐZ@:çpXê; ¡Íë<¢ª5aÅ{ìð9uÕe7yÅü4×娾Kp÷^ÓêYåiÝ=r=¸ºq½wþÞÈrnÀ«· >+ >+@CÎjcG¸7·9}²Õ!ÈeÁT°{ õÇPø¼çN0kOQ(²þö!3yØ+«1?ʢͥátØ@6ðÉVRñB_³í,óºÎÀ^ÁG˳ݩî¶/,.pëWùÛh3ïMÛÎÜâ" ÙÃBx>8.» >+^*Ê=â9½ kß5UV:ýðjѵåÝ×d¶Ñ'¦Þ¸×GDcè¸'Hº?§¹D§tæñÃÅô ¶Õ (1ðÀ*èèÒóÔkÌ;Á³Xm± %ð3*ÑYC¿%¥+]û1ôIÆ`.í-,U#gë#½3D_£è½±du}"¦Å¢Ñ⢸Pt^hi8¤7gúñvR>äïJ4òjóE ÃJrA6ÛUÈKD1H%Þh³- ¸8g³£iµÁ ¦o >+¶Ø,èû£k >+&sUÃÅ¿Í6 Ì.ü¦ÈN×Av; âiñ§ ¤IüQÄ1u,ak¦SlÛÒ3³Wô]ÏôøðÊg!ÚEDÚw´CÅj!t >+o5b|{rÂðÖçbÝ÷\ <ïmòÖÒ ¾DÑ[S¼`ߥJ:)¨xQP½ÇdûDF7yKh!*WѸbØÛL¾_ÏÝò$êÔªëg-oFʲB¬¶¹f¯(^öÒíÀ©8Ï·øË4f¸\¯r >+óæú`êÍLÌ2Tl W^ÖÃe|õH/PRÒì°«P;^¢û½.åc¾ShóBø¸Ð^ó\¥2J¡&°çC× G*fPô¢`CS*s§òS>R:l¾*Ô{Zfâè¶ :ÎЯh"+(¸¶bE!ú°Z¡©GjE!4û<0ßhCØBì-*ûºÃ2½ÿ{ßýÏ~ÊæñA¨L%bÀªh%«¶ ¥+`¸Ûé¸Á^ÉJ*ºüÓǸ=£.¾[ñ'hßIÖPör%i¶Øæ¸+ÄhÂ7ú¦1h¹þÆpê>-õém_¡SË·ç2LÈÀÁuè6®@øû"¨%ËÑVhÇEÍF.¥í8Æ9nèm-+?bºÊÔ³Ë=åz:zB¨õ°yôβ½$ùå¨ÔPD5ÎCê OWj¼ >+a¥@Åë'<êL¿kÓ±àèsÍ!1ÕëuY¯(5Ù¶ûìöCÍQþ¸&iáS¿¶æó^Sçn§Ãô ÅÇ^2Hö u=B-láç Ú"SmCÍ<jqóä£Ðmý¢³¥VIGC¸µSIi(Zõ&¿ÃE¢Ãt?|_l½ ª#DânG: 'SøÚÜÈDÏæÂ<¨ç33ÑÇkAdѤé0Å#ÄVtÚH§}üXËX¡hPvÁQ³I}>frÙ)äYb HÂ,éù ¨ºLX%;¡ÆAÙ½qÍæH ép}ÏÙ:®3³IØÐV/[*T´v¸îÁ0]CÃUQÆp®wµS©¤ð7ΩN2±ÆÍU÷ >+H!Öv¸=§rD£¥h81ºLß`èèöºø2I®¯®\(G¡M,-¹/\%ÄÒr½Ï@¾¢õMó¹÷ýwÏéæúEÝÕØ;îzÆóȾb/ wÜýÚ~ÿ-lÿßeäÿ¬Õ¶ÚíDþÏfõÁÿw0ÿß9ä</ý¯pÁ¿Ü±ÙÔ9&Ê6JFQ߬päÈÏu5§ h<WUè:ô¨SáRõ1oR°Ô lÇ Ã¸Â¥:pRØ´ª¾*¾mÑÂ,JµL#c0µXâ~1p1`i>1X1\Ù.±RͨT®`¬¨Ær~1lí¨!:¼X 1è/]HwkmÍ!Aç¸ØtÄ|Üb÷ZH&æÛ(HýÊb¯%¸Y²ó)ñ®É»V$tÎc2ªV$4~`*´ UN4HwýR·ÔÇTXAt¯¬4*ôLë¦Ú¬hê+.W1 12 _§ 4ÍÓ}£døv´$\T¸z >+\:íÚÅ9T°¦L¢ÐH,mÍU¶;ب*¤Æ|wTíXSNba=mb0ÑÂ÷ @V×ñä$P;éåW\Kb@æYî(±2bdÏÌoFhù|Äà¤á{jĸ¸*5;aÄ ¢«øVÄ ÄèÄ<&b`bhTGÙK!Py0"WP|4²`;Q/7ضÜYî lEÂ&:ïWY£w@4í^TÕ¹«à4ðèð\nëcpÊéGÛ*p' Xßàí4ð6DB)v«)`úz#ÉõÆ Ä(É'¯1f7ÅÅ@[2hJ´%I ä)jr+R=è¤PÏ7cb#?¨±|5 :ÆÀkIðØùa¬´r'c ʸñ£2lYצxâ$N «+p³5¸ëBÞAZZ49ýKnÅã*Vð\Êá >+)xN9LRa:1úw¢I/oáb#PUaR.é ñ³ *c§/1Ø{ÔÃåH#ÔJÎ=bàm<m¢u¤q2+"Æ$ã!VDPÚ9AlTf³*mJ¥Ì¼º:¥bæy >+ûe%õ¢õlÁ¬S`ã*nìiößEÆ~O¶ý<ÜÚÛõûïR>1Û¦ûÓÈ^Êpò2¤ÂKG >+Á%alè|ÄBɾ2 J¡ØÂptzx7¥± "{GûÃg £0ø!£W|,ÍçH*gr!ÙS >+ Ðβ:ÞÍÇrxýü_ÌÙ|ræ£ÿÒÚj5æÿ2>áùO©³ÿsX\HAqs1aÒ#<b7»ÙL\áqØqW >+cÁo&Ó ôRÞÝÀöpÿlªPPTÂ8µlªÚ;.EóUÖáìbÑï«¿p,ÅÔõyÛé\g!Íés7j<¶éÀòAôáýùð°É:¶ýªTEàSÿÁxéÙ+Hϸu$ö$ Cs±àÝdoù-Ò!Î gHvùõ¡qgÚȶ@_ÁV²HÓ-8áP:t:Âm^©xG >+ªßÄ»ÃeÁÈ(=¥ß¡õPT~NM'hz¼Ì®ö*ÜE¸=é)zì§êáeÇ84¾¨Û´B«å²ÖþǽQGÞþ¯¹ÿWm´ô¿e|Å'Mã u=8MºÚ=??|±òúk¨ï¢¿lQØ÷5Äú [¨Û@):Ýy¾@xÔ^¥µ´ã;:W¨â¬®í ÷B} ÓùèÞ\±×ðôR= >+Qï®d,ë,=÷*ÃÊ SܽÙ.fôÈxñä6ÿ|»aMìçÑ&>[Pöüo6µ¦:ÿëÕVý!þçR>¹& ,[®Þps8äÚa¾êóÕH¥MpRâK༤-éy)Ú$Ñè!|re*Öʯ.^¿?ûtNk!»ë¥6FJUÀÚõB×.¢üªH#®Ù}2zîm¼¬r°UÒ§krmêkJZoêö_QÚ²p¬jC¤`دq0úz¡ËMï·×ÂFÑìÝp°= D9ðAðTö ]SéêÝ$¿°£¥R5sêÜ8îcÁe××X¹Öt^ÉݦGf'Ü'ÃC,òÞ<bAséU"è%¬Ùæ?ÑlóªH?çÙ<ñC¤ËÿAéW«k`JÅÍéZrùå§A¡¶×Zs4×vÞÌM¢e*Yw'L·Zü|MÓDV2úë®Õ»YU×ÒÓ¾éoÆ®sgÃ!¡ñí?1ë^#â×êo12T5µß4Ã5?Q¦®+S´cyBæßµc>(¤×º=¨ÁZùo=ú0ÙC@m'¹t<æJÖ(gzZå¦G¦WmîPÔrúÄ6nôRÊu½È*¿}Ín§6(ÑàR5¢¾Èe'`í \ïÞGBÆA#¯ >+Ñ4Â0èê¼Êj¡ÏÍ ìà%íZ_ÛÑìà1{@òõûïíô=¢øxvUѤõèÙ1"_Ó§ÝjÌï}Ш¿Þ ¢Vo4[T P&ýnè:8ÊõLs³ªÐè¼l>·KÃL¬©º©o· ïJ>ètU ê·ÉÈÝ ÿG#K±±sº4 Gt_bbJRç Íóæùæy¦{Ñ&³Y1ÊR/ôá5åþs2¼%)迱ý FMHõßK˨÷)©¬ìÕØ&ÏãòÿZoÿéWUåÕ°jÊ#ª`5G x´<jÒmÚð8r«dê¬Æ@}ÔNqq0 >+¤Ì`ð >+ç2¤²p@Ê^r²9 Ú_¢Vü ϲ²±MøTɸC×u!úicÈ$Zí/l¤¬³£¡üÅ ôÕô¥¹k±ÖKp§ïJ¨C¼R%y»ÃæQD¦úvñÃ0zVt4}B?ú¾T7:¤+Ã^|±/i@ciâÑà=`ö4EwâÑ|Àvò ù3먥à.&ûrUdvÍË¿æÌÊDóír ÈD+1¨úµ½|Çîoðy ãIaÊB²o¹òâ'Ô³!½z6m¤gÁx£ìé½²±}@˱.¬æýfO©\^Â'¢L}ÑÑÂyÊÉñö\wd0¡èosA{Es2Þ#vØ×ÂÝiàB+÷]ç3öàä£âZS¢I>\6ê]õ,²Ia J¥tá1{Í7Ø)JØãÇ2ô. *¬ªË¾Ç5'N ÏÿRÔrÝiÄ×êk¾\@r«1¥eâ HÓ¾#k4 £°l%OÂz·êñÓ >+a@K"¨ál¨RO×ú3ÿ;Ó]%fw¯*Ò2,3KiÍ3ú§Ó1öì2÷Ê0À¯µÍÖ:ª£MÇrÈOÛ¬£ ö«zW#蝹Öo¹TdgkÓÍÖÀ¬TÞòéK §âRa6lë¼OpÁ«¿gõ#²P¼vÔâ'/fÔîVs»[WK=æú8I#Q5ã«=¶ðýÎGÛ±Y>ÞfïÆb·âÓ+ºíøp4æ){¶c×k¹éñøq,ÇýîqÇ?9êîïnN~|ùò²²$OGÓãÑ'Çï'½ÆûIwܯY?º¿|úÑ?9n}îïï}îïZ'Çÿ$ÿÞloö˧£?»õ&yÿÏyoãó½ª8^ÒòÝã£ÙÉë½a¯A¾×׿8ÿüÜ=ßûÜ?zöÞ°;?ºûóÍþ^ûÝÚß¼Ãã»Z¯ñãu·þó5À×>Ò×ïÝúñúgçæúçó½Û_~úç¿üô˨7>þ\ÿ@á!]µ>õ]ÒI×ö|¸þ¹¾=í¦ýOoN¦¿À»ñûÑ/ã£*þ<¾#uôGÝñÇÙÏ?½§m\Vô»~7ú ¼#máãÓÑ/Þÿ íøå|ïOëx{Fê©ÿòi8ê~ú(Úðó§¡Ñé°7n »û{·Ýãg¿7ÿuY1Il0pvzðö&¥ÖÁÜY¦,ý¸O]¾{pX¦4jÁ[ËAèÓö²ÖMmÁÁÇuF4ë)äõÖ®&ÝihnPàá:\)9£X=¦©1ovoXh4%õ»pAc¡EÑYhBÄ*&²Õâ gûxd_CþgÒº)i6$1<¢Ð]Ã>]có豤 8ÇpÿS÷&û>EàCôñ8Ìik93Ô³<;îM=¼yéÀÔ·ªñA($ØÉ¢l*%#ÈêÙXGd©ÜJp%dSöñ¿ÆûW÷% e¿¬ªç:ou Î6ú5cM rVsÒdûûïKB(XW ¾¡ü¢6Ç[Pfì½"|SdØþ²vÐ.(;hoõvÐþ´Á[ú°Ä×:Ú84Î zxÈ÷èÙî3´YÏÚÃÎ$ b6×:|äzVoøu';ï_\½?ÜÝ$§MyJÆw¼ÎlK)£WtÂàñf£¡o*]ïs"èi¤Îj >+¹ >+Nôd½287<ÿ2åÛBl¹?rÈI²ý=-ø5{P)Ië[å¶JM¯²z^²byFúM¾ÊÃua]ËåéW³yFX¸¶ð ¿²òÎÏ&XVÙ Jx)íÎGÍÈ,É0²ïkÉ5Ev<EÇþA*ÿȵÌYDN;¶q¢U*OKäâ%´1%ÄÊ70¤[ÁB26,:ÒCêËÒSa¿~G~þÇO¶DÅÑÐÓRâ%â>qàâǸfLÒLükÅâVòJòåæjº²iU«H$YI,=)Ì°®¥ù)gVôÕN*/[/ïfé/ÛUN1s[´RáHYI3Wr<üPò¨¼&0é½Q¬:ZÚ:¾(5dà®>rÛ1Ó´f² úÍÕÍ`E+¥ïfóÌhù°Ò:L¨1ƪÇüÝ×_f¯y©09(¥j«í¡é ¥º(Ü<yÏÄ ¾Áx©ãt½Ð!t?¤wKìº_è±H=kìäóPÒH3G=àÑO³WÍÕïddkáá-͸Bh7¾¢ÆåÂ>¨o¼ZpÀ#þëJ:q¤@k¶£ "~Þy¸gg±,;w¢Û÷ê&u4oou¶µó/yzß¼§mËÃxaô2-áè >+h?W¿¿k@·±àNW@ôË >+$nñBÝpúM¯òSqÊP=&O¹Þ)n2²«¼Ô¦{¾6Ã;vGóetñûEåxXSÙݾEî³"8h¢t±<.Ó÷<WQUþ¬DvCÁAHE¡mR´)tÂá øa0:°ýènÔÉ°JôÁ >+Mï$ï)ü)£kDqóéWpJ"*CÜ$¨õ«Pé´QK,ú,Z)Ô4HxRú¼$R"É"LckbZ:ýöAEp [ò@ÌaV¢+sÆ$^ÐEçªJ¹ñ#ñ}`$¼X¢Ã=°0\!(Pw®/P<éÃÔ[½+ÂvXâ@øj!òÅ&hIÂÁ¨ÁÓÜ¡1ä9ÊJáùê»Î=ÐPyb§¸·¬¤¿sàLAXYÌ'q" 'L'ö¬$ªMøq8Â,°X3YÂ<d[Þxl0ôX#h<þ§iQÕ ð¥UÂ- â$%:ÄNȬôãÕQ=Ö 5=)<ߢCF I¶åg3@O²@ä%YÍaá"UKç3tSB~TÿQ¨,k<+[´åá´d¥uS1T5Ó ³Æ1B¹Ãìa »veà6:ËÈßtcPn¿JPö£WAÕÔÝo ÷üSp®hî¡_ûÿKæ=O°¼øµF-ÿ«Vm=Äÿ[ÊG»=%Ôq¸mU¢¢³«êÿ0ÿm>Yó? >+ÚñÿjõvµÕNÄÿkÔæÿ2>¹)à1¾³`ÃkP >+þ·äø¡j^&ôxQüfQßí©{|W¿J¹Gàr.èDf&ÀSιÞZÞ zÛ;¾µ½´k`PV²éÜgèÜõ-MImà¦a{ö`YÄ0c±uSîÖ1êj®¶2Ôßk§E¡ ¬Ï×ÚRÕÍúVGWÐëÚúx3Í|b$t6#g:ALÉ>2t¿m9¤ù´õ¾G$ë ÷D?wï´aÒ²û<×Ð }=ßýOñ-úÙ%ïg˹ÁXË¡çÖÈ°¢â·80¨UOý!éãµö§]<ZJì#Ë ,´çY2Ø73¿¸ß6K²fÕ`ªyáÄ-à(#T \Y¹R3è[-¯o¹ËA-§gr9=ëtòy';å¼ó¤Äé4]MG;q)áµÅ´Ótèéiç$z.6OÙÐ÷FËúµÞd±}Ý ?õþ(@½Ñ±{=»7&¬.²ráX\J¶Ë.àÊÿV¸@I *¤´% ©IãeðrÂ-brNd³¼¸uÜÞf?qvÏéN)d98]į| ßpÄVjûýô¨´$A2^·Bt®]ÌÛyö14If÷k¹Ý¯í~6V ûzãNmí[^ò³ú¢+Ù|å`Y³½ü<ÂàUÁ:_Á*];ÿêÕjc§^Õ¸2!$ȵÏhæeÕbo7mß_[ ÇÍC±ëü >+ô¸öમ?²Æ<KÀGp!ÒÒ°4]$·Ë.t¡0KbÊp¸½!¿¥nE#ж´Á¨&%N§Þ44±.%tùè~£¥&gºìn1v >+ïájaqy RÔÂsÕ#Ë)mô]NmjÒÀKt/Z¢30c¡«.5Pxõ\cOÒH5»ÿ >+3¾Ôe«ÒÙ >+´·êÕjm£ºµQ×éÍjç6r±ùUWëfUëùaêlÔL1iM©i0QÁ'?Å~@,¬1%sy1SÖö+¸$õªÁt=ôÚu'Ö®?¦í@NÅx5Õò¶gù78èZ£Q±J×°tÓ£jÐ4¬Û0û]1¹O°,ç'Oaë©3²ìïzøxy#å?»4§i}£á£GËËçÏÿþü$?Jø4ïï¿ùwue05Q7äì¹¢/{¸çñ9ë¯'rþúþÌG3lyèÖòQϳ'DWé³P57_¯ß§ÞlÓ [´É:62G®÷Öõ0Ëû»N¬7ÈÙ¼§ógÖ¨EJ"¤%=hvoØú4ìó4¿ö°76¬Àß¼t¤aF¨Ý ò`Á/ÄW^P³Ú³ê¶~®±Rø²(³71j¶#&bÑc²ÖcoÄ:ï¹ôê¨ÅríhúãùÈÖÒÛö°§ÉF®[¿»aëzÑhíMä)áA<$TÛÞîÐèEéÒQË°ÝÉÃGmpÉ13aÝÓKspºKô+v%µ+p8ä¥Þ¼¼ÃõË»íÎå]W«C¼)Ïi1^vàù¹} ª§ýß!ì÷ô¸îª}òÏ Y^ÆÒm±Måµ{Û=¾¬ åÙ¸¿©Cõ-*ôºÀuÏzl×ýL)°ñÆ"ueØȺ°ñÝÆó¿ 8HØD&{J» #¥[«6Ueë-ôlê0âq§gäO,Ç'ÓÓ!*×ËÒüÜ%Á>¬¦T±?÷.ÎÎv~Ûh¼2ê¤è-X×¾DߺPà;õäÕùñC]£ÈM7Øè[ð°S!MÜ¡ÎC®w½NfR£=·0hñúFµ¹Q×"Lì¡b^øÍ\YËëûêèøì`4<ØÝ}»{òãîî»çÏ·ÿ$-~µ©3i}úeüËõîîîÙÀiÕZø§ÏÄ»?·~ný>=¸nþó{òþìâ¦Ñ"ßÇ#|¸ß»¾¾v÷vüÑ[Ýú3ag1óÀ·ËØ=à (}²&vttGYh²èrñøw}·çI1©SV×ýÎý3Ô%\V!Ë EÏûáQʦÚñ,Ï%¡n\²g(44Z¥ÊP=2woðg"6å¬=´&Àh÷_CÏöz#ýy´Ùþ¯z¨ÅLNy¼áKnzêéæ[ZγúöÔOÔ¤ÝXæӷɱzÆÆHIÀè¥2'xºþдi!tJÛ:¤5®ªÝ6ÕÅºí¼¡ùØÔKM½ÜØ@±;rõzSõîèèðpo/Ãjà;ýöì/` õ=ë¼4زÖÅõC¶DÄöϱùÉK]³Í\òqPV*ƽ¤À iÐA¬lgÑOlRÏõ:xÔ5;Ó, >+ºpãlfA $oÒ >+·ÓG] Zë_l\TÌÚyæ: >+êV'0ŦöÄùìÚ=cóB]³Íy6«(w4Ó·9¿VÂò±Î6¦nåéÔµ ò¿ÖÞ_éÚ£ÑFàù >+Ø_+×ög¬ßní=[ëÀ*aXc{¤ÏÀr0[z` ÕïC¦u¥«pj±_+t¨OõÙê OÖè(¾èvuçS;ÀèI}»®ßô§WÔâzÞ»3kάb8ÁDaÕ:)mâ|zûI³Sm¶µ¡=1å&;7IXæâ& OnJ+v/Ü^Ñ|ܳ,7¥c&Ûöô¿V]uã&¦ßLõ'@oÛÍÜ&fµ¢}8®ÈtÍÉ=(áxb9IåÄêf5-qSIk¹$m6×&õ>6¡iî©hg6MëízQëN_´UÛlêµ+ôª¼~( I7[ÚÂܬJo 5 ÛzÇuiZ.öM´gõn¦ÅÁêðüÔrz3´GÖLèöÿP£ÑÙh&ûa%~ã^ÁUÀ²nõ|¿FXxVTúús:5^d;ñ«ªµvªµfm~ÖI\ü#<îkË}²<¬|voÈàá°hLIJuÁGmw#÷ lauºW¯Ç"«ï4j_`»È§ÙKF3Év©nÓTõ\R5uÍ<ÈUê#R5vj[÷Aª#+KÞ|p ]ÅFº,m-ºs"?nÒr-hêõ,h0fe³]¸ýåûY^+)2j[Ôy#g¼Îº¿É·zYi4[ÎeeMèzìi·² sí0¦N-:Lê@üñ§þ{çÌÎÑZDju´wöV¼kE÷s÷Fnï槧@'NA\ÓÊîzn¾~*âL(³°ÞÎÕ¾åâZ'ºà6-y6->f6/£ >+XÐøô[nz:Ô >+le8¥c{Ú®²ÒÓçò]ö>ëÃ@/i ¥_/Cl:Â[·¡¸Ý*Þy.ÙD³âVúJ Eýï3üÂ$ÄHGÅå¬ët4¦Zº²£+µÔ¢8UrtT17Jý]w/8|ÑÛZÔÝ/R0dClxdǪâô(íãzDO¡te¨Ú¤hM´iè8ög[®«(t¥Ü*ù¢ë àQ´çaëfhyd+ÍWÓDÑìÁ{²5¡UÇE×£ÙdH2ù1}ûk&ù_X]×éqm8ëF>Çkñã¥vô»0}sÜAh4ò±áÛÑ_{Çe0!ÀÁ¨´<Kæ-ÍÉÛä >+åíÐïYÜ/Áü¢QåhÊÝf/ïZûäG½N~T·àGü¨íÁ_ð¢º?àÇ6üØCô½{}<«uTfÀU%?váG§ ;c§zyguä/Ûhþ3 äxMåk)$º?+:jpwÄÅ&c¼+Äcÿ'w! !,ßú×;;'§wß\ïï¾;¤Ôè [X¢/õ\$²ºÞâAIÞÄEfV[*÷`²6wø6ÒÔ¿VöfO æê¤34p§Þ¥ ¯_¯âøAõ%£1©J¨î &«xF ÊP-3qjuÕÝïÒµ%k/úöh¤bÖN«vKâ¢Kv[+¿Ìb$XYÓÕúýÅ-Yè³ô²kÐq?þBàãåÚewé¦ÞÜ*Á"^ÒÐ!M?¨ÖúÛQZzG¥2(.ÖÐrÞyx`ßS;w«¬<Ù>Û _2Çì~Ùù²tVßËâÈ×õÚÑôp< f.µóC é&*ÜMʲhÓ¦P2\:Íå ìËoãþÐO²Pîì Ñ2¨¨Ó7Û<]²fà<{<Óðé3[hsÛ§î\6P³aÕ6ië°oÂ_dPì&aÙ+ØBÍRs4ZåѦ¡üE! Ì&J(³Ë6/7ên¹¼ÁzsÍ¢- 6à.4uu¡ -Imù~xw¦X̶v»òÕW4öÉq¤(4´%ck"7i]Þ^¼B>øÒô/8Üðü%ȤþùåÈïÀKQTTZÁ2Îà¢ÐUùÎa Ó[YÃ!ô§÷Ü´r_Ìù©Ðô¡üf %&·¨Ð}`³õoßã ÑÚ@ͺ-îï.`ß6¿?|w¸{qxpE¡NÞî_|<4Ü8W:uÈÑF/DCϽ2 RÅùº.>6%¼µWÅæÑ-ͦõJ? [eÔãÅî±4´\bé>¢5÷°FÑÄNdy3B×Ó/íxÓÖ]Ñ\`@1é[4è\"çÕ¯seQ¹O}¼«;Ödò|®vå°°¤IAÔô´AËeÊ gd¥*4-á¼½a`Rè¹!E£_§¢ÃÕèLÂíÑëlÇ\zJÕÓµûRãÙõp*Æ¿ÑÔõ°ÿ8¿J6F>!ÎNu¡Ë¢êhår_Y;^âÎg1Ͳ0©P¥ãi»À¤3µ¡eå[rºuø®f[çg^zqJ%®4)*h¦k$Kó|åsÏ©Gæ©Ô©ÁN××Ìê¤UU§èDmr§=Ø󥪩$ôöØëÍÝØüÂu[{á:1}æ磹ø"½p.s¹é±ÄyçOSßƧ"R*×=@4Ð㶠*/Io{74JZíNtÑÄ#¶;¡[8mñ¸¦·<hÃÖÑ DÉpnÖâ]·çC×DG0o|Ùx@~<弨4ÖðÄvÓX¶|]ÄìÔżøßzMbz|ç:4Ù«àÛ(AxÖN¬¾eÙ 5D[*±9{ÜÁìÓÉÅë«Ó³«óGG'?ñYÊòQì$wGFíi0æRà¸Èú¡¡.we-èNG}]/aeW}RB>>}wRqí39>~b§x >+Æ;¤ÉuQ*DÆwL8èµ{ûý̯ðäuS2Õ·W$Õ Á5'SéèÆG°"!·×zw0MïÃG+à m*¢ÑRc+rÄ ùY¡ã´ØÊ÷ÀÐ]53&ÅV8 D³ÏØólÒ?æqmOé=úÊgØéÐ#¿B#aêdöõýûT×ëê÷¼)1ÜU$Õ||G³öc~óíâ>'9g£Ò·#CEvL^9cc¼¹:P÷Væy2fÁÔþ gÆ5ÝØ$:kóÊu?@ì®\1#]I鿨æ> Ü dâ >+Ï]cÒ¸·6 >+\¢gÑþõK~ëH¨Ëüï¸Î\eÌXië:cÜB^¨æCæpgºU\:u²:¯¨áÉßò/Ôq5¾¨çìV1·!¦Áw ñ/o/îf´´ÖÒ22Wý/ÛiÄ-ÄÃ}u<¹e¼O±âÜtBV»' ûEwî;h®Ýy¬£)ùéX¬[köX ÛölÔ4æÛ_ºªA0Ùyþ\2iúÞâÐ]ãÔÐÊðfÌ¡d+Ã¥17`Szæ$%Àå©Åý5 ûËHÄò^AÿÁ"1òV¢t-$u·q4ÆcahÐj¡ Ó"sµa»â$ZâòjVM½ÿÿ¼>Ô`»+$®bR3mªån,4ÒVÛiv¦.ºr±Ù µzx£K ÙÐÈÊàJ°h7 7˽#9±l±oÉc_,nä6Ä¢&(ŧdSÆ`b«ýYß·uÙÅi)8K®Y#×N¹¢¶tF >+Ìã¸ë{AZ¢ g®¥JËCgå-ÉÅN¢VèôMmÆæD˽å3¡üõlä£WÌ2JY~<Ywl`Oc:Æü¦ªßM~¶-ÉO"ùnÿwÜq >+¼ì)MÅâõ©_Ò¶úVÖmòÌÒLG*¤±}ï;"ÂKå²·{,Ëè_Mö4L 2lf|»W¿«4ÏÇÌ[ï]ÔÝpgTPdk¼îsÙì× >+<.+Ê£4´/¶!¢e.AÓÿ.Ppòû×Ê?ÏÏNÙ}+úê~%ຠ!ÏÒ%aêï¶?×ø5l §Â4·¢¾å§WgGWç?^½9ûTÄ©\vÜRÉ·$B¥ûÌn<Ûrw ú]Í\;P]¢¨¬ý§îú´iDt}p#fíJ×|fê -C>ë>+hòëp¹²¡-v¤<Ç6¶ÛTa¨ÓP;<ºkð¢e{^Ýè²±íDR ¦×DMô:¥ý7´Å7i#]h',bÚÚñ»ÁxBF_'y¨ùdP"Kñ$Q:×?£(¥û8 ÅI ÔzrËk) oq¢_23/eW¥K´LÙ¹_EiQ¥wV4^Ö3Ý£u/éÒêÍóGÇ/ÑbóUÌ^í©£âû¾®¬iàn0zAàÏYÊ0æÕȧ+7Ù³w1¿òÒ¤ìþw;1Ü%{ÿQ¥G9vÌBÓ Ã_Ù5¾+¦ºt0¶ Ó×åÔGåϬhåZqÊ]x="¿uò #ܬÓlÒ=AsO*.̧nwÐ êâ?cæÅ ÙQw >+òch6F´s×ï.°ñÈy!lÙÔ{-vá¸Ei[vöPRÄ7áZaÆæשLITÈ/J¨µéêÄZWh·Ý)ëØJ4Æ¥1m¥°²ÊYßMÛXȱ(tò3lXä9ÄZVHé¼tÔãmc!0èîûÌîÑÓßF¶Ñ IðÂt+ >+#%/Ö¹B±PÚ9Õ= >+%S¬ <4Ú¿È|EÑa1YÚ5¡<±-V!ïÇÎk«zEB®Ç >+¼@bbL+õ+=|7ñVÉ"+üôøçb6)Àa¹JÞÎ}"ª7µR8¤IY¦ü¯%Ʊ^ÊÉÐgÅÐå"k\Ûʸ;¼ìø$d3jZzÃ+Ö< ÂM Nû:¾:!v7)¹d5 NqÄáçE!~Î"¹Ð;Ãã¬yH^Ú×¹e±ílÐëYnòAfΨ1oc7W\?fòáhÍ W¯¬^Pn²½Wjz|ïOõV3ò~[àЬèá.¶¼`ÈNwiMEìh×äÝ´·C;0R7¡Bkn¾ßEÑ{ÓÔQÌݶàz¼'ÏÌVäüÍsz·t$wÉv_à²càåQ6^eNóEÅm;väd#ÉteScªe^=¸ÚwÉv¡±bÄ/¼báY2½(*òª >+_Î995û®BI±*;§¾¬|YùÏؼ6zÉFu³µY{{Þs=ü|B£Àw¼§jµÚn6üÞj·èïj}Oc«µ jõZ£Þh·ÉoTWíöÿ ê¢:õúå¦tq{pl0ÈxÏúÄïÏÛé¦DþVäVV¢CmÑ[=Ͻ >+¹ç9u6_ý`»D´`küjeűÆ^¬FûÊ_+|¢,]xPC§6 >+,ø®Qpøü%þ;±D±ÏëÝÓ7«¿ÔEbýe÷wZ$CG×!KW£ä5üÐóíî;æak |y«4s%,~ÚÙ³¦pS!*D7ÖtNø?ÙÁðÇ)èåÝh , ;è|©zw¸qup¶u~±KþÈÀÞWþQYGÕt¨óýÝ7»ï9ȺeÑ4¨¦aÐð·g§ò³/+*MacxN><¿0! 3e)Ø¿~xófUeA~®<f>LyìýÔaSÄ*¥êêw ÖV×Ö¡Ò{J¥Ç:ѧhI ûüÍqÎKLªÏDþ ä ø@ELÕ1õk 7ÝÕm±ìΪ ô06;wPÒVáÍÛ¡%ª^y cøÃÚ(¶; Ð? >+ÐjR½=ÂD¢Uà B\2ÛXÁ¨}2\-¯e¤üþ{F1 %ûj¤uQÆhò+Ô³P¡DõBqÔA~Êþí_÷Q!V9ÞÚ%2àtÔA¡ø.ùEXûCÚ½"5Çåte >+qé³Ð$ áJÆpû| 9qáísúѾów|tùÆKøB£Àkõ?Zö£ÿÕÚÕ6$"Wõ¿Z½ú ÿ-ãérÑjPG&0×{,lB-±=T>ê§ñ9þÍ-?oÅwuê^\by ÅW,èmïøÖö°¡¢Bó QĬÀ¿°={0`þ4m_ÀrÚqêÿqxQÿÂ-0õeª9Cîl·!£¤È¯bëumCÈZsë~ÕÙh´ÚÑæ+£ñn,s¼ÈðìådLâH÷ÈæhïÉzîÞÓ<×Ð }=ß°Ð)¾E?»Dtül97keÎë8Rº½XºýE9¾Åiïödh®]´?íÙ FXhϳ>$ǧESZè4 ê*?^ËÍû\ÊÍXi ¤ÄÂöÊàlƸwJ^ïÍéظ:vÊÑqá:H+9ý >+G{ÕK Ó\cÌc½z,Kß5ízÔ=ô¥ðÄ4oY³(¿'EínWl k/S§3àÿ¬ÍA@-Ê®÷MoiµY¸²'/nÝ·7¥iTOÝsze2W¶ìF£p¯t)±õ8Ðwjûhßòúàb_nûQèP>!çE¹GÖlo?0î°\gâ9°zu§ÚØ©W Á'¤ËØTfc: Õþ£Õ±íûk´¿|[C£µ-}ÃCsíAü]deE8X"«Dk;¢n/ô+ú·³Ô2leM£øÏ».3kRø68aÙNG44úOdÅÚ·Ç»oNvÏW5GTß>ÛÕb»É=Übì²ËÔJÐr`)Æ*eÄuÍ^®yfzµZÛ¨nmÔµû±{¨ÔôÀbñfýùTëEP ³Q+\ ùÌMqfËïR7r>Q&fÉÛû<±°¬S÷«út=ôÚu'þÞ´lÈ.ñx¡@·÷,ÿ]KëW8g·uìýµ»m_£ó¡k,2Ø·ÞÖ¤Xd<¤OD1½n¿ëáwö±÷ÙÌXP+y@æ1%¡~*Ïÿý7ùI~8,HÒ¹¿ÿFäßÕU7lQb5#bÉEÅöpÏãsp52ÓTÊá*SÕÖg>aË£¹^{=!Ê{ugÈB7ÆÈv~z³Í%Ê/@IÆ=G®'Ùuú{dÙ¾áQ&èTö¨Í³"-õx¢Á>²7?½>¶|H¡¾×¶ÀsØ >+üÍFÌyP»A1ÿW?Ú³ÑP¿ÒÝÏd¾^ãùZðiHºbQy¼@®hGSEÄC#J0öÆ0èç=wF~©D÷ë¾`õ(kÙþpÌC9gR¦¶aÆÖï4ìu=Åh<ãMäãõá.gm{»³yin´rýmòçM»e̽ô * w¥¾l®ÃgÉrL8uìÛÏcª?¨ÈêÛ}*¤6/§õvc× á¤çæiuaE]à¯Ëüܾ u»1« ñÂ~Ï´¢»jü³àò¥gÎÏ,Ya×îmöø²IÜ×-I=/L8dPzW°ÉÜ}ÖcÆÜg¦Õ6Þ@\ãxXÑ6¾Ûxþ÷Ò&8Wz;6,æ4»TyµÔã%¼ÃúpO>Læ"îsL,Ç'RرpT÷Â1ç.êM»©¯Ô¯íZÖð6ÚWí:iÀ-ã^öá{g»S?sa9ÔêÑK¹>ÏWã\dêÕæFÝÔ{b÷i®¬²k;7Ë]}ßWGÇg£áÁîîÛÝwwß=¾ýü§ ¸¶5u&O¿¹ÞÝÝ=8Zÿô9§Ô»?·~ný>=¸nþó{Ræìâ¦IN©ðá~ïúúÚÝÛ=ð_KtkìÄ"éÂ{`÷ófO2}ë\ú]A¯ÃƽçÃÍ0AjÈéÕu?c"f$£æsvöS0í :!²pq¥L8¹]kd<Içw3þî v? >+øÄZldÐÓaèÙ^o"¡òÀþ3ë¯$VÏPLÝø·L½-Hõí ¸}yVßZ¹Ê]1IXQÍÇ^Ô4¥Ð ÑÉ~l¡þn¦ÑÑ _iÐEÌãêf2vV¾ÂàõÜkê:R½;::<ÜÛ3U¿ypnÐwbY£Qß³nÉÒSN¬/þ0Î}p\¯OÖþ96ó(©´¹Åø%¦Já`¡ñY! >+;eAr¾èÒ8sÛå">Øõ6¶Ø >+¯´;¶&>«[äÝû8]Z¿ÿ}´ÎÀÙ#V¢õ\Ô©oEÆäÏ®Ý3²×ç7ÚéÖ;µ¢À±#/`Ýhv¦Ê¢ÁVõ'¨e¸uÄ >+tíÑh#ÐEw)§-_ÛÙvèÙ¦zéÀÛ#S¾>-c'«ß÷°¯.7©ùhnÛ{³ÕA¬Ñ Ù¿¢/ï ê|j=©o×7à=óãì÷îÌ¡3ë¦ÀéñQË©µÅ%hM½j³}úr¢§C{¢E ôÝçö§=^z^2þÍÔÔmâMc»y°\OPÄ>|pý.ìã2ñÌåy³Uݬê®*ÜÇJ_d´ÍFçõr]\æ®ÂXE«ÞØ®¯b¾¾ej+¨·jMSÇAÉ7Éøo¶L1óC,Ó¥ó ñÈØs\×ó¼.öM´gõn¦¿X½ZNoöÂáÉÈþ?Ôht6äÇòÌ£Qf#÷úÈéK=Àº(r (z5ÐõPµSí4ëhÃôîéßøBNî±VøÉò°Èö4Sí enL40ëÓz`£¹×h`k{¿½TåÇ®¾Ó¨ý;Ý.òGpn=IG#Ê(.tNßë¨Ü]E£ÖØ©m}ÝQ;²ÌWÎi-?[muG]BÈîËérLĸVñ¿G4C$æ;ÙY¾¿91Õ^è©Æ`¼~ûõÜ¡4ÚY÷wÜV/+fëòÒ¹¬¬t¸wCkïÆZ[Ô4¸.¡rÙ°¾K½~Á|2Zd) ?ëhïìx×⫱l7¥nré<e¦µÜðj"SÁ<R#Ô5æ&t¨ð¨Æñù»{3>]aÃÞ¦6ékk-tK Ñâ£Q¿²r\]Ò{᫸ú¸:JKÍvÓMØ9~(U8D8ï<w½`Vlö,ÕûÞ¢wÌó=%Ég»Ü¾YLðlKgºÈ´Ã.¶VÙ£ ÌR=ÒÃSfZ¸ßÉ© *àé Ìñ£Lô/a¯°¥Z >+ùÂpué»Óî"ðÞr¼ú¶éÀ>ãÖ\EáU4dÃ&ov¼Ø÷<lÝì-Ïê¾7ݲ!Ìû a¨-C«®G³Ép-çÈO.Cà¾~÷XbZD7Â/¬®¿ëôMo>¶J_/7 >+yà³9~i:'D6Ã\ÔYCEÓ-Ûvyúg;Á`õ²ò\®£[×õ3óÀÒ_%4£«Å~Ïà~Á)µÛĨr4å6/ïZûäG½N~T·àGü¨íÁ_ð¢º?àÇ6üØCô½} <R_ò¢¸ªäÇ.üè´È\'T/ï¬üeíÂvÒ5d¢ÿØ}súf&·¢TïÌÓY=%4Jaurú¨^WdØÞRºÒ{b¹MYR®%|.¥Ê¬vÙ¼åD\³ù}é nÄöfÈ ëÌÐmCHÜ©wé VÌ7Vì`ãNƦWÊÅÑ¡½nü@bä»pÞ¼Äy`F9Eæ0þ-XÒ¶£d[ÑNÛËM¥(«8¶îB±å]Rp9CË2MÆíÈ,|'di(&íÊ.¿÷yÞc«o~ ´þ4nrQ»Ûiöï<<°ïÌØb©öÔ"Wva»L+Km >+ >+c7ß0ädq½hË2k´#KäáxÌ£±´Ëæ=(ÇT&ßù ¤$í§KÇ4çð'`ãSóý¡;ΰ}ÇëÛÙ¢y#,ê]âðµå9Ìéd2~e¯{ĹֳÇcHÿbgi%z§ÚHt¯lôÃaÚ·Ná/"¼g=iGFEPô¯¤%1Þ?¢Ò»Ð'v-®_Û1lLÙAIçÇøÆø&LÖ1ÃÂçu{ÎX2'bïfVÅZ ãwGnßwÕoy¨Â¿%ë:EûäÄ÷ºý*ëøãù¦&PzïÍÔåÇ2GdÑ®NÿI\/}Ä®ñ=?29UÌäÂì¶úÍ^Ný Eú³ íPݹ ø=`Xjͺcn³æzë¯=¾qCïûÃw»WÔD|pòôüäã!K®zãí¢ ÁÐsoÕ,ãøT¶CàK >+íè¬ÀBq¾°®ñªsVl¡ÅòÇ?zÏ[÷Æ»ÇÙÜñ¾Âqv)ÍQ®²»±¼¡×k©Ú=æUÍòXs&=8çØï5Ww¬ÉäùMÈdHiW@¸¥_´%7¹ýµ÷\kuÜeòUIÊ°âKæÏøZ#[|'À/tú:¯ÛÄx¶A/2t4u=ì÷ôáU3{âõfy!©ØOP]hz¯AöÂe·fG%WGÛp¾-Åï]·ò×5²ô2KzæáÃ2½ÛR$ºØëÝòØ,]»t,ºÅÙÔc¼ÓÅÓ4¾!(LÚ¸U_ö¯M5¦ÞhuþuY³>º^0$Yýó!2Zá;l6óÍ;$/þ·^óH°ÄwúQ":t×uG -ã[ô ¬Ïo¶9\½-«Ì Äiöbð8¹GÁ§×W§gWçN~âû½!Áób_]ôûz³F¸eÎbüé,¹¼+ñ~w×^ áiêÝé¨n1=pmEñwUßvz=>{Í0£úBáþÚ?Ô KÙÖV=çH5ïe÷*Åæ[¨[FÈÌǸðY³-+,zq[äözSÏ˺$åãclë_Ç2ÕÈ©oîwÀÎÖr½ùJαÃËB&ôì3ö<»»c¨fî)¤ÿ=ú9ÈY{5[ ³ØwQ?cVZª÷Ü|ZËý×õªÄp]ß>OÙ3¸¥^yÖ\V¨Ð"AIHz± ; WØ1ÿÿ/<3"ÿRvs¡Â`óÆ!ê 2ïÁ1Ñ8F/ãP{©.§[KÌâRW,$×Wx§.Që©kÒú¥C¿°uDtþËüï¸ÎD£*l7Ì"E[G >+#*,ÈIÕÞÝ£jN( â+jxò·Åu]ì3Y^sÖõ"׶åÅ5Ä4#øKæðék£Úèg'E¥àRn>HÁeJÁí4¾0úsu}Ý©9¯½çíb¾lîørnû;;,f¿¡Åam Õ5CVý0YGSòÏ"D·n.µb¼ÜFÍ8Ô0&;ÏKF8|y}ìòmPéñ7N¥¥]Äؼ0é|)ºx,×ó«®Fü§®;)e ãu£tzõ¸ ÖxÝXà²!öò4Ö£dÔë{½¨öÍl*Õ.81mÜøýFDd37À3:âß*ïÂYê¬IA ®±-feËq(+zK)!Â&£ ¹ðÕN[ö}Dk,Ã-+ÍóílÏf~êB$ÖýHû kúÙ8Æm¤ÝÇæ¹M0õû6¹ÂÈE¤ëRÄacÖΤ¦ >+b¨X.uYþâuÉÁ /æѳ_³1^rôb'ïN±!ÙÂn°Ä&dçØÀS#k±¨#°.ý¶gñ,ÔIa¡Ýþï¸Ù`¡¥Ú9-Þ¾ì ã¨=lõü0xePgmª+6bÌwDí*¬æµcþÛGY¬OB59a¢uX¥gF >+÷jX-=±×Í#§,{<jÉñv´¦ÒWh¶(7nài¬g®ÌsåRZ`,ÀÌ >+F_¥ÿ}+=+7Âÿ<?;5½ÎmßÝø]éì{^.VHרµÕ>çVåVòæN3uѤkWgGGoÎ>ߨù$KNÓ(·¤8 .ì3 >+#yø qMËg [´åbÞ6ÍÊǵ=Σ@¬UÚðz¢ÍØÜs)â,/ËEQü1w!ÖQÜȸ;èbG²¹wK±ò_-6ÈÐ)ëå]ÎòÏãäçFGB01ü ÆDebîj3d.zêÊ8IHÍk)7WÅ1 p/(@} üT¸ >+-æÐüj=~N£¦¦È +K´¦h.I·ÆIÞà·ÆR¯¥i:÷Ã"Uk9BÃ5g_"ý'vi,[¢7ÆFØ÷EfdMwÙòçlüzÜ}§Ĩ×J±ûßEFîÚ»h*öþ£¨rlGB¿ >+#fÙ5Þ&â~¹©¹²ÖÂ.¥7*Õ8p:,õÀ»`ËpGÊ^ÅÇý³ìùmè¦ÔYnøØ"Ãþ$Ó¢üÀ?ÉÎV4ÇÐKáò©àtºxdãÏÝ>4ʨ;9JS' Bþ÷Ð"Ò_Yîâ[<È}±8w¦¶ªr #-õܹ#- Ï:Ëâú [vØ@ðîmÙe9Kôë±Á«³¨0¾0]EiÀâE÷QQµË|øt!¼ÈµànEX¿×¯Ò#Ç{ÆÂ;ayH³òØ£¦Â¾l?ÿ¢1ÆÉ [~¿@¢D1]iêæ¤YH´o4êåð(Ò¯9uæôÏþ¦©ÙýaP$¡@ga!c¿IÂ3¨{¶wJ»-Spøfp¹Ë5u1.¨ßÐäM¬° uð¸Mçѽ:?VÉqûú¹ôÞ¬øzþÓKudéH~¿åÌ]»:KvùeÌtIÉqylñ¢Bl¨B70yü]:KvêöH=ÑKëßRÀ,!Ä.4ôC)ËKMRÍî/OAÛÙ ¡;îÓÍ:ä.æ>÷×B·Ì4b[Á¬^P|øý{ý©©uoïñÊQI)iyÁÐÔÅg%©xÓÆ®kJÜÛ¡]ÒésÉ:Pä\MÙüµíûõ©NXÁà²;Eò >+îIç{ö^Þ¤»Qºþë;3·äî`è-Ö)íÃ]nþq+¯áØ«äÎ (*Í¡PÀ×Æ(Hü«u$¿]:Úûîh>®c>âK õhnIqÔÃ,N/YL-sÜ,Ïy_©L·ß¼À[Ôø²òeåùªnô&êfk³öÜ÷zÏ»¶cy³MòpAuT«Õv³à÷V»EWëì;|ÚíFÕêµF½ÑnߨZk×íÿAÕÕùúå¦tq{pl0ÈxÏúÄïÏÛé¦}²zÿ°²²âXcLc2ÒUg [|zy]õìs!+꯿¡¨²»·pxtüúäÿzóöôìÝïÏ/>|üôÓÏ¿XÝ^®öï7£±ãNþðü`úùönögµVo4[íÎö÷Ï+/Vx=ýðcß²C¨ïY>n7¹¿×Ôñíklþh¾ë[µÎËØâ+²2_l© ©ÑïvHk½|M@ñ\µ|Ùô0`^m¢ïhè9j ï|4ÂZäNRÁSRä×êoÚJX[{ésãðãT0-póBÈÿ!Å×[Ù/«/ìX/ìï¿_G@-ôýKÒêØ >+þþ{^) W¯Pý·9À««!øST½#Øø5×Ðß=¯Q4Í5S<5g@ñÔ#<u§'¦ü&ËÚäxÜÚàM(h'Mpªî(ÏàÓ?ºIÐZ´uP8«(aô¢ou]ª/±KyL+Æ8 É#@ >+·H&úF8Ñ×a¾B0,IªJ²>iÄõVk}_j×cß"Ôª¯£Vükäe«MþmòoÕ¬]Su-µEðÁqRD"xN"¤ ¸«¸«5¥ÕH)P#j¤@¨uR N >+ÔI:A\7 ªDu¨NÕ ¢AÔ Q jD × p × p ׬J-jMR I >+4I&)Ð$¤@h-¸U[ܨ= z@謡±¨£?(Bì:À MRª"ÛL¸vÌ&Ddá%Âô >+À")kV)²Mzã{umMæ¦Åäí,§éKøcµAÔ:Êö5¢5z'[bg'À© V# tMM®ôµ¸&[0J±h° å¬Ö Ý+F _íßâ!¡].#Uɦ!vgýAÚ6,ÚýD6QSPMBÛX²Ô×ÚÉ¢y ªè)ç_m²æeþ1ÕáOGÝIÇÌÉS'Ò¥),˲ÿï sa¦ÞÍæpÞ:röÿµV5¶ÿßjWûÿe|ØDîþÙ7û'g§ç»ûÿºz}Õ®ïÕzõjk¿sxU«^uvÛWÕ½ju{·Ý^yBÊÂYoÉâ+¤zÄPôW¯Þï_}<|O¨þáÓ«ãÓûWWk0óÅ7*Mà ðöäôì=yüê%Ý9ü-AÒGk`^?ÞßGþt2q½ÀGg]-äÝ(â$ÛÍËÿÖØl®< V`§oV ÅÜ`ò¯¤DèúØ^¥ØMuoÚPdÊã+z? ;Ó1PA8¼.ü|Ö ÙzÓk=º° ?EùQoDÚ Õrm\kviwd÷vH jÈBKë>ÆÁþÔSßÕ-Ýô=q´äJßâè¡K/¤«jq;¥ Ýi#ÿví>z7õ±¶¤7V&²ª$°NUúò=Z`XÝI!¤l<)`¸t >+Ó.ñ#g¶çù!µâWqLlX¿¬pö&.9Ótó?Uþ'J÷ùÂdÈýVK+ÿ©¼Tåk«ºõ?¨µ°d|þËåúø&l¿¸õðnÂþßl´Öÿe|Rìÿà ,`XYÑ@VåýÖèÚõì`8@XýܺÅÏ<L¦^»c¡1\¦)\áP~V@»G#úÐÅ{ÏqÐÛD©ÃtÒv]üÄãÞbonzC×|yf=C?¼$Ï@? ?ÉßÏþ|FÅ1/ùЦÜMü ¤À®®Îçúý6c¢Ü!(GòÁBà¶äîü^£«¶RÀ_ ç/§g9>Ù@WýÍ.¾¶Õµuäoý!ñfÓ¼½>¬,Ð ,á#²<¡`AC¯¡Àöðh¦i#AMÇ ·5}3Kàä,×$C9èìJýAÜÿ_¿¢ &¬tâðÝá}ËÇôÑ&zOA} >+KötèÁý°Ð}Äwïßïï'þ½<Ù·&v`HsûreÙEú½µ¢X/$Ró²®mÇ2ö¬ Üä£ûHOÈf,ðÓ.ùEÃE@£Úå¢ÆòÖ¼¶öU§hº´µ\|ü_^íìPóDH<pâxJï¬#xÿyCÅjÆ'~x}Q¦ÌT¤ å<d'µ]ÒQl)JïHg¡\Ò^Ñ$Òxú.)ÄP¥ß½và$ ÎÄõ}i¦û¡ÇMQdÁ)ǽE«uIK<wÌ0ð(Å¡wÂsFÏ¡ Ã`<Z£C#Ùúù>*Ô0 à ´\g?©N(ùYÌ R¸>ôe=|}úÈ>xH±IÏ]ºö%âÊÇ1V§!A70é =ÏxBOw°J[¾ö\þF¹´`íß6C¢JÆXx8Â-J,x<9·¸@/¨j_ >+CVÁE@ ÀKwßû¢ÿõmØ >+Û±¿ 0Gÿ«nUÛqûO¶õ ÿ-ã)wÒ°§º~<:;;Ñß«|í#¢H|H\Øm³¿6mÿ¬é(&lønlýîCMyh;ôa=\îë-q*¨/ÖõkËéRè!}ÃmZ5¶&`Åër1²jQø+êÍIÖp¶$½°®ýÍMt,õð¿¥ >+X$á¼<~\QT¿¶l*aE_$Äl¼òi"ñ¹eNöüÛôK?yö_2õãû¿VëÁÿk)Ðþ{pò¬JÏ~ü7·úRé =!b$Ëäû6*¨n*"N¨$\GTö1ß#Q:v,w¹%¤"Ø -åÂø $'õbʼ;eq¶øÚSá¿ò"ÿñØ^ ñïòåµ¹°ÿÖòq2Aºñ^Áþ²h~QÔ·9*"2Y©§bÓ^«ÑÓi°âF®ÐiÕ!Å°òÞ©¼b!{CQÀ+Þ0À³ª'Q¨R)ȱÇ^å4ô qzòï SZ ¦ãI¾^G6úpàzW`8Z[Á|ø|Óüæ÷ü+AüoÖkMUþÃNèAþ/å³Pù-!ÓQìhHøFH4îü*Õ.ÜsúÇ*Úk9½¡ë]ýÁöØ<·³_L}¥c%äújSr)ZvvÔïÑÊÄɱ¶ÆW¡(Q!LWêGy渽é|9'p!þÖòn=C.ô)ÿ:S-{prËÛd¢w;ñW+°}!ú >+ä/²ëßÙ_¢J=à^n-§jnåUêNÙÍL¢M©ô \¶d?¸av«ùÅÒg7~®&ÒR¤ ìc`É»æ¾ïì|²lÿ}äzJ0¬ÜÀ!çªuç¼fî £4: 9 ¿±so£¬¦½µ&_à¤zCÿs2gu%À¼¦bæêȪiDqVª`Hrû¿l7±ÒIiÜ¡¦V¥Ïäéþ4Ù×$|Bzv!H[M©QBaV§hbTcvÔÇ_²8â·blKÙ[×áh|¿èÊ?íZíöºV`/¬k`ìÐ.PÆE7}®Ý¯ñÑèÿt¸ÿ¯vÝÿðÚþ¿©jÏR úfØ£ØfAJh¡ÛEé1Ô©[¦?F"&ä@ѦZ÷JÒUß"þ>âD9ÕJÃ~gâZG ÃlCsìòÿjn'¹E>ä[°isòHºÏ«~M)ÍÄõ#çùszùæàÞ ÂÜcGà»vݾ£ËÆ+¢?¢¸qðÆòm%§ >+ÊU ÒØëÛµFÈÇýâ=ÇÁÙ4L}B\³zøöäââðýÕÛÝÓw¨1QB¯££qpÞsÁ)ûÖ6&Q3[ÅÈ=¶V¬Í¬÷QJÅ{äAnµ´{#»²PKj G׺S,áù}ðZ¢7ع Q ¦Ñ-ÉN.#&Rªì}H)ÎëôbÁ±çN'ìr½îQ¸D»_¤5^D)?Ò¤8QsïeaÅüṈ̃¥°N¾óð¾;K¥ÕIV¨2&ik·u±· ù=þ¯øÆ8ãÈ Ó«g·Ók?p§Ý.[}¼tfý°Ò2oÜ5¢[6îU|hC²w1x>²Ð5Luäz°&ïc·ol4£t%w&B1aûÅWÙÝò;§îY!iL÷×nm¡âð 3@$v°dû¯³ïàÐÃNè±+àì{v"bØÉ=v}×ú oÓãw{ÉX÷ñ°ÑdWÉûÔ·ÂêõqÚ,v3ê<±<;!w@Ψ°1¯×Òê&ûâ½Ù¿µ¾Áv9½±§øbçFàüA\1 >+(/qcXÑ/+ Îõã¶å)zWìÛS¯N¢l&<Å)ªFÍ #£oH4y[ħhþdRwE(PU½î%ÂthÒ:Z{_IyÕÇEQVTKòNIl"!Râ(«ýþÔzÙ<~$5®r!¦ôm*|7¡ÙU½Ëúü´£ÂX:Þ»÷J[^[>·@Qg1åKhßõÜiÄ«äèG'Vù+§¼ÙØØP^JP¢å°ba!ÒÃ_$éÓF<\ÆûÛïÍÍMúòQ|æ5U;séz[l$<!˦fú(§ø.ÆTݬ¥ÅSIp!-/äJMoBÝa\¹?´Gý}w >+ßàpC+|ÉÞ¤aç0&·Ø'QÌá·ø+÷De ª¤Ç×d³Gü-[q/\µ]|©,iÍù5£5ß*3#ª{¡Ý©É"eÙ`.ÉæP2Éæ^J¬YØû~Ùû¯,öþ¢°·1[3và Bà >+~GÝ¿¼çøÂxù| Ö,3±HZI)13Õºo9J#So/~¾ 4x7 è¾·n§Úwù OäÃUóº%;/LiÆ8Ø X7¯7×áÚ/»fΰpOu©`e±ðè*µ3IÆbôâ[q6g·°4Ó1dFbØ´aInKy³.\o5Á<Zg¢:&Y!aîÊÂÐ5ÉÚÂ7ÇÇIïy±ø¾¥Ö¾Yhup½`¶cË ãNÔÌß/+ÑOý| ³È(BðpºtRÚ6~ǣťèàÉå5é±Qà7°©tSÊe#ÆÂ`iÜR@vDP_í0AMþ'¢d3Ë(x¥ôÓJ°náfwd97ëô¤¾ð$>7/OϼìÉ N£µ-Q åÓE^QßÃÒ&2שôÈÙzTJrfwÊjPdÇC¶VF{ôRÒ*ÞÇJ`IPr´½_µy['LDrvõt óA´OI®ÚtKÇ:Ò2A!-F&[½Sævî5Çäî »0enK{³º ¢ïS&ë>´±#X&Uòä*Ïò)%n¶ú²¢Ü.è·¦nl£Ì0BCÄÈ÷³[*¼ºçTb®sÄ$fþJ[ª¹ÊHl?Up»3SÿÕÙ¢5ÇcN+tã:×à 2dÊq, 'Ê'¢`²(!`Ú>3U·Pu§!øBȾ¢meÇÓó68KÆêN·ûVnCþß äþ þQ\ÍUÊ<¬Q >+ïbÌU"èaîgh;³ña6Âçgc¤}<LÅ%cµ5%ö0éÅçaÒÏ=éáEøa>~ ð¢M%Ó}8êjÀ\Ø°¶êÄÊß³Y'½µí:º&gv¥3ÙzÖ§jJçpBÄK'æËâ6rV¸¬ ©½)>ð)rL¾j~µ³»RÙEöÖºÚ×_ >+K¯u²ý_kJPH¦Ò>j2îû2EÍçÌB,4ÿ~Ki"Æŧ³laõ: W÷ºÁÏsr+Ù}yðϪu(´Àzq~+EçÂüN#¿Aíføx3¼FáC¶uä»cÆ®A,ÀÅþ ;ê? ¤:ýâ$¤·_<üÇÔ&sÞGó"¼XbFl3¢ >+©WIÁ¹]nB2¤¹Y*úc˪p"]{Öè<¾+âhñ@j GÉØQÂ9`"j*©{©a^ã»$SIý¯Þ±¼:q|C|ï¬dãKGçöÌ0 1Þ£GJ¿Sf'qSâîa'Fî}wßý½kõ}ñ .Y¥Ç ¯rS'ê#½^ ³°~Ï`"µwým+Ë×q<´µ-*âë+\@IûØý¸ÛÙ¬ÛSâ)ðò!£R»òzm=eIîS®Çz¢Y%¥¶¼5ö ÍQ5Ê$¡ZY0m¾Î >+!þÈ´3ÖK+Æg¼hyê:¬våÝȲìüe¾`©ØÏÉß#üãÔ%3&Y aÊ2$V¶a²mÙ&°&M!ÓÁ7ÅÄÙ'»5(½!©£¢ ¨0ñëº)í®8¤7øh£ÇuXãD uu >+Q¦Å$å+m¶ºxàóú%#E££éhñóN1fÊIW ·Èʪ§Æd¦¹ODº&'âð±8ÐC×£¯Ð?ÐÏØ?uéß;(QT¬ç/4õ²ze¥8´x¨2°Êh׸¶ÏP<(ÍXwBwI*?WHû+§g|1gÐû£hì3hW¦©rÐ3íèP@jÀ&Tçl0«cg§´î³£#9z00éË ÝÚ¸cd×qÏ\»xÿá6áh÷Íù¡I¡^V¦Â5èdÈ%L:ªÔýHáÆ°=ñpìÆ. ®qØÄÈÓî:²üÆé ÀE×ögz4Ýrü[U >+>и¸ 0а >+®ôbf3iÄòê¢TYÆ/"bxäðhÉ >+~þ¨è9bÊëkFêZ¡×Syv÷Å-m] UZNI½/Ö#&Ìx,øUHÛÿ(TI^ÛS¢+ÑoýëÓ»oN®ÈÝóbÞª/%xº+Ó¥NI³ÉíQ¡ôíN1ÜÛ)4ÏÜÔ£ÿÓdäþù´Üàî¿>{¿ÐÑiñc>(7aãÍPÁRì@ùBó+,dËO¾ÝcÃÁK4ÂtEArØözØ÷cq!óD@ÂbÄÙÙaÂ4,QQ% ÷?"Îë4äÌZ¸t jÞyöØòf,ej¹º"ÓN¸NiQ|²!!ßÀ¾!Ð >+â5ý8#,ÂãlS<±yÒôå&¨HÄ4e|Ìxài¥²¶f¶RñxÅO7.n = >+Udt¾fq¥0P5DLg¶ßQVvnåwö$be"bó!# S)µòu=EÏ¿Àß=¿Gm'Õò\ù¿Ê56Ú£=Û!³÷)êÒß >+/Ódéä)åG@¹rÁ]V5HÞ² >+éùýåÿÐç¡A¸&;ÿK½^ç¬m5Ûü/ËødxÉM×2²IY?5 :+TrÌ+ôKÛbûÇ0÷è òP#¯Vé÷¡ÐMÙÒÊÁ<VH1zÞw{Ì-¤Ê¥ì·ÉoÓÃÜ"c˱'Ódï%j"ÿ{ìÔ`&!M,¬|y8³·»ÓÀåOA¯ +¶é=ßór(°ÀÇö)¿æÖ þÞvðÕî4Æ6<¬óGØÒ¤¾/2ôm-ìþ#¬ÖòÇck¢y >+*)"a¯ÆȦ0ôðDZg÷®×ü@Á^íìôíkòµV¹/Á(*&Q-"Ĥ¨âÿOåDÆGàFÝ!õhF´Iû`¡ÑÿG#D(êÛ¤b8][t >+Ákß,¶?ÇqæXy¢¡Æ»ÁCÔÒ[ êbdõ`ᾪfñV¦ÈÏl `ÏMF£feIJÖÜ|àìÌ/ >+xFVÎ<Jn±ô'J±ì¤&4Ìå>¼á2qÜ+ä Ȳ#KÇÉ4óäE[YãLC½7Ç)®ÄòsòÇã+lÃÉ!_$tJªÆÇ R¶²)Ú¨ÈzÉKÓb_¶uV±.¤®ßRì]ãn/ »±v8£x,ßÜac*+sÐJóqµ.aåï¿Ï¹kqäO)W®"¥)kF$DãÒ)ÏǼ4·ÒÞ(EP_Ä]ùÔAÐƪfÀÀÄéG`ýHr8ÄÛN:°K¢a$¥Øú %ß´hÝÃîéPp¸üëKk/M;W{)üC~²cM&ØKø?]U`Õ09çR2ÌeQÕ{yMÉ¡Æ¿JrQ]û#lyoY§>YÀ r©/Ñë+JD¦ª';V³8i#Ú?½*ùÓ²{UÞ¢ *=WdpÈU÷e%·3RõÚ" >+ýÕ$ð~ ï_¡ ëdÅdѶ¦IÂÒg9þÓÄX2hõvh÷´D±=bj1m"ô©÷ý£GõÆ«q´ÔG þ ïäLp¦r ¬4u)¤ðÑÀ'$@fa¶FݲÃá¼`h/Ä0ÑüÞ\ìXts'¸m3{Ö/:Ab_þpzøÓ»ÃýëÃÓ«óÃM.}ã{»ûN¹ýò{6îî§?{@^Æ(4|d;¶?ä$¤ÌÒß ÓA¾&lã%Ôã! ##ajÞî^ì¿&=8~öá0½áLëa`[wÔ<OfP|n6â¯^ªwØU°!¿&2õ¯Ò©Hw¬h9פckF¯Ïdg±C]AÉ<Ew,/ÄeA@h=ÁýußßÁÙ/ÂàMFtÌf?.l794X+Qª±ûu* >+µZÃ'¾¸ÇF5j²%f}zæ'0¤0V,KSÍù¥ík$ì²Ú!% )ÐwzSB/,é-ÎxæóL|̱ê¨Åímö7J{ä±vÁVP]*Ù¾YRjO %w.ñ<Ö?¼DµÔùTÍ;HSºQK\Úª anø >+²ÙøÔ\(u#71µlâþæð תËô)¤£Äªo;s@»"XÖla¿b¼²0îêÀÆ_ú/))j£îæeÃ.×[°*G½Tý·ÅmÅ¥Z8÷ ^Í)åþ¾)»T·PCeg,ï9?XP׳z®rÖÿð¬Dâ Ð[0ÑOqʲÞJ6î õ5r}º¹»ÆûÏî¹÷~a¯}Ewºû÷¥ì,ìÞ{¨¦Û6èYÐØC¶¥Ô¸"õ¡O@}H¤ÊÒ´O¼HKq4³¥ñE6k cF:óE·:^Ó¤N;b ¹¬£ Íj|*¸_ÔܼSµâRÜ.l¨TtlD$åR >+Ù&à0BOéÙG)Üø®~4cÉÜ¿QBB3Bc«Ð |î·¶O¨qMöv0D·dcûÌG©MaêGaHìÍkzÇ0"9{°=Ã{Ò¸Þ¯Oqn¿(ÆÐì= ´aݵÄþSN}y ýÒ61û1'J<£w21©}é$ßèºO¤»@!VÜ >+÷ê¥öð¹¯OÿßpudûÿÕMò0æÿG>øÿ-ãóÄÝhê.ç»W¯¯Úõ½z£U¯^míw¯jµÃ«ÎncûªÚ!CWîoï¶Û+OHAÛÁ¥Ê®+ß_½z{¾õñð=½Q´*^~Ø¿ºZ@â¬Ã x¼=9={O¿z¬¼¤Öà°õxùÓÉì}TxÖõØB®Óâ=£zo¨±Ù\y"A¬<ÁN߬¬HÀ»"üлQý$¹¡[ç<ɦé]6õFTý+{Ì°ÿJzô´Ùõä'´Aò1»ÞLé3ÎTWMó^ %ôÂdyáëÍ_z0£cv,ðåù_Q¼p×uº"ÚN¬T¨³¥·ëLæåVõFÊKu¡ YµlºuTÝú@Cù¿ä#~Baùv§î qï"¿ðë)Ìø+232oÕô,*ÎN÷ÀâÉRJÂ5C#¤è^ÕNT,ζedä!²¾9.î!Üc ÃÙÀ'¬0º¶Ãï}Ä«· âoSbáÒW©IÆY!É!ö*òH/¹ÊÌ?^°¹Ç§ÒæÈÈÜóæEªÿÏÞ·?´# ߯á¯hØïÀÃò\#`f¸I dæö|þhÀãöºí<v&󷪤ZÝnCvfñn»[R©T*êQtß7ùCW;¶ÿ:¦èFX)14|IbËÈûâ [×NÁd©ºÎ_ å¾KÈèù[¬»~©¹jÆ°$T >XG½ UÊJº"ïX¶ZÑßíJ*lØÆ(¯Övï4À/BÍi-û`QuÀë\iÀäºÅ!zò³ÍvøxæqjP®zÝÄ ×-þ Èg5$WS÷áñ3òPh:®£y/ÅsÑd]Àº¼(#$v¢t%uº, (¯F)´) >+áPgèȦÎ+*EÇyWÇ<9ä_ JÞE2KÎÅ%Ö驤ºN´åBwUå` >+/ÏBeÖÇ JïMî&uÌtd0yîC9À4<Së×ÂlùHY Ý òS?FÉå ǧ bp£ ½ã¢¦·æ§GóÑèaªµ±¨wÈI?<×ôeN23l)Ç'yFqUæÔÆzº èmØͺUVöÑÒ"¼ÉM,cö%y;(-GüZÑ´±alÑÛüíX£/Jе¤"´ 1UÃÛÈ-©Âb3%p¡-4ÿËv¹Ba+>cflµt|¨| ÏWú:þÑ\EQk ?ÙL ê£_0^£öà±úg+a~F´/ >+|k-Kª{s-8?N¬Þñ2¼²W¨` óo¡*ð©ìâ!?AâI-ýNàôùÇs&¹þ¸MPúc¼LtX±\ )¥ªY²Rï÷î¡îÑj£kmn6\ywwtyX¼oà±8WµÖ®dÐM:`x¥;W´â _è»n¡tµ°2D¯3ö¯¦ã8_Òz±õl¤¥Ý-î¥À®:ØÒºlÀkÅâ~Ô Ië¾DhSFÜI,¹Ù2»ývÑGõ£¸>7ÁÔ k)"^Ü?úé«-÷c7gàKíácRÀe >+¨AJ}èõ*ßúÒæ?Å÷cdrñ?î7×Vû÷Ww÷·ñÉÅÿ iwn¨Pæ>èÚ¨HwYéfº0"sG>OÜ$O3 #ﲺ)^o²ìÇCö2ö!IpãôËAûõËÍö«öÞQgëÍÍ-Å¢gQóóÎÎÎ6íhtdÚåM ã5ÔwrW3ÀÓÂÔýlÑ-ÃYíQ ãbØ u >+żðÖ|{o¾ýb¾}Uß`_¹dY!¾{qJdS)ünD¥³åOÝRãiïìpSÇ_FÉr:Tô¾|?8Å6¹æçm,}lÇ·þ±Õ<\wËó!ò|Ë-À±|^#Ë=¿=¿Øã¶[ôKm¥6`:·ÿ[c¨ ¿ÕüVóDmÊ´L_'ÕÁÞv¶·tmûÛÙnïÔ'Bª >+®6w@g}Õ É7£³'/Ôìf»D(É©fÊä×ţ䧸§ÈõÝÄÑSFÕبa RIºÖÆ\´Kbn2ͬòß5þ{ÿ>à¿ùï#þûØ£UIS«ºÕû^±5§Øïí}çOø#%Ü3îòª¦YC¸¼øq.S»>Nµ SÌVéåIÓ!lêûdw[J~ªÙØìn~T|#®¡ïøEC^¯¯ãÙ> #þyÖfåeеÏÌ»¢0¬ á"Z4dÒGJÂÀ 9ªZĶêz¹ðÓhÕÐâ/âÓ¨¨ÿñÐÓ¥%¬ªgIVuäÅ03tÏïþÙ3Ñ¿là ÀsU^ÇÝQ ÓKðlÆÙÇqd3~ë%Ë¥ã·p}W{-3vµ<ï`ey^Ò/ØYj-=E´".ÝtI3fäBî<Ã]á¬GÀ©Vy &ê>U¬îQnfÕèÇÕqÇÙ¶·Àø7Ðn¯+u£TÎ,{4íå¸dEà9ü§Ó³5Øqx;Ä´·kB [LjÜg¦ê pCÁ£0G²äj) bOC\¡ØP:5ðBßô&9W³Z°% 7ÿù±mIAEBìºä]Í@ÉmEüRcZ^ýêLÍFôHoóp¬-¨öÄ«F£> ([%PµóP®UËîf5üøO®¾÷´ðÿnãÏ»¨º§ô-ÂY ZèiÁâú !æ(P¡Y|Ǻ©ËÍÏßòÁ>¹4áÆ#Þíªä¼ýyCb]iô<jp:ÙnlÁ¢õÜ«ZÝHµYl}åU¬Î$ð'à ª!u¢~Án2"< ѹ£NôX¡0î.ÎƽÞè:£ ÕÊ(¢«Ê`î"ü'çÝ>¹¨CX±È:´¤Ï R±0ºÂ t3?ûç#Û¾«ñvÿ4oóBB±2¬h±Î^Üÿ°?|>&ôÁ§[6}ÝÄv°Â^:zHy÷0Øb¥J uv@ZÙê+uP\áXú(>æØ÷Èø¨ ÇggÉÑ Ü^B¶.øAÎê\KXÍN!g.T/>P«zîZÆc$ò§¥&5ý¶ù¾®äºâö¨`NîÍË>rrbs«@6÷ú$ÿ¢VÉÑþöþ:/T¨¤ýå&f|ÖkÏsUéÔ÷w5[ݧv¦ZÝ¥¥Ë,/\E«æßvÝE×8a_¯ojÈ»þÂÄK¦Æ¾]Þùoó<É:Ï×µv£éfþ >+·nõ_ÿ iézóï½ç][I_R ÉßÇ ('¦üiÈt|ÞF´·Ð£¹æêÚý=~ò×øøä49L!ËsïÞq&èÜÚTO¼àKÈE3£ÛÓ@ï¶Ö<©»@è.ktkô'óÕ~Èw9Zÿ=>ã¼é² >+hº9#*2>©IࢨIX^¦_uG(·ÓåʵÑbTãúËÑ*ì4xÀ}ïï6Íf >+OABP¡©4½UHLáÕE]Ìp 3P¶uicW£Ù×ïVjeÖ¹°ÞÏ顦{ÇÐÂ8éI¥( å#-âÚ®] IËyevîõ¤lðÊ!W/p$BØ-H49f Áhx½ËËà2ùj¨4åã >+ÈP¡TSJ¶z³c+OWz³ºså%núÆf.BíR±z&;Sôh ÊÕNÅqgÉé iaÎض¹øJøÊü1!m¢ó\ ¿_r9©c=D-í³*è >+`?þilÌ÷ð6;úfú[XpwɹÆÉõTÙ `ÚãüÒP½(ð4\ÀƽY7÷Ï5íþ >+ÒÙB¥¸Zi|>·°.H\h zÞ¹ÞUªÔw*õ+Õ9uFê:ÃJu:ÇåuJ|rÂñjõý»'¡Í&ùbÞPQ£=±iWAêë >+¡Ï¤Ó¿ðÚ hÚ颦 R?\a~ÓyPAE`,Eµÿùyï°®ó¶kQû4¼êÑêÊ"éäd%z¸²V¿w»È=Ý0©¸-&wTÂ'ýò_sSs«ët§µ|:iM»s¬òWXåâY²¥5÷ÛóÑJ»§8i÷ç >+Çb·¸És§gjÒ¦g¨)1)xiïÔâ`$`d¡Íxþ±@!6óïþge<¾Mòkȼ¼Jj $Ø¢ú)µúè¨)Þ*)Þî×R¾¨p?P¸_Tø8PøØ)ü/M_¥ -~üÚáÙt篦_a9O3éTËêÉL×gÐ*%mpî/~)ec¾qµ@;Y2êè¾ X·ÞjnáLÕ¯rôx¹Wgåå$EI¯uYt¶_'5Fó©a=È8Àµº¢{§sHpùþ£H+©é|~ö)f£É¼ÒsA9Lð®Vènðvíõ#¹¾.C{3Õ7F÷eºÑõöG_´RËËË}Cýub.Èo¾Îðf)Qi't£Èá¦ö<:ëoàevikv.<}ÔÌDúaçË©$ÉZþØ©äYq >+WxRa~d»räsg®ªàCáé5&àG ¦pHÁ[ò`£7}2-§BÎ=[F~¹|¹Þ»PóM´ûÀã_¨Cæ£5¶ö?G1 2~mRlÙx^8¼!ø->ü~ÿø͵Çrþ?«ÝùÿÜÆÇÿ÷æh÷åáãÿMU÷ÿ¯BªdñzîLÈHC®KÀ)Èqgbøv×~à<¼Ûj8÷Q 秡o]LD½«fÑÿ$·"öÅMÞy´~»ÛÅ ©¢ÜF+èP¼ >+7xPw[¾ÂyÍkà >+G.· ërý|ëbZ«Èy*ökøhÿÿ<¸·_ó°ÿ?|üø·ÿ?|øè.þï|J¼|'ùëZ¯ÜR\uv"\£É{ ~H>îôL~çñÒÅ~Ýaà§ë©çÊ-öàÅlvo»ï=ã2Ó&éB*ç3}¬«çË\VVYjÛZz'\3X¿¯ÿ×pýæ=º¦×öÁ SmÍ&_áîÞO/w·;?´ÿ»ÎZ[vþ)VKaçÅ'8,d 2ÚéjÂÊÑL"WEk«¯ÎEÝIH:kú¾A²Qàáu~?ù<àLJ¡äý"ZÅÅ`Ö)qé8â#ÁAÕI6îVLã»®ÔºÂN¨¦Æ1¸ >+¨VV¼dµC\óÈ`ZLбCöÊa|QEx"ÛQ=ãtlA:Æ9R%!{kW!Ñ'#8#¸bÌâã}å-ëmä7îw¡ß礫1-8þr&Ñ ûÊÉä¾o%1è2;'U_Æò$ùfowk» / µG^A-O]+ÆDþDwßhÒÏQ`Ð2£Ïcö¡³&92^N | ô[ÒË<ÃÔozõD¼rÜ[WG§õ¶Û:xxyÍË®M/Õ@Èw·ãu÷¤¤;éu-?º>`aF@¿hksWrQ%µÐí/D55ãzïg(ëK=Q:c:HDÙ¿NFSò¸¯ÖËE`}mwkÏDV!YC¢t§e3z£âæ+ÝòÓ|¦2îr¹ääu:oðéÄY1æìÚ7"Ç©dî3ÅvJÈ8 ¨FY}§ý~Ìù\l9úÕ4Áñ:À98í'³Ø6ÿ1n÷dáÒ\XÂ;Ê»ÏÍæ+h©plÏ©·çäËc÷åçåh!o#LyD½¿:õúîËMçåG÷åçåûrËy9t_n;/çåªÛlä¼\k:/Ñhʼsß-Èwî»wòÝ;çÝwâÕwÎ='çå¦çKçe{MÕnªBjÊÐüïåaTûÛÚº¨ô:\é¯\éµ®ôWYé³ÄKv÷5ªÆÁ22oeÈ=ªx¸çIÊÏo¤íÃÍ×m௬`m;Èÿç¿PûÏü/÷Õÿüóúuwþ»Ñÿþ÷ë©Õ¾Õ«ü¡µ½Ãä\üA®Gm¸¡¬ÔJ³ñw7ü£µ½~ɲ¨ÇÑñ¸âÁY¤³^ kpp ¢çY9öÔFRea¿>ëöà ^usÙÍNfà¼ÆÔ!À!®ñîìøaÄüV»*ynìÃBÍ¢{nFÁîªr«èÙ<¡]= EfÖG¸Rãì/]è>°ÑϹwÃwý¹)Gaý³ËúÓV}qñʽ /Xµá4¨¢¨ÜöfopWk;¶ÿ!ѵ° þgÚîö(iÞ^5dª7F@å^~N§UZ·Ø!-O18Æw£§ÎCÙEDìYA¿jÍ}ÏÒÈà<_¨KÌr=p`"'ÂÏ6oYqCqT &e,½z>7WÕ?%Ù5ï«Ô¿êß#õA¢Déwê¼>×Úß·ÿ»³à·ÓüÜl7@ : |QÓËõóÖÚHRöÁ¤yõ÷Tõà½ø«Âv½ú¤âTÀ´;ï>¿P|±d!4¤Ç«l¦h½§'X¾Z¿ËËËsTL1vÕs»?iép¿+++7Ùï®8iEYäg`§àØéÉv4üRé-/ÜÔ)S .cnÓôbüÞ}QÒ¢Jý¬ß±Ói8¡ë¹ÆWɦä?÷÷¦¦bòR¥Ý¿L³ë4]eíÎ2{ûþ¯ Y»È¶ëÊ,æùzãý×ÿÿWÞ}uÎö°eý²à`ã/ï¯ÿÇü³¥ÿÓè¬Ìþ¶¸P«¿}ï£÷¢GJ#¡ÿN#f_¸Îí`ÑöôZ_ã^q&h+îAѧX{3±"JDýä#e+1 ú_@*iDo£÷Ñ/Ñ×è/Ñ|´ÍF¿FÑ» èÝ\ôïÑDÿO7²ÛÇcÐ1&< òGÑrô²{¥r`&OK+^;Û\7ó¢=é( c^Çÿ.SË MEkÂ*fA°Èþ2¿8ûëÆ» ws׫qùùºóª§NA}¡8aWÌó)FãIS.¢jÝî>óUÖ}bÿ(Þ»óî9àX¾/è àٰݪ(Û.¼[âX¬ºæþBn^ÐËÖEz9¨*6ò@' ¤«ISgIÿèõYp)9¾ÏU/=øÎÀ{É.:÷OÐBdfÒuWkk[í9B»´Ý5]÷#Lm -÷-ç9ä8o >+¨5¯ß^¿¦þ/¸þ×ÐkáámÃpðf1÷wªWóþ+HªÏúÏðPâ×0iïTÇ~ؼMuaFü´¤ÛñMͪ«|¿µbûîSé¸ÿq²;ÜDìÿV>öíÿ=~pgÿ+}ÿ³»·ÝÞ;Ú<ÚÝßöè >+UÿÐ÷AÕlü»iu$Ûò\ÜÚ¥®1ÜêC¾»~Mý¡üuöESYÝÑ"CÞxÀþÉàZfc,:×æX¢É³Íö1{¯-D¸§° òNïõ(=J¿Å(Rwäg<Ê£§áäÑ}»ã·^þ!þ\¦Ã/7h>ÿ7W}ûïGkßñÿÛøØZ?=M¾;MFq·§i!l.Â÷ënûÊ°1G©ùΰÃõõËdxÔóÑð"q@.;WX¶õnÅ<Öhxbæíòµ¾èÖ¡£|¤d_ó]ÉÔÿaóðúúb2£¤ÓÇÄ»ºL ÒÉ)>¢ÁOêæ_e+Ý>f¥Ã"ÎÙjN4vÑ39^ó4(zÄq)|hCN{ »Ï¿Ö'Àÿq)ߤÐþß|Ðôåÿ«wüÿ6>El]ósû»Àó/JbÊÂÊ_¶zi_3°=d§È±p0xÖÆ"j¯Æ¼SÜBBÄ ØänñKQ9¬ÀA¢^Òü³¾õßX7Å&Ø>xð('ÿ=n®ÝÿÛøTë&SË7îj(åK© 6£X_Ç$.º_DoñÎ|©³èe§m³.4Ô3Ì;/a{=|%?WæÆPCâè̵;ZÁá >+µ:ÿºmûMK\«Dnï,XXU'"óòaóÞKÊbüiñ# #ÄrÊ?P·ìº(ìýÞQ'/®'=E\¼qæGÎÎ+D >+u.vɳrÒKય5±6;"qýax×ÞIê¿NÕËxP¡!®KíÔþZJ#ñyÈ=W¢ºBÿøÜ?²xõÂk¢^pÖK¼¤é¬8OIá4e¯Ìļ·°yª/¿À·ø;Ðpò@P¢2© Äú9~TMr¢ªBÈÊTëH¬Ã>ÏZä1Ì©ÐLmEeùÚê!»QBg¬iìuÜfÚÁvªÚáè5/Li~.âHYg=¥á!4óóâá[SöýòF7³ÜWsU~K©AË!¦;ÀÅúº9B-+¢ÊÍ >+ÒÉç<ÐüÿBóÇiÔ¦|©vl²îhy}üÜñZàU(àOC¸¸c¨E4ÝþïH0C 3 >+ôé,i@ =FÚô뢤IA8b½x ¶+ÄhXè§ç©EY#u©ÐY¹.®¿ëcî8 $-_/êã¾ía¿?åaËÿ$tWg×ÂV1xÿ·¹ü-c0Î.:ÇñÉZßè9ëývôÝb¤ÏßU>ÀUg¨H|ñ<`-¤ROÞ0j"H¼T_ħ¯Õèqðk©³¸7ªñà¾ËzlÂàäK#¢¯x^)À¦¸ >+ø¥*ÕYY»²d]x (?¨õ÷Q ©3JQ wî ªEB1 ÖÇÇÙÉ°;ÄYD$¢ìRD ñhcYhZ+ÏÏÄR,ÏP÷ B¸Ã/Ì s«bhî 5|äíÑ3g3iuG³ÏÄÚn--uEJjW:lxÙeä.°:÷DWDßÙ2Ùþs̹à7éUdÃRª>&©eÒQºØD¼lÉ7^Øk¹Ç\;/3¶;9¸9ø{×9æFêjìñ>6ºÛÀmÊ;%%û%ðæöøv^½\ó6ô\êésªSrÀ,Y n=HíÖËÊÚ<AÔàqãaUùS@n©O«ÓÓD35«Â UâurEV >+î3$0q®ÅAÝ\<#ëåt.2À^> ýiñ[|ôôiÔåpsf9³Ø{@úBãÇD¤¯0^º î{OÆ JÀÅõ'´(¸ÿÓ÷¤7r8)þçýøßkw÷·ñ©p¿o.çàúªìz¯ä^ßw/=÷Zï8SðZO\ö«Àþ Ë9æhaE×~` % ñxÏßÔÇýíd0ºÀ;:`Uý1ä¾Ø¬·"Tí10¦¤"ìP¢Uà÷<ð~sàÃæM¡È)IéPƺ|öÓq-ráFäدÁ~Û ÓÑ~;=/¹«ªÀ²zmÒ÷ Z¶¢)PK:µiд,{N jj\¬Å¨{s^§´'ÂBñ§oECoé/ÆEÂb"4ò^*Nøj-f° §Ç&oö`bÞÀuN=yl¼_æë*C¼Ò@$¸ö¡{-$ÉC±´>yøÚsìÛÜ$î >+1cyÞn Hߺ2sõÚ[^v eÆ ÓK¥±Ýx ¤:¨r½JìºtV©Pä«ä©KD:¨'Éiö#Ê©À·ÕpòaíIÌ¥#>"ÕçòNUÝ·ª©¨Mõå)^bjÌj¾¯iK!ÙÃR'[³EaHÉ)ü'Í36J¨§ÒºgýaW£[eÉw'A,£Ó±¤Ð[{VqcÖÖL¸½\õ´×KÐ'5ÜÆZ Má!4BQÚÕð{;²Î7¹X¿<£ÍòdJ¬ß3ó©ÏI\H SuE$ÐbÓ¶íéP5(¸%&w®¶#iIñuÆ-?èêIp&âKp¡}±pÁ*D0qÀÙõp§Å>,$Êû?ÝÁ?ηáÿyµ¹³ÿ\½;ÿÝÊGûîío·;ðov_n·¦u½jý?'hÈjLÏ/âþi¯ðìàÁÈsý¨zLÁã/eÚCÑEþÒ2{Ý æ ¾ÒsÐ6:R`c»Cþö[î ´]<gqqäÎ%çIÊÑÑ*®aB¤åäN ÂçÏ{«gT÷úDzð(OLSõ<Á{X®Ý±>5Pa÷£Õ×srXPúoi wðmð~]A*(/¨9w<ÿdkV¾0A¾¨£eüÔ-¿Ë5kñÒÊ´T,°Ìâ«Ó"诽ö(YÕFdAhHvo^l°|h >+°òÞ2ZèSíö¸2ÿÖ;ØÝç:ù©nÆhü÷àñãf.ÿçýwòßm|ÜønLÇ?¤oò9"àú:îÿ¯â~|.Ï Æ4?Ñ~ çDÍ|_|Ù hÝÑ}FFyHìuýÊ09£ÁÎ*¤öO:¥UªÍ¨Èiúa<ઠði*rÓ1`Ù#OèZ{ÅåÉRÜB4 ͱóº¢ýwítnj«mÍäÍEýbÏNΡêwP£¹+Ý10ÍÝþRÔm¥ã>¡Jÿxk±óÆJÏÉ@áÊÔÚVf¬ò¨ 6Kt `ÈR¹;zMI{| ÌmPñB#^\dS«e*ÄênÖÿ0Æî5Gâ1«¡ICx >+ÑYW`æ#f<}rýDdC þ¯&y¥SÝ»-5tJ¬¥ùúZ-²ÎQþF$Aåºö$W06P!ZíL~»¶Ð2Ö6U¦||¹â°#ìæ4`b¸tfzÅYc0pÐÎ.Wò|Õv4Vì²) RP-5²f1 Avhx¬°icâánภsÌ Ûû9±ÇâHôã »ãöoÐÒ&_!øl|óâ1+([Ý:oedÚàÆf8Sh¢±©P¡¯ùÑðÀ| ¯$Ç°k·Ò.À;MÑî®w¢à®nöhr%3eÉéÅñú¬åª²ËåÿI5Aþ_{×ÿ>||çÿ+þ·ýS{ï¨réúwºê >+í/1³©ô¾ñ`c5°1Z®nøüIüÇS'ê[WLòºÖìS"å´iÔ·#¦G³½;"Ùnµ¯ÉÑþPÚp4|ÎqBQÔ4g«w)ÆaÊñ¢_´KØÒ¾} ´ã¨ñÔ<?ÍÃ<zÑêX7"ÿðù§6=¼ö'9ÎK-gúoJÜ Vq{¬¼%ÞÂvÏ!}mñ´U7"½%·Äö,v×2ê,ðÛòÿÐþ¯$é[ÿÕ|ìÇÿQÛÿ]üß[ù¶,ÿ°®§¬Ârü)Í!þå>õï5¾6+$ÿ?xìÙÿ¯5Wßéÿoå3mXë`êÓâà\^cëëÞ¶æ§l©?H3þ6L?ñ7ͬ¿Q^*2,³öé{ÂγSÓû<?»"~ËÖÀN°(nå*}ªó0¢Ñh¨%j7Z >+Kð×ÅsøËÔ¤ª¿rÒA)H=´pº±ßsÛ9C¦ØaXú\3/¨F[´$ÚV?VeðÁú'éàdÀÍ0¯[~-¾oæKØGÍÂ@Ê%ãÁ)ëbäFWL±¨JèÔÛÔ3ü¹î5¨p~48\ø¦OM1eCÔ 8¹°±CB¸º±RËîrH~rJJ¸ËöÊjiS{X|]4óJÁì¾þ¢öÿä¿ÉÀDýßýG¾þO îöÿÛøª¬~Cl;DXx >+ñâLKÕ¢¢ãË4> í Ýþ`ÌEnÊ5*#4ëØ-éØ'z¡ áwhÛéj¡Etð.E«Â´ÓÆH&_CÆ;énöÏ#}ûiâ%OrCôÃ'ßãÓÀ»Qí¤ò0Wr¤¡ñôªý.¥¥±áüª» "Øm=í1xIÇeÏ8sõÚ4F¨7C.Ð7¥:¾&MÕc!Q嫦'Ó@ÅQ(CíT@Ó ¸gî GKòQÁà2Yb`g^þó*L¤ÖÛ0öÿrýÇÏýÿѦïÿÿhíáÝþ+Ûó4F|1¼çNuNGïyv÷û~k¦UË9Í(>÷¤~AÄpGwqÚMRñ¶õuú+ÝÞ½7>ëd;%ÜilvK]é7¯=ûÆ$Ëc `"ï3Bï?gíÃå vVKºõ è`M»þC(ð»X¶ítÙrö¡î÷»ï¢<?¡Èô"Ã@ >+§Ø³|L1b» 'RÿOÃt¸Â%Á I!stª¿ºéÍ14*{_n`ýR4²1´°õÍÍS ܹ(®÷×ìt¸>F°¸x¿§Êð.jåCìÉSåÁkÐf(Û®Q âxDëR6ë¿1ä¢v¨-Â"N"¾SÌÕ¢ÎJp¦Åø~}>ÂõN®â¦Ê I>XgXâ:V[_ßÞ=hoíþÔε«Ðð)>$É)Ðp¦D|Ö3KÀ@ý´O$ îY7¡èqª©ã1ð*4 É>ôk~]j)ÉAäUa9}¹è6Þ¹L-úáG»¾ >+$jw¯®â·A»~ÿ:ïY4v®n!ùÚ-BÐhV¿þÑæ÷²úQ|¨íð#§&ôÃtÜ; $ëéegOÑÂeü¿×\vûép!ªõºÔ¼Fa¼¨?¾<FÎÀ ;ÉøPY|iüþg±a1 ä*ä§Õnø*;__Dv!w6¾?þì³¥,oð V0P/D·º¿öëöæQ{»ãvLô<£8c}Û¤[ WÜǤ x8\Øm :0]úhEýuÈĹíýÃã¨y¨þ©}p¸»¿ìü¸³/1z_mþçþéû4¹RK©èýh{=úûE2A!¢OA·öÜ[7ri/£Á09ë~^hDpSæÇQ78j]rªp-pA½ÀÊßJ«û >+«jmj+ö_T3:üs>äQ?óÉ¡.Nö¯¾oiGI¶YyR7u2ê̱þWZÌÎxmÌ\?o DI I¯ÕHG8AwÉGÕD*àJ2ghÍËðtî]nÂ.÷§Ðã_õ:ÿ¨ãfÌ'êÿï?XõÏÿVïìoå£í_t6·~Öòwê >+_%ûÃi|ÜKrö§j¾Ú¡×=È1h<Rl®Ô#8¼¦":Ú!3[³2×#¶D/pf~1Æ·¦|ìlsD:OdBñ£¢ÜßNÞ«6é% >+zù¶ûAÐú±*iqY®ÖÂÖí Ãc¤³.5!b 3¦Í(ÒøÓ£ÕÜ\Íê÷Þ¼|Y`Sä#Ø´ÕaK !KôrMâ^bçNo5§9Ù^IÕ©#sÒìxÑiÉR.êá%_Á4KáFCEÙgjàìiQÃLî#ËѪ|±P¾Û`S>$å ÎX;_©¬?ZÜà¹mÍ|mI+Û©ÙÍ·f°ÿäýæáüÔ$úûÿ£Õ»ü¿·òûÿOê8°?uä§ékÞI¥{;[Ë̽°TpÏT»L.pl H8°éÀøHù ºò"q¾0`Fd "i¡D\ /àÔf©/{Þ¾w-äò[<àÁ3mqÝðoZ ®µ°W,Jؾ¸paB¸çíÛ9éÅ·fÿÀþ?LÎÏ·iÿ×Øÿ=ºóÿ¹ÝÙhÚÃ~?jõ"Sag3¹ý£î´? ¿:´¿oÿw§ýêõÑßĺSì¿VlM×JE µ¯Óü«Í£Ð®9®pIÕ¸AVUÿp[8ØÜû¾Í-Äø÷µ64ÃoD%)Hâ¤NT×vk¡^Ù(ÚÿÇÝ~×ã¹0ûD41Ðø|>J>×u(§:ãaoÿH>W¨zâlªþ´$~l vy®êÀæÉZûå ¬¿^«"ÈWqsoû6`\ºíÿºqïÁæý¹ÓÝç÷þîÿ7¤ûÏýÿÁÚ¯ÿøðþÝùÿV>úüOdÊ£ÿTþx§þÀá\زdaÌCÎz6s/é/ÀðK$ä$-H T£ bDýMmDú«ÚºõWÅû#PbFbpº@K$ÅÅÏÇ=%û$Ã$3mìµßq÷üb¤DOñð4ºG'IÕú©ª:§(<Å'£dÕe]]-£(/R >+?;§r`a±e¾jùÎ{bÅ6ñb²¦Nßînøwê Ê]5¯Ñdi©UX¸¢¨SÜ@EA¤¸jRߦ£JäÍA¶Ã¼»>´¦¥¶\@Su'ÉFj_©¾ð¯if7RÙÉ ùE§ +W¿(¡õÈgéÆ¿ý÷º§ô¬¼Ãj@¿é+||0UQZ¥µýAµd7Øþ R«6u÷Ïo]ûýáÍ´³Ùòª í¥£iè0ùû4$¬N¯h½,BñHÜrU{ÑS¤x´ÆÃUð¹í÷'S ßZ úûÉÿ47ÓG¹ü¿ººÖôãÿÜÙÿÜÖÇÿw_½~y¥3À4ÿÈç9Î:ìº*ý3rÚÜUت}Ö®þ}d=£$àVGå8ßS$#m:½ôLÝOZ UÖQØýâµÞÎiùFái3xÊ»`îB[b`üZt«æßñ!EæóîǤÏg(>»Ðæè¢`¾3zE¡sìaÉàÔ/¿¼J^'²è'°¸æòQ ZT8ÍÒ>XhcõHUñMÀøde6z÷|º_¢ø#$º¥ÛÓÙ?×ýtÑ=¹â/ÞüÛ¡ZI''j0gã¤ÂÅ~M£â´h o¿j¿zÑ>0½¥æühýjÌ ~P¼YK> ÝÈé,'KÏ·<4ç<å%ñoÂ4àQr(926@¨Çy ÈI°¸¿©©¼òÂñ.¤7zºË§ºxê£wÃ"Ây>è#Ä)C%Ⱥ÷!\Úì >+ÐïÁy]¾VÆfÑÄND¢z]î¹.Ó/ÖÕö1>XzÐ'eÎÉÏcÁäxµ|0{Îy® ÖþA¨:·ßÜÛUZA½ý£P 8Ô8lÿW¨¹D 7O7pÃü wÝg©õàÉ:rPt¹éã5!¸øÔ-ß?Qü>β±¢»ÝÞ#-ëÁ¬ðÃj¦QÜëEêutEÇÚfEjO½Sý+|ûs4ãK$+ î(¿R"Êñ¶·Í÷ 1^_OÒ³¬ÍfÁ2Ø{u¾WÙ,½±`D £Â´½vI5Wb·Mû¢VµJÙäøÈ÷"vⱸEǤXz5#ZõbPÀb¿&@BT´!h@.;ÿÚG`Þ^àr5±°Ï >++Za-ÀQªv{&7²îûð^Üà [Ëd\vZ±L;lÃWE¾8êuG£®ñþX<áóïãîÜýHÌ f¢=°þàÞ£¨ôÏGÙJ´{ãêk6È9¶tp¿Æ¢ªºhïìEª1u~âUÒëf£+ÎÚ¥ª é%ÔTýÜÆD>Τ¾1¼åiÖùóÏÅT«©½& OÐ[ÚÉhB !Bjy`ÂRò¤¥«öäkl"ÕPAzvÞûtT¼9*à!GKÜA½Û:È%Äìx¨sѤßI<Îp5BvxXø >+vO!||¦Ng¸B¨ÙɤÅã[ÔdQN/[äBé«{§Ñ}kØ¿ò' ÿÕñxnÌ´\ÿ»võÿñÑæýç|&aÊVç)ù<ð<"ÔA#Bîm({icz.Icto=ÚÝ{ýæ´) J¬Q83Eeç'¢Dòcòe³×K?©Æ¾R]¾HþópoG½ñÃ;È~Ó ÙwïáöæëøãxEÙ¸4ÊMñ){:Nx·¤}» ùØïöÿ¢ð8®jÏø8¨é@GqaÃã2ý(2Q04àÇÀN !¶råÚí^C$<tÕ rÎiª #%@Z)G°°¢ïÿ`"Ó,£j+UCeAÏ ø<Ú.¸Ïò©:ö~þW1(û-ÍîE%Õ"îh!ã£!ªö >+]4Qº'ü"Z¼3#l(tÓou7Ã8¦}Y";'Ã!ÆAÆ×£9àqt¹&[æ:$Ot¦¼¨F¡'ôwWç}2¢ð%t,ZÝXòÅÙÙ¼Äìq¬Û׿ø¬P9çôùÉ×+´ãþ¨Û£ ¹'ÄâE(qiÕ4Ò[OéPMÿtÃZÖ¯áS[AAJ$"ͽÈS%§·ËE¿òñ¥¼ðâ|üE Gf"N-`°´~eM ´q ÇÊúióåî6É&FnqFñ^@ùÓK¡;Kq4˺Ç=Íã&t´»G]é~9v5ÿjr,+d Iϧ.bXL½ä"c<C¶p¯:ØâÂøô9\apr îÕVÑ.$SÑQHÄF"åämï9ávÑxsqçpNT-8£È&¤»ÔÞÖhUZ+Ò¨>B®'¬ÅýS¦F(HH>²/Øe¦÷ähÒÐjÉWèÓÙpå¡s>òK© <Wg!Dt?¥mø(¬DjW°>% >+TÞ»#tÔG¨4¡ù(u°J]Ð4êXÎe©:ê÷Ò0õ¯ÓÁnÒf¥?(TÚð¡¯êì¯&òÆñ1d«Ò» "ô,ù$®¹fÝèôLÖÀÏ]È¡$ÚýSEí¹ØIÚ_ö)o®ºé1³QЯ»Ñá4æjlÔ$3>±nDVÒYûó@µPÞÎú¾?%øs}Æ Åå<ýÃèð; ÙïPÍ#;ó1b:¼#` ù+.¥óú`¡qt¥ÀØ*êFgÔKFn@½°ÈBbÿî2(ÏΨYÄþxÃ¥'Ì,ªPÛ¥Ç[«uztlWÁX{-ýcÁRÖN°nýûdôÄù;å÷Dø°¨sIå8c1ù\ñDQÊ<¿/zº?¤´É¦ÏQ|^ÖÕQ|î7tiouu÷"J qS>Áò%ÜþKLÛ£<Å%´ òN©Tx9Óq!/¼[Xµ¿ðnnÁoð¿ÆéH÷f:èñvfZHK¯¡¬n@ÓxX¶v,ì/¢ÀÝa-¦<=MÊ2~Ú½÷öÞëíÿØÞGo[âý¼2®ÎÂ&P+.·èe8òàílx!%j}¸Ü3;,¼¢8ÜO²Íë£ôE¢@LúÎÄa³(qZâãðBñÍ?^˨÷îQ_ >+Ð9¥Yå'AqÖ¿°Ë-N¹ëÁ ½7Ö&ï<$ÌO×E£(RÜööð:Dw¯gµ4?±77m >+GOÝL H½Ï|±}èGÁjÏS:n]r¾3î >+GaÕ¯Û/¢/I|ÑÀV©K!°á 1M©êò¶ÒÇ "C=Õ5ÛÄ¥EPÅÅPLÇ%aÃS³-È5¦7BO¢ÈÊC¿Þè5;ݪv3%^$½õh¯õéJÝ]XÔxñ·:6âc®Bwké°{Þíã©C½~Aû8yê¯{)4&¦Gý£CÐ-;Ç.§B»¬ÐÓfࢡgLÒ ô, êð|ay¡-<_ÀÇëõ9nr¹Ö:lªÿRÑs}-ä`öq@}aÔ'Ü RêT\!Ýãñ©§<ú@«NR´Ò¾¤c8»ep¡S@aÌíÑ`TnÍb ]µ[C|SúÄÙ¤"g#$¢t >+¼ KxÀyqD!&ï)<tÃt0ìÂ]Ù Kf0E}Ç/Èз¤ÙPÑÔÇà-FþWAâToéXv·oô©f[çôPl£öð¨55<xṳ=í¢Î,i:ÑôO\ùýSGu|çô*¢dp?¼&AW7">[bLnù¦¶¼Úp¬¯ïíïµu(8¢çäLºcs[Nz_wªØ¨rFáuê o«f ª >+¬Áºh< x^Quê¢n#Õà`9Ïz|5K @ù¿£8ùé@aFÆQòéÙA´|].?8ª ;9ߤf ¯ÆHfbEÓÑß^·#¸6t M[* >+¯JÑ1µZQ¼ÏtÍÈuÄ/wÒaͥݽíöÞQǰߣçÖ~Ïm,Ò´!xñrëG0UyG¯6_kªå5z×Y#Î×#Ȥëûa÷°qõA:»L:Û¡fnÖá>ªM²>@ >+nÒƵ#~æ¡ÃÔjmÓ:<û}¹I¨ BñH62>ù@NÒGU-ê¢yÆ >+3¤ Z¨°³°eòP 1× dÇÍ^"àtqôÁ\j)T³@ªG²z\5èh}ù,$G:f¡Æ¤$T (Nk|6ÈÑÌƯÄÛ4pNµ|=¯qò,Zä& íInAȬ°k >+[7"0 mÁIëhÝ©æ±ÒæKÑSÑ4?Ë>WIíÚ¹ZxjÐå0©*[PJT SKÌ>+«ÉÇ}Î(먩å$ >+E³åx&Eîx*±$ØTºùý¦dK²0·êj[õM³LHìòõ]\Ô îéE»kÚQ,gŪØûp%¡-«Ëf,L¹M1§=¾êÓ3F¿ãü¬÷â'´hºÅæ^p)¸;¶sòUÂu÷øÊk`v¢ÎÑïxUÑ;ÁPy#_Þ°K>Ç´×Yn7ÚfÌP$½ú¨ÝÊx|]îqÕ©¿îÒôôd#<)7ýqÈ.L (üzsz1/»Ì¸ÄD¡i ï ÚÇlá:Ö¨zyÝÉéoÖ·¼á,й2´? ébæ^XÍImluÂÒ`ÓªÔáì ÷ÈN)È8R`>²óãKó4êoäæ(êñâ_L:æ)|'å#S⸻ѺU.6Õ#ô>ÆÝh»¸ÍY0& @¹/äôv;8B³ 4©x&ëëýq¯×Ñv¥ù+Aë êÀfÑÔÖ£SþU~k{·»û)±ÿ¼±`ò6åò4ïòÞÎGûÿnmîíµ§þ=eµ?²ïÿÓn Ù'(Þ¹Eè<H\+Øx ~ÎÉÀûù0¹ ñÇ áqËÇ >+Ç&£%îè*4¸&om^Í58nd÷v÷ãóíLjJþ:ã Ø{iú!>¨]·½ånjt'^7´OÁ¸µÅ{Îé¨//Ì&W´¡¨¨ðB;`z_"%ª4"%5"J!.wx´yôæPA± dþÂ׿\ÖQXmM§ù >+N}_²Ò¤S'µIÞ7:5<kOõµ&Çg×·|Fm«Û>dè©E|¢ÍGm£¸k³î¼órÿg%¼üØ>Pãæ_ >+?øCÌݳ¨fc'm§¦§¯ÐÜÖ8=yîÙté7®1éåT>ãѨ{y ~Ë=#ù±ÎªÌÏ5½Ëð\ù@M0%×B/AmQ\MƲףâA\Mì+äEWQ/Ìèì_¿ïÖ`Ðó5KÑÔd5¡1¿÷wû U~Âb7î¡®ýY1®l६âæDcvóØ~ Õ]kØlÓK÷Wv3i«|á¼çã¬È% Ä"í`¨ yd¶ºÈi"îðe?è'Æ<ÜñSøgxwKs2Ó`:*cÿ´É^C}Wp2sTÖÖ×°Ç&R>öîcmg¹ÛÞhGï >+36vâ c|è=Ï7ãç.A:FsâYθM²c²WO<«*ñÆ·üÊ¡MbýÞ¡,_é¡ÞÀHx} Td=Hé²Å§Hæ¨j,ìFpIÞí¥zíxw¾oPKó.Å+çÛÜ£÷Ô, ÙFærI|Ãê* þ¼©iGGPÐ<ÎÇÃc%rï%h$>çv&¶ô ½Ë´òY9¦à¿õåîs£ó?lÞèøÖ<öÎÿÞÿoããúò´»§Ï_¨ïã9Ù+´ìÀÊ´´S],¡}ndð|wO¢x0 õ)Ûë¡ ÞiªKAz $\ÄY³¢vÕq3v-øn ív½÷¹B/O¡Ýã^Üÿàt¾¥Rm¼þ´a8ôÌF ùEÃ%vˤ«!cÐSÉ´[\|~LPNZqÂüYtÕtü1Ü9âÍk*0Od|á{ÙY:îî¥}kóô8ÂÄKâ¢CÑT¨q³´w >+êýÛØd¬Tøí5PÕMÛkÈòZ¨ï¦·Lƹ¡¯iû~lN«dð¸o+B$§Gø[_ïR¹;SìDDîÅ4TîÃÎénƱ(¶6Ø>\ì5ÐbôÕuòÛËDAZ`öG£&ÌôhÁòájÑDÐÀw6ßùéýSïnv¢´5M³ãv¤dî âx®«MpÚÕ >+»FßW?íËÐÖöæ¼a6] 5~8PÄÌ5§óØÞßêìîu,õró}ÙI1´Ö´I!ZnQ²i§ÔüèyT£èPgliïídJ.ê3.¨²E}·`Fùüjz®oÜÞ_}8Ø¢¿6Ä·LOANÀb-|g{zÌúÎÓQ¢CþÓ¥[j¾ý5`±.éâ«jTZz´j]_¤TñδôÌàV½v÷·0Ü"YáNnêñ)Oã˾U,ͪH[~é²#¤²ÚÄym ªø¶w®<â{·"IÏ[ÒÅ1^ê§HàÏ>2ÆÓ"ÂE:ã0#ËôTÅ#í~7íªnïïäVµ¥µbuȬkçUØ a`{ð;>vc±\1Ösr]õKBµ!ÃÊé:øá qCö\È!Ä<tåeA}+Ékéʪ¦Þ×Ö¼¼ ø¾4Óu}EmÝÃÉt[äÒE1}9¬0D²{yÎ=¤¿Ï>ÕÏö-piÆONz¢M0aÿÏmZÚdËõb@ÇSÒ·`}³~ÁtÖNJgSôÈû£e¸ËøsÍyÑðÛìºj2ÑB^rl¶¦Dû2/³OçÀÀÇV.ãxǧ0Ĩ°wåh!ÏüY×ò»b%GññnWXBzBËtÜíhóp7ÒöoíîïéÀMí¢IB°]o¯Ø]îS¬ívu|ic¤ >+^R4*<[N%ï$P2w-ôVKäÐY9²b ºGyð1ä$CÞ]ì§Â¸÷)þ±å/ÅZÞC7'88R<îyÝ$j¢&Á°nFéJrÙ¥@ Á/h翽¿wÔ¬³l·|ƨE£®äcO°¸ÝI'αPyå=ô}L¹kCêÒȪÅýÀìùÓ½´$kHÍ -@Hv;ugÏZ Úr´ÚP\¢¿ E<ìq"é)¾Cæ¯ ¶xéãù=½ËìÝÂîWOÜDrürjp~ä¾ÂilÝÜí#Ëßrç±_+åÛ&£ý=á¸ÒØWíbf£åÁ0 ¨Â´%[¶¨Èðò4j;jÕà!Zk¤±âEô¬ÞîF5ï^fºê$ªBoOsÇEßF¨àùöqáüª'öèP(ZVÙTyÆç'é¥v}ëåîëuÍ«cV~/WEéÍ¢µ"j z5~Ã=ÜËa¹QÛÒÃÓ5D¬{ÍÆáÑÁÝtÜÈtTÕüT8á⮵±`7ü¯Iþ´òû¿1`ÿ{ÿñãG¾ýïÃïîÿnã#íIÑuàéjþ¡sf¿s/;l±¸íDËö_A.`Ü0|åFôc»ýÍ-±ÜæÌUA0Rmö°A§~[DnUÄáâTÖ°9å ÖÖ_Þ=!nþÃZc`z¤cä Zkª¯RcÞ4XÄuü >+'¶ÞM /bQ¦jõÃÕ¦ÖÐúýÆBÎÅ`chr¹î¯ÞVA*|ʲZ%ÈòtñÈ >+¶ã¥>NX©%pÀG>ãøLà ± Ø^²6"AM©N ´r[%ÐBnÞ3¥TE8Ë¡ç&¾hL_T@òÙSh<MzÝn:v4g°~-°z:Ä >+"¨"\Ó58)¢ùG5ÍapðÊ/äÉ¡ðï`ÌVjMTÕôS:Wâú¢-&ô÷JMÎzòôÝÕ=9¦ÒѺrtTã`=!O`Bzxâ!¸B°@íϨµÔÿ²¾ÈöÀª¦pá;}DÉ{ÁØÈ`î¯Æ ÆAêÐ-¨JSÐÃrȽêy»Ú[N8»§:/ªqáÄϦIU´*4 1 L¬[»®ÔK²1Î(ðáæ -×58Ìñ®nÓ¶õ%ßq¡ü7Ïo+þsíÑZNþ{Ð\½ÿnã3ÁÎ+ ÛT5ý >+9&ùîdÕò¹£cðÙdIWtÉæôl`3HÊ»lïþz&d°S¿SÀn|AÌÂ¥¶R÷æ<w_®Ã}¸÷¤ÿ¹Y|s°ºWÄ+ا&ë(¯Í¦í¯oµPS^nïmwöw@ò~±y´ûªs´ù½' ¡Ðè±'`oóGSâ ¾]ðº.vÓ!ë-¦8¼*¬\àÆß±ÄÒÖîîv:?lîm¿lØèmê9½3Pf桧ÐÔ¹·w3a"æ=lc¶a]¾²©'ý{@] EPNXã³³îç),äÚ >+åÊCѱ`SѦ½oý¾óóîѽýÎáÝÿöèi<ݪ|Éþ[þ߫ͼþ§ùàÎÿûV>RÿLnzåÏÕþdR5Ï´ÂNëöݲ6,6pf:¿5õÞ}®û)âÿèqC'À ùß>¼ÿÐçÿ®ÝñÿÛøÜBþ·RÏ"4½O3â²Á\q7ðûÒ2tÿAª/¬ý0eÃY÷D»cãXìÄóî§Q\ª©ÒÖ=#T"ÕF®HøP°L©âÿæ¼HH1,ä? >+[)°Á$&Ìd:`U:a ÓäÜP^7 ´ôA]Ìwp®6Úºíï=Á¶wÚ[G»?µ½ÈbMªêê!jf¢ÿ©àþ°$,?>Ô^òLâE'ÖÏk¦0-C0ÿlw*ÔÕ-ePÊú[PìºyÈ$¤£«Jóº0Á<*qßGÐýÌ=,ñ p8ýdãÂ<Ï[Û(¥ð@ÙÜhuø]D¢ÓþÿÁgbЫ¸,®¹*ÔϸÜü½%ûÜ]a<>pIÂPÎ l¬î¼ ¹ÃãÆ0èQcüAÌ&²BhØ"ìyþò:}Ë$Ë£¿6. >+}tdý9F ë¹ î³n"þð($ ¢W·ecíÐ:Ðíìmñ¹+®-ªäsn¼pZ){h2(ØDÊ(Ïh0êUde8?$6é_¢ø#&ßH{)ç gÏ]L\Æ)<4ntV£ÌÔèÆx >+7À.sf9,6_¾ñ·IÒ~iÛp:hqÒ¯WÙ÷9ìuÈ{ÆF¢kóî8nF+{EyÛ@K³ÏL%Dñ.#r6iAåj*°lÓ- Ì¥W´0¬áÿªÏrÄïÉÑ}ß29ü-?¥6¦PhNeÄ!9©Çɬ#=Nî¡ÙðDNÏ@)80BnWsæ.ÜGfLLÝÍæñ}]:ÑÏ\3{?PÆï¿O1ñb0ùÿ1 N9R±ëºB ¢MôAùô¨g2 >+è¨OõT¦,ÎÙÜìÇ6OØ43¦ùöWA\è(äå$ÇÂ#¸ñQô³mMº?òßeÕÈ󳡻BóË1½lHx¼6;¤² Pºøö,Á®¦M8rÛ=äRj-Jæ"Ùúè.×NÇý~ªÃ_À;_DËö7I.3ÈPDl¹¬ñ5Bþ®¡` >+ÇûUi¼ÈK©ü >+d»ö¸¼¥[ËkÐzUb·ëF wnäÈt!Ò÷B×È6Ö¨ÃÙ}ÂÙM¡i oîJ¹ÂÙn®¶4ª®²p×ÆðO|8V»2¾Hwk¸¨ktï o&§A½a6¬4hÂ>ÙÔÛ( ¢nèpÿUûèݽïYúSßÓ Å³ùrwó°³·ÆÃoPïö¶~Ø?°/ °ÜÂLg73Ö Äª§ «¯¸¶%Á8`7¾´Í':ã*Fuû¼t£ú'¶ÄKEj3¥q¹ìòÒÑm Ùv¾Õ >+(6¿Ï©^ÞFLÒÁDÓ0J[g¡¢Àôoz¥9;ÚBª3H¬ª*ª/¶Ìò·:äsâÒ·oÔ½5æÛbï8g £Í8+5ÞÞþ^çðu{kwgwË9lMÑÆa{ko{óàol[eÚ)(ÿú`÷W÷@ÌÆPñ[{×zh8V@,¿-´{ÛÎL£UÄÍWím9ã[¾2E4ÖÐ >+uµæ¯´g,Eã7ϹÔÈyè%ãUíC~lmÎ >+ñºÞ:¨yBØp®¢%ïv¢.ûEoÉ1üx!ª{/µöPt"DX¿·Ç8úRçË Ù>¬UpÏýAäòãÈÇ! q&È$ì\ÿL«3á0òx¯EV"µÁË"¿+;ù\ué¢M"ä_A;£\Ë >*á h8 ãI?êözÉ9d¾ß}§³ïÒ[°»Üe< ï¾ò` r*¼Ñ½~¹i >+îñ6a9/ñCÌÄï<kðøþ4)xÞµg:ø¥pV{Äã,²£$WÓwãMTÕ'Ã!gfè3U×R25þÌaï-}&`P3àb{ga¡.àÍð?îè9E`¯±/*ÛÙÉ!@"Íc:è¢Zà~õlþîÍg¾³Ó^c»åÔR >+ØATYøz¨Èô®q1Xà \Ýè"Ø(1ÙU$~¾Õ>9#%D-?µP¯¬ØH»zÉbü2X;h`õÚ3©Íjäã&åtP21®#Rùu?ÝÕY÷|<¤|ÖÅnê¼Ôë>{°çÓûQéKùÙäoÙªxè7ËݱÆ"¨¶ðë0Ê x»ÎCêCû/kÝú;ç&\Î >+1ßI4³âuïäo¡oÞ$_¦"é>k¶ºOûîÒRBO_Z¶"p¡vÎ$\|9\Ü`¦<aìw¥9ÌÉ ÔrÍ +iÿ§}°Ï¡×`¿ÇÐÊ@´N@9ª:jÉ·YÇïGs=Çè¨ÍQȨ >+5Ì$£EûBñ¶Éá'Û J¬Bð(¡t >+-&fJ6@è+ërt§-õÐKe_ « sbrù¸Eb>º8ÞÙdC{«¸d±ôÌ;Ä`û广QWÚÍ'7ª x~`o'& >+7' «¾ÎÓ~_gŶ§H£ MÔ6Þ*·t¿óÆûZ²ÿNFp»5ÿ×üüVwùnåcüÚGG»{ÓûÿLWííÿs\¦Ã/2#[oãûªtð2fi<¤Å¶¥ÄëóäE¬wæÞ(Q bê>û¼x9ÚðªøÉé)Dl¹ì|¤»a8üF(Cå3ÐaqJ=0úèFÃèi¼ ØÀ8CØÑ<ݶ"{D9"쪳¿çÊO6æ#%vòO¡¸WÅJí++ãÜ"]Ô#' ÏÃÊÇîp4V»ìo¹;ºÍ?Éæ¯g]¨Û09ïkI¡Qs8Øõ¤\ÜzM`.bng1P·uGå¿"$[äªaqS`ü<?å =³²Es1,æIÇi¢å¾íè)-À5ÉjÑdÊ´Í«Ã\J£_*Ñ÷'D ç5'Ù:÷5kºÔ¼ÜBK;=çi%SÄB8£(£LÓëoùÇÑI/Ák:y$Î%?¤ÙÔÓW7&pðbÚé0Pë±tt=SÂÓßÊqrÞ ÝÑlþe9êº÷4é©sJ´Ø¥D~¹òpA0ð·jMY_Þ0Æì*Pó̬#¯cá°à_*d!cý«¥Þë~ð©9R$Õ=ïS bùô³3%H«£Xú©³î GBó ù²æ æ¿^dÖ6jϧ¦íExcHÌ_n ªUyÅeC/$1äzËíÀ!@nqÜrsIö<ÊÁ[÷Q1&o:Aç[u?!ùOSêv;þÍG«yÿÏ»ø·òùýü?"¯UÃê»øZ!í¬ZºëþßC$AXYkDZ+MÚXú=5Ií¢§¶pÙ¼¶ÆÔ <¹íè8[짣EP7ët oQqú|Jr¹:ç@tÉýéÁgÍÈ09#P(Iz!îtAô}y²|£Í4Ä<â-®§ÇO5õ/Q×ZãÙJ`àåÕ⢥Y7Î4£à¼ëÓëV>[e55%Ù¦gèBѶBbj3ð"ÛQÞé¬VJg"/ÈdmïtøæÉP zR4YÈ >+î×àÂ6ɯUø¦fê±bMDï,!j¨Å\¬ÆRôôc>"K³vÊ̺iCqâ5mÍã09ÉyÉDÈí°å6Ò¹Ýb¾>ù»g¼°m«ç¬@ÇDÆòÚOqha*ßÜ-V1ÑYr+¥M5Æ5 W°y*m ukJ1ä|b±bÊàP[?»Ãx¨+ÃÕî¹Á¸ ´j[4¢/gÄ£BÖòfïǽý÷Z¶æ'ª¨Ó=En(g(oö~jìî춷s×1x+¡ó¯ÕàrfÜÿfø]Åø{{@ÞË á!þySÏÎërH]5:÷®ª:DóbzßTÇËxÔ=˵gërÄ,Åwû9.ãÓuÀ«êò·W÷çÃøX-¯£´"`b²`ÖgùÎ ìÞÅ#·®9\§;Vb/1ë§}%ð>M5<¡D EA >+,°_É:ÔÒËR¸²ø)dGT`Åg¶9Ïil9KLÑÌÐtO ûtÔÌ:T2ÝÜ0Cs1cÜaPÄó.è¸BtO11°éG«p^1·µ"w ¸¿ÉU 5@=ÍI)èkík±÷ÉÁ´XQktÄÁ¢uÍHrhPÛÐæéÓîvÜBPË»ùpòØB:) ý[hw÷æ<ÿiÙizBi®¯ÿéÁãû«îù¹úàÑÝùÿ6>âüïM»s¦ç+öQ"u^êøDY¦à£¥È?o8¥2!¬ÈÊ©)lØ(ûè$vSù$î§Ãîè"]¬5·Ó²øÃó Æür>b(|µf6eóEÞêpÉÿU²íeÇ©Ò ¼2x?¼ã¥÷ìº%t9øó`˪m¼$¶9~:Ë&ô¢,@4_ÝX!NJì[ÅÀñ%Ssxñq»«µFèBh"~ñÞgpÁÍiBï<-PÐÕî¬hSNPpsDÙ%[0è¢Qö¶²ß×0ÖÈöGvÅ+Æ"dÆØÈA >+`ä(·Êã£ø±yô¦©KÈ_JÁ%à>GÀí¥§IÍA .:°¹&lÿPÇý/9f³ h÷Îï¢nß«¢Q 2bÀñM$ 'í«Ñb7[ÄSvu»½îè? RèèakoÜë²úÔ 8¿½Á³º:Ûjó-i»¤; 'Ùº.q<Ç_à7éE±D~8`7ȺFI| hü7Q >+[2÷|.?j*Jæé.Ð!¸0¶Ü!÷ÙGÆ\m,èä¹Ó@^¦éñù!=ʵLWÂææÊ_yøa¨cì¡ ¾À#¤ç×C¸gu?W%üZ/D¾±Ã]X[ÒÙ.Ki¦æùîA©¹¾É9?ï\ôCHY<ùR£Hÿ¶ :~Ú_¶aãó¦8Cý%Ã#ôñ¢çÑÜì\´*Ø(R²Zöѱ",ôßAûð]²MÅ5%3w̶[¯1àuÿ¥%²óÐËö`A >+ 9Yì"BA NçnPl-Ä}-ùû8é$øĪW¿.`EÍZFP:¬`îû ü«ü0ó*å^E@ÿØþA8JZ8TÌÆ`8OA³Ê±1Ã6ãynyãûd´5ÚÇù|SÝg&pI 0-6ÊÑQNý;9£IÚÂí×åAVQyEÍÍU1-W3<®"n0, îYnâ/J¬É%¼ÀüÌ¥áÕÏ 1uLhGOU$§i"Ò\ «`ÄK]þZp à-hhôà] Ê}H!Ûr_.G &/Âh<¸o³ýÝÏf¹$Qì,ñÞÊà¦Ú~À¹Ä¡¥H¨tï&É0aø0?ÚóuéëÍ °]UÞ¹7*Bܯ¿F /àÈk$æ|qÁÅôtÕü)e§0+.@Óé` >+¸þ£Þnq-¢ëj]R$ÝDZºL 6h¥ ¬¨&(¹ ÕuÇx£ÁnP?B2â³(ýV0%#e xè "æ´v±[ p;¹ù²GFËÑ1ìÓ¾WI4-ìr È× >+Q7sÂÊ/Zø6àa½pjܸ#;uæ÷ÜÔbòZë\¬Ëä´o#¤X©[ >+)y¹±L>ɵC¯ÜÈÙ\oÄìÊUQ߯ü³"Ó½®;Ù¨ê\ýîbäÖX±1ø¦X¤&»PÂÙ ,é¸W]ÞÎ8ÊEÝÕô;ÞcèC°IûË ;ÕËz8eý #NÀ¨© 7l;)j)"46 _MO,ßbt×Öx¡UÖþ¸ÃqÌÁ>&ÊR²¶ÀZn§´5Qê+%þ<øϺtÆu¢sx«Î`yR3\¹MØTMëHÏ^#³áeSVÛ@ñ6{R´ä¿xMü7SKt(~.ÄÝaP[Ʊ À9i_Û.Ä5f03¯³9áxO¸¢±RµàÙÁµ¨ÇE~nzìãVɶ%&£ò{nAN9üHñǯ@n79=Þ½*OÙ÷ >+ÀÍàAqbº`´w8Mâ^FçàJShâ_ÜëÞyyÑÐÍëk >+;¸ÐÁ3Ñ)E.qÓÿ*àóïÑæ÷ë.<« sθNQ >+Ì¥ùº\_ÁÈ:æ`,@û:ñxl`ðQÉ« T-érø÷êÍË£Ý×/Û¾ûP¥ Øí¥6ZßCóó#ð§ûë´ÎªÙî$8ÍÑO54*WDMµÁ¡Òä¼m<æ_KÖ>äìµKF;¡§ëÆâ<s«ÇĪ ¾³·Pó½ÁÒ0ç câ{jû½<ÀÒ*\ÐqþÀ³nÿǧçÞËè^2¥þd²Ï.ÓWDADÝcU°ÿ½v þ¿÷¬ùþ¿5ïßÙÿÞÆÇÄÿÙÝûþe{{ëõæÁaû`ê8@W«þGdmiA6{JÒ?UÇ@¼¡e²ª;>vÆ-óìøö[£$8fKÕ<¹Îü`KçgâqÖ*M®g> /oÁ¼¸ûV7(n¹1kDíI¨ÌtE*7±-·Jes >+¯^Õß<³!ø¦«RAÍéÕ¨vÌ.¬Tét%q¿åÔ ²n"IϺTRQJjÉ:×\¦I/=#áAüòâ/pÂÐ<õøÉFÀcîkQ|Nf¨¶ßàÔ?صEOîó¶\mGúÖûñmBò:ÎÜTð$ÿÝo>ztßÿ²öðÎÿëV>ÂÓ¦ÝQºiÎÊwÑ#È$×íöÑÖÃÝÿi©0ÿ*Zk>xb)#=v66ÿ%jÑfT°ÿHÒ³Úfý;þ¶¨¾«Ó_¥½·Í5ÔûhÉmJÕ°l½î´_¿ÜÜj¿¨Ëwsë¨}Õwvv¶ë!A+é/£7£³ÝþhBX=T¹»YÂðñèì8é¯ß÷×àÉZîIzyß{&~®>Êý²Ý^îÉê#zæöÕËõå¼"âçN÷rà·ê>ÂFÕ£ûN5'>(OôwôãXb!f¼%ÜÍ{ñÂ|ÛÑßÚæÛNÛ|3Ï6³nWÿØÇkþñ*þ̽C(îIDé!:]a£pßZ A'ìÚLÌtûõ´óô¾QSûâp¬^¹ï-ò¼ë¾1äWÔÜÁäTÔ{ø!¯`s£y¢âÃõÄ&É À]ÙL ¨üÃü"ÙÛ÷op4M(É T\A2¡úOvü'íÜEÀþ\"hù©ZE¿8Ìðª=¡µ+X¹tÔµ+8í|m8ÐhÖ7%4WzÓ-¦q=Yö=U;4¿&*s"nnûP~:oûÉÍWroz¬ÈpZ¶Bl×Géïù$Ðmv? Ûîþ >+ºí'ñò»¯¸î?í|}c >+¤5)EÜÞ|Ý*ü Ò-fPb¡öMÿ<mAæRVK²Z~ÕR«Uµ*äRO Õñª÷·9á/ÕèÔÏÖ¦ü_u÷ùYÑßfÁsøªÛxÀÏ&ýmz¿á«nÃÇCÕ¿7ÑFUú¸N§j£>¦ËMÐÇ?˼ÜÄXhyÒßè >+´îÿO¢«¬Ûªcc¹î¼ å´o|ókÿ'U_ú£G\+È+3ÆÝQÅÖ×A·îþªÎÕ¯Åã6jº$Úr5µYóðyñùÅçÝòÝûnG¼k»ïÚòÝNÛy·ÓïÜz;;rÀdÌÛt¯¾?Åõü q_1UØøjg·85EO6Oÿwjã>¤EHN£^Ú?WoÕö¤`QHÜ9VØ÷_@ƳOݹ(æÄ*©FOÚ ãjÕ¨¯öy« ¥Ë8Ã^T;GQÍTÁDÔXGMyGáwôênÔä§Ù ¡üѽ¡ÇÍc·hmT¯»8ÄûËÿ0ÄoúÝô4ÙRÿ©¢d¢ÛS¸r¦î磿Ä1ËÏpóñqÀèQJÑlþÑüî¦eéG¼ô@ýÞÉfÎÞ,«2ªÓ^_ªf,jÛ!Z¦Ó'MS÷ï" < 5Ū6y[Ö6*5¢xâ#KTRjµ´«U¸ªÒb«kz»L PÛÈêJmÿNb <&úëpëyJ9 Èð}ø£F`³¹ì^C¬~HyÑùEù6ö¾Þ°bßVÜüw{`0) >+Wo2ÕnSÛË[ôÐvvèAh¸6k`Li±°ÃèÄr>N²l@·Ë¬òøz¸cÜ+õòÅþ+ñ÷¿¬DÑ!#Ox¼4tÌ'J©óxr_ôÔ]\¡<¯²Ø>ñÐòöÁ{´D²¸í6tNë7®îÿûÏBxUE qP+Íßð`é÷7Â-\5ØÉg0ÎÒÒ{ÌÑ/sÂÂþò,'7(~äÔ¡q(:ä¡®#î·ºÕ÷¢¨ç»ÌÖç½p¥³®2Ó`e"Æ¡(Ûù§ ³ùpÅ4}ÆÓ¨*|½'+wÝúKÔ©>J;ô|¿ç.bsèÉ×ÈËILX@MúÄKz:LÀvÃwY!¹Âð°°üq¨üqQyPóäÊÃÃÂòöá¡(oÌöKÆX:PË{$£T±Ëc¦È,2z½}9ë x£+ýºÂ!ª]vÄдû2 ³uûr ¨ÿ¶ù^Û{ë*&¿Üìºú¼ Óô´F¢³ÈíIvÔì >+-9UöHiCòô¸óÙdÃgÃôb@}ôK "wñ)oÈsX 5¹°WÀæéǸlCN» >+§Ä KKl1e³U¿ë/?-QR³TýÄBªÍV<ärÅc^è/È éÕ-c+ÊÑ#g«çS´+pXH^&Y2üÔÈ#M)2&.Îã¡vx@IlçS¼q(Ò¤»`A¤A±±×¹ZíÒ Ñ©Y;òÝ tò5QèYU ëI-Zô(!éÈ"` ÓQÃpÖº4ÁvÖï$8PU=~ªv¯æÌ7!VH:G>Ü@ÙíWËü0Y[}TTð¸ZAbÅ¢àýµ¢ÇåE¤Ì}®ä0ÖÄöº¬çæÓ²> >+òEð¨"0§r:Ýcêq9öÏ£_tbbá>´y >+4K9» |ÂÔüÉPA½]³"âîy»òaMìxfçGÏ£f´R >+¬Ü|$½[ ¾ã Ä3Á.;¢R7õ{Ô <Q;hJkFÿ725[â´ >+éâ?oo5°ù8اAE:ç{TSgôz)V+ζ²²2>Wç£OC@{:¤Ã÷ª1ݳ4ñ/ò°JÐ>q à%´êqöÓBjÝóõÛ¶ØÞí,?AõB°ê:Pר3$ïFµV˲£RR)'BrÑM_·¡Èþòyyï¯HÓ£7u¬§D-=ã (Ó1øȬ¬ ú(BkCQ´=¾¨Ç5áTHK ¨±rÈ5m'mkb >+¶úHõ»#}rÆû¤h¼zÀ¿-κàÂa[-Ñ¡ÐAÓ˵*H+=Ê`Ò0qUH(ñæJÓA~TB«ð§»L´ ;tc'r_ ÐMØè þÒKÕjD§Ý¨Næ ÷I*QbµÙ2íî²i²mÌ!]í×gzæ©Áºmb³rq¥/j>Ë®»ôL«ÕÄÎ>3Åx:ëEdF/ÆggÉ°ælkÑ×sË0Q 'ÃúiÕÁ5]»pwH½Õ:)"óÔM@³aõÞXWÏ¢E_Ñ OÕS#|ZE `+Ô4¤åLIÈýÀsà¬7Æåõ@Rc¤¹qÑÐxIèQ¨éG½ëÓ¬AöPøR¦ãÒèväÜ;¡mM'Fø67¥¥÷ä9@åô²?ú§ÉgÞ>Ð÷þ÷à²mô¡xuvnWñÙ}È4ÒQØ-RÔÏ:'èòJmëæë¯!¡i±°øÝýkIv3,# VêÏÓèA+ZZêÊ+`SOZ3ùPç-o»ïߧ`#=»«}ý®íöm>ü¿ª®ÿÏÃÇk«wþ?·ñ1þßGíÍWS»}OUëÏáí]äÐmK ¶Åñ£ÌSjÒ»oU7\_«r׫§jGÚxüØG¶ >+®ÙgÃ.(&d5¸ª8TgªR·ävJE1rï &Y0¨ÌÛYý*úEÌ >+Á z >+Å7j£nVoEÈ,q»Úå~hô{RYhð·N£¤Sì{à&st{aj~n>héì&^`Â<ø¤l£òÐå|-ÈÙ#Ã%á¥-ªã¦×TÇ{dpÄ~òÊ_ĬðF÷¬-þû²94f¢cmÀnTy_ÿÊøTÂÛ*L¡®#!9ÝIÕÙã >+¾Ôvå$EÆAa[#UfXVT1QÒÂ#Á¨6G¾ÞԬݪ)S¦5´Rç ^Z[èó]àôÐb)HãdÍù>ãDá'ÚµÓÑk5sKc¯^ºæÛrÔ%(èÒEoD]mÀÞ»(vÝó˧Ú÷¾õ_ö)ÿ`Æ2dÿ×'Èk}ÿï5x|'ÿÝÆÇÿ@ÿu¸ÿæ`«}5IpúúnÐ >+~d4+lù1s¼×úã7VZ«YVlAiY _G¿|Ô}¬Å¿²Qfú·Ó ~åôõ[®3|Q&âaÞ¾}ÏV³9¦n >¨òv¢Ta~¦5¢fC¶É%Va¸qVä4-¯áy3òóaºfxÎ(*¥V4(â«=Ún~k wfË Ñ·-ત[{Øs®>ÑÚÑ嬩6¢ î·yï-hsÑÀX+Ãý÷¬àÒF¸úô5$LÏò¾5Ëw>áý_nhïϤýM=ôâÿ>|p·ÿßÆGìÿ»{ß_yïºîy߯¶««5T¶«;¯ã¸¨Ö_#ü¡äá£!lé´ýÂIß4äæ_¶Ëʽ9ÝSnöË+mÁoåÆûþ¦7^M /]gäçö«l »½K-Ø?rIÏàC*öø%54¶ÑжVdÐáhtcÚzæÎ ÛëØñ÷"äI§8ûVÛ¦ $§bÑ'§í >+Ìã[3Í?Ñ'°ÿcDóþöo÷õÖ¿ÿyxÿîü+{ iwî3läG÷9 w¹jÏKÞåÄi¡¬»äQ|¾¾5óÙAÕNvÿOýíu{£Æ£¸®9·ÍN/6v_QFbN.sn³ékÒùú`÷ÕæÁß:?lîm¿lOW÷°½µ¿·}ÕÚ{¯ÚÛNÍ`ªê¶ ih.éÊ<Ôîþ^çðu{kwgwËËÎì&m¦é«al-i°*ÑÄðø¥{§#Þuì8gK >+â4Ð(Ø(òkmnvvq¯¹ð$Ul0Øb~⪧Úâ9^ÂÐæ'¬äö·÷TÝjÓÉAæq.ãþ¨{PD´Qc Æ(¢2¼i`J"È7§íî¶ß?ѧ`ÿ¿9ã¸ÿ«-ÿ±¿ÿ¯>¾;ÿßÊGÿ6¿öØ?E?Þi¿ d?ßQ\ô}±âm zlx{]#·Y5ͦál3hª§³Ûd*«sv6ójû¸n À·° ¬a60ÿ7¡|ëåð/÷ ñïo®Iökrüÿá»øß·ò1üÿÇöÞÔ;À4þx{@5Û¾ ¡^.·ËGÕc:kó|Và4±¨ç¶wÚ[G»?µçøsò«Ûí½múA¹ª!k½(á¥v÷Kz9á§|DéæõÚw³¾{åLS2¨÷dkÿÕëÍ-YSôøc¿`®IúJy°øûËÝÍCúªvúr¸µùró`ÎÄij{µzq¦7e÷ÑÃèHu±»Ýv÷øË=E¨jmoG¸Ëz[¸´ 7ób~©âwoVÄ35¯[±& ~ð·;!öÛ²·LîO}hûRSq&ðM} yÀojðïë»JRÁ¹À ¸È3ÚÏ@Mèvf8'^ÍÈÞÄ&<éÔ×ÑdÕpê Raq¸ÛL*ØÀVíÕºâzKµ¢QC'ïÕx¤ûwD*}õêksA¿7b]×æÖ£9t®óµ:à%î\µ ·¸Tñ°åñ×;Í;³j¨û^ªõS2ÂDD0Á[¾gL\}iÏ@¯E2ËFD]³'¢?$N³y|ëmòOû ÈàÅ7ìw>ÇãnO F׺ ÿ5>òìÿVîä¿[ùDö1èÛ$§¨|ÆÈ>E[|e¿Zûg`hl2¸Q·ùjDX浼ʳ®;ÏÅãºjõL/oNr°S uÀGÏéà$8Nj±:wém'ÙòA07l²\;UöÞ¼|Éïgàß »vUúT\ÿz"¯Ä&¬ÿM?ÿçÚÚ;ÿ¯Ûù\iÝ®X_¼»?ÕQn¸£D ÝEzÕ«sò|v;óMçAÖ«8È@q >+µúÈ«]1è^\Ö$ú)kε|iæ¹®ãe飮U!hරkÞø:yÀ½n]aÄÉÙYrjÆ£s >+«ñÞAàìÐiXªd %¶ázÕ1Ľ¸bRB'Ób¤q(HI¨or¢L áàæXsyÓ®Óxbä «c.à¸uÊP1ò<úxh½3ãSs×4³*®¦@EÒaûãÑ/qL²¤#_ØBÀSÆòâùÒmWôU<¸é¨77S`8ø1ù"gÍ>Q}[!ä&&SGõ¼ê >+ØBå_\¢|Òsó`È c18<Î9ªÅÍýêplå"^d '' b"ª%8ª °º6S¢ÔîºÉ ËûZ(å @ãNÑ !â¡j?QIe Õh- ëf°<Tά"ó<wÝ.vaÔl?rõ¹ø,Y¹ãWÒAÈ×ÐùB5$ýÓ£ôÿ·÷õOmIÃ÷+ü?U1à* s ANxá$OR-ÒÊìY_§]ó¤|û;Ý=ß;ûᢻíÎôôôÌôt÷ôtË=@Ç-9¾¡,|JêNsô¿W/_¼°õ¿7/úß"qþ÷ýùþÙï.[çûûgíâ)³Åià@<¾³Aó2È ¼ÒûþÄ< äè.k®¹Ñ(ÛàFr/ìÆ%-s..©¸Ld n©x-ÍÅ÷nqöGÝZ}îJæ<¯¡6§ø°¡ïø5ØëúÆIo°ö?Æ3@ÀéHØêÜr:Û¹Q$©ã±Æ·,(ÄÂQZK MWÝ¢:¿³ò=*ÛÍÔÞÎK]u÷HWÓqúål^¨,zË(N*#®¸d¤â´oM.Ë+2P5ê6=ëSÍRvë¼[² ¦®ÝB)Aµ5ÓÈ&*ó¹Öë5) ë4wÓ 9Yº*É&ù?¶TÞ4ß'49Y¯q1Ü¢½^B²[½oj+ÖÏÓá%ÍíÃ?F dÜ»&÷A/à³YÔ±CÆ¥w¸{ü ë6¿R¥äTÔlÇPh¨8ݦOSóµAuíSÞ«U/£wjÕ²4CÔwÃá;È-Q=®Çÿ¹Xñ\JóhäþׯÓÏA^6ýÿvv^¼þ÷zç=qù?oüi]ßÍ4÷üÿÍk;þÏåý¿ <Bÿ#®²*_¹Z]ËK»òoÊäÁ%6Ʀðï;%h´{Ò=qcß+GÐ9Þú¿ >+Gþôö^×ÿ«ÛþÃÖÿòþÏB±þßí_´v^]ÿåj=æõ_Æ£´ å1ÙA\çw~켪¹2®¤#æGS¢Ö¬ÞalhÁ":«óÉðó5×Fu«<ô±Gf£ñ kíh7ÔðFݪ+OÖKí_'ÙÁN¢,hÊêÉ?(Òt1`7=UÝF$YWüC#&j:ÐÔgA_#ðçÜ¢ ZþzStÃãôY±æM¯#ý >+©A·¿Ã#z >+àD3Q½UÙ]§ÒÉ £("óL¤6L >+xOMboxk¬ F*D³"n¬©EV²HâÐYÔ ¥ÎN¾MÆo£µÂJD°Ñ¡êkOSH@>àöÀF`êÓ÷zrdhÖá}ð¦£{În³¶hâ)ý£Ö]5Üíº±;HÍ:ÃZú:į»]$»?ßVå(¼k²HÊ0}W|£¡C0Àæ±Ú²,R¬f夽É0ìÍdWÂÔeåvñXÏ<<ù_*Ý¥Òöÿö <yãßî?þ3s+þãë×Kÿï <Bÿ;<>.«ü¨òø4?¸ v0ùe0ßöLWq÷3ä#¤dsþ¨çO{Þù¼î4ðc(;ô»ÓqäÝ\Ýköãsà_ö c2èÇ°NàìßÛ¼~8"L¼2¡ >+(âO!¶îpÂ>öTV6X ¶@;ÏNÏÛ7º^1ASõ§!éÝ$°¼`t= zäÛ» >+ôjþèÉ*ã1JbnwIQI¤6qØ_Ðo(;fíLE Öíq$b/ò> ¥ëÃ+/ >+I¼ÎÎ:ûgG^6êbsÏFHõ!Ða¥h¶Á¥6Lt*¨¢+Z¬KÃô6WÿgÓ_Çg«ñÚ``/£óbzxtCg¬bASϸ$ò30¸¯®p öÀ¡§wuë| Å°p´ñüùÍà üOAÍ{r`8tElZ!R<ñàV©XÙFÁN§tÑ$èÖØf@Å¡;¨-1ä3± >+4Î ± â bhõQ\uÁÖ$a£¬ö¾«{h^òÉÛÿaÃÚCO¥è^üÿ^¼~ù*áÿ·Üÿóý¿õá¨ýþüôCëcë¤}QV¨VûñIe\øÛ_jè[Z18{¬èo޳žwÛÏ$mÖ¨qk^@ÐMåÜäé5¸§ha¸DÍâþpª÷ê çêåü<áRAgÐx.>p.¨ZZ´güþ.øÄefþæÙÙt<\©Í°åTv¹V0¬zÏ]@êUïÑB#Â~üä D¿O±âéíöáÇÀøùk~kRèÍ«á7y#³ßÜ£+«¢{hÞ^ä)²ÿWvüçOöþ¿½³ý:áÿñêõåþ¿Gßÿ+øü¬öøv|×61§¾ðp~äKu4»ÓçÂIJü䣣Y*v<¤QçfêO&¶´2ãémv³HD:Ëi¹j¡Êñ2EÒò¢ú©S@ÙÇ0`¬hM<&$ÕjãΦÄxOfñªÈ 5_WûE?$VÐpÏð0å!vxÞÊ%¶JÄwû>ý(naøåÔOñÛ£Ô >Eä!ÓäúKïÃþÉÑ&³ÒmC?¿ð;öoÁ¢G£òÛþ]"? >+·Ý·dy >+62¾MñÄÔrl¶d4NYñ÷±°»aGÙeÇlî) ÅÆ]c|¥(ÄÃ7ZR(Î;Aó¬C¿Ö0ºeO¢BW/ÖØÚäêçK0e´èE`ì¼q có¼pɱ¦,$»r}ÁUIùÎÝà;¨1¬y>üUeÏ5]ulû$·fáf í©DØ´¢ ñwçÊ´] >+ÇÁpÁx½]p(ëµ÷ à¾À§©?hC¸»¶©«@)ÖÛjõ5Ù\ÌMF*qDÍ"mÔ9;6|väZø>±¦¼W/k¯©DaÓ;øSI'=kµØ*lh<5®öa®^Öq+³# **GL9¶t#¦N%_bYÆe/±,Þ±Ë&_7;Úxû#[ÿÚ|opá±¥|åÇáP(æpRu@>ào\b«5ôêMg½öxRº*·¤jËïà¦\ýdûÒsª<}bzii >+$ ð¡2<nº*F!dãrºZªÖ ¢<e-8ÕH¤:ë±ütJb@{LË}ü{2øðmCq×`IÆlÓcgðmh !BS±o[¹ÊüÁt¡ÖÎêÏâqgOwuml0¡7¬Xª!'5MÙêx.R¹á ]£¾wR°_ûw=1¸Ì& 9si»Ð'mbÛñD?,í«1 >+ÖÞÝñWÅA >+ÙZQqLĦ¶è(DZPq/5bѦÔ-ì¶÷jv¸0R¥0µ?91å¾LÁ»²Ò^ï>mJÙ½æ´d¼»¢ÕC±¬2^ ©N!Ð5Âä3b¥³ÐÜl¸ûuå-¬$¡´Ñ% qjÎ@ýΨé<]ϼΨ¬½j½0´µ¹ÓÈTòî <ÊÅ÷[ê÷Ñû.uØTèW<k%ð$dÍQ÷ÏÎÒ-A(ÔYáëí¾ØXPWî¿©ÁÌ/¢/÷Þ6°àþn®t{(¤7¡IÕúCEJ·à²¬¢ b5gÚc¥© dº²Mr³¬Ð¸²Zãæ\©h1Mʶ*å+Í «ÝaIÁ@Ieº¤³Ä¹ø24Çc~ >+ÿã¡eÕ6òâ?¼yõÒÎÿÀ~,ÏÿñXçÿ÷]JÔ||^)W¼ÑQÉ2VØ.K'ãQ°á³Sao7<2l÷´Uo;ë´ >+r¿%Ë-AîÌñ/¸þ¹OBµ9³þw¶_oÛëÿÕ¥ÿÏBký£DTªûøx@±°¸öMù'û¬6ðp)Í µÁáÿþ,C^´¶ÿéÝ-ÚÁnFßXÕ½VP'ö»l5ï?Öeìe?ê!ÔjE]èoÊn% C´hèÓSú¬ì øçlêÔïc&³~(ðh³ÿD'c82ØððrFmx£1ts:Þýmõ®goÐenVàttÚï«ãÑ7î÷ÙK88ð£>´Ï/!. 4¾Ñ?ô7 9öþ Î@½?a]=EHpäcáv:n«}ØðbÙIPá>] ÂÁWøç´+ô¸»´]Eãhá±6J"Õ«ìTÿ{ü[ 2`ú°P}þ¸É²P³Ù ºÒ p; p|pN~&Îiø&)ÔX©àÄ´KB/JÅ¢H;NK)¬t.ÌchU¢Skè I°Ñ½Ï C1\}f;þgM¾"u.þ)+µÒ¨eb.ÇRÔQ§ØQ;Ea/òîÔTZ+)ØËÒNôE"lÓ!2}¾ gÓpèOoà ¦áü±G?¤K7ût ì¨ì×1Û¿vÇ*~ÄJy$ì¯\ã0êIz¹'YèMaªnçRTt_±[OL$ ³îá¢OH¬7ðM£AÍ xu~ô§· y5dd¹ÖÄð9F/Jm¹P¹XÃv^w´'V? ÕÌÜ/¥6äîV\-ii]Q¦&e_R/K÷³ÈYà{æA tÑ,W³ªÕ7ì:µg¬¨$ >+MãŬ[ß´®Z§«Åe`ÓèÀägÛæ!l¬}8Zî³í o·,¦Ùf¿RÿC+:ËÇùäêÿÆõÆjmäÝÿÝÞNêÿ¯ñ_òHýn¶ý°rx\áP ºOÿw\¨Á³ ðò%ÕWfÒo÷{ÿÑËÔD"ó¹/0à]öÅ^Q&Y¬àåÞF^ðM©~|©EGsºæÖ#ýªos¸ìÒ¼¸ðË?'LÌUÖóC3²åSéÉÝÿ¿v 幯ó¿[/·ìû¿ÛÛËû¿yäþÿóAë¬}tzR>öGéoïwmþÀS.ÚÆS?`9¦\УµTý-ëLWFET¥huEÂˤ¢Oäu;ÑñÝïà·ÚG[ýóï/@µ{ë=/^/R_Ȳ5á]û_ lä³qö§PRxÒÌÏòMO=þßïpé4Ë ãÃþÿc£ªC8ý±Þs(^<{L.ø¤A;oµöÛÃÙumL(Ùõ4@íýï´ØlÊÅ7cI¹(Q£!OGÔh( ÎÁûç£Cû·À3OLPGHýñlÔuë06"<Rö²HñÓQûÎÉiçâòýû£Eª.Å]Ù²ë÷ïi Z'Ó÷0ÐïöÛGk:pûwÔ-R8çû°æyæüãààl¤ÎûãÓÜPúñMaP¦ $O|JJÁJ*ÚËãöÑÙqh~a 3Õö1-Ï8°e#±GaáFÈhÜK#:e³¸È ÎWUhàøhÿ¢U P@â ÜÎÁéIIÂ}$ÖÐßùRÒî»N-¦u$ZZG'Y#Z?[¸eÎ2½¾z£Ùð*æ¿<9:8=liàÃÓ|0 ; ý³álôBJ{7+dÓa]üxrúcL§?¶N<¬xü9¥U?<=¶Æ9Þ?7ª¾&\C¶awÑ#2Áغ¨ØÊÊJäL×ãdº¹ÀÚûïÖÑÉ!xûmmÀbÿ >+`¼ÁxQ'0"ùú §§A¾Ña|Ä3 2² i¼;>=øhÿ¢£)ué2Æúcë/ `°Llb^¶2 v½ºONÛ÷§"bu+öéù}µõT@ÇèäÔ´75g¯rXbñ»þ[ç§|ÊB+8O<GAìý_0ëóçϧL±&ëÜ#ø:a2QÐ3Y¨ûÞ}yzya%±È &ÛBä¶[H*ÑÏK N~0 »ÇA ¡U®=Ñ.f0ç¹{Ü"øí-k/bXSÝƱõq¡ 3°KÖ5_âõývg uûy{ rt²ÇqäzÄúâLMÞíÂm« bK¸âÊßXýÃÖyë=ûÿÉA˪ßäå£qqùîâàüè̳þ¯¿3ña0ÀHË09 Ï./~x·¯Ïä3 ¨¨ º3=")=còèä¢u®¡(F/[BðåI´Ã«Að,?cóæ 7;çýýöÁLùþüôòLëg£¡w¯Ùÿ4Ï& ¥/ÖÏgL bP@ö2´¹äAö36S°À ! D&¤£ïàùÏËSÉéænÎtÏþÞsÜ/o9¸4Íeýä"êgm¢:/Gu¯IõþèØÚÅ >+¸ßOÐЧX'Ýþ@ú'{Å ãí5rÀA8½0A°¿F&$Ó°»ÛÞóö (Äp}ëmpp0 7Ñy§22M1/ÞRú¥õý*ºÉÙ'L¦¤¦±y/¼î®Ð¬F[öߤ½ÿà ñ4a£s±õélà C63ã`MÖH¸ÄÑ'î Liì;7×~\ã°8d1c?é]_Öðù먳=Km×Óñ<à¬í6ÆÀà+&·N°\¡c$:uÉ {$à «g'ýS Ð0¢~>ÝÆÂÐæ`6i_éÿÎG;¨FZ3G¿)ÿâáM@¾1ÇÞ*^r°) ªêãªauLÌ%¤ÝÂØ¥T?Ï3PoËSG=¢GÄøéüUb¢Ù£j{dZo9ʦÝhfØÐ<~2b94Ó8¦0ôÄ K÷% é"(Ù³ô7Ôcð,칺½3»j×(Ú/½ >+/_ñÂÚâhlÆÖæìG0;Ü Ë 2`ävÇìáÑèZ£JP¶©ï.|& ±¬Â ÐÙRlJ(z£ñ[;¸qÔ]>5ýQ£~ï@j8åð4ªÞSS 3qu 4f´»Æ[ǬNïõÅæìó¡ÒëJM«[#ñ 2Å4ÅÓ åÅì*êNÃI\GYó®JÖ ßÙ,º¾ò»K£'*Þ;¡ëTbw*miܨÚ]1#-;A4~m´°``wéJLÍÄÏ`|ä=ÓÓØ@©D¶`*éKÐDé£p?*íPðÐNøÉóÿ!/»µãÿ»ýbûÿïÍ¥ÿÏ"áÿóaÿüDz?eêüwøüðÈÿé¾½F {Ôßÿà<pÈÉ8Â4ê"s«.aHg?Ñy ±Q!Âú?ÅÙYY¥K¬&ÿoófÈd« ¯À/ã@yþ'Uêp´¡À)ìEA±£Ì¼ÌyèµðW|òø?#Ý)ùïß*äÿ ü¯/ùñä¿p¤byûÿöÛÿ÷åö«åþ¿Gìÿ'§'§g¿ì¿;n*T}|Ò@)asæé_ùQ½·&#V¤'»qdÇI$Ãc<[ûÈ+ÿq¼3·y½ÉÚµº:Ô_«Èro½ZöV_a<ôì_>¹üv÷ð¹úß«ÄþÿæÕë%ÿ_Ä#ùÿeùðeê<>_å'[Svb¦°KA7åáFNRVrZ >+ÜlqÖ?¤V5Á|WF\B8«+¢ï(Òî|B¿ÖÐ¥iiÐó äx4¸ êÁ×8`Ý ÿØûDióÐëã¿ýÉãÿÚÈáÿ/_m¿°ó¿Ø^Þÿ_È#øÿéEû¼µÿ¡óÓùþÙYù«?æ]Áqyï1f¤Ç´VuÝßúêÌziIÏ~éf'öºÉNÙZþX¡DÌÔ´DQwxê<4dÅ/¦` ÍrLÔ²rjjà û5ÌD ÜÌoððn«i|ùælÇsv®fý~0ýG¿3þþÛÖßi`×dùßVÕ_Ü«ÈC¼;Ö°Ã^õV/Û\eÙëdY0Ï:ÊXC7u5ÐøI¯B~vZ@ÍÙ¤Ç^BF¶FGÁá,& >+-J*"©ne\åóÖ[#¬¥ý¡Sç/§¿dv[õ Ãé 9Q'Öú±b'¾Òo#}Em Öѯ'¿ëS{2Þð,l ÈxPÚÓsñ`[sA,±Ì3P[V|ö¤¡±Ö½ÞðrécÈ÷¢ÞæÉÿ&è-y7@^ü§dþ÷oöß <Bþ;Û?¿(/ö«õ¥½"ÙßÓ³ïãhÏj=ýùPhÊwm¸ÒtE//àæüvZÉñ¹HÚu*I#ÿ÷PÈ!%7þ*â«`ø°çª«<ýìñØï¹ÁàM}9 ¾Æ"$UMïãh¿ê >+ìÛÊb¤Md ÃãY\·Üä© (¬eÈ%èò¸À×èZ]ö6öeÊ·ýO¹Å3fò¦\b°íBªkXÎK¶Í¾Ü~hfµ|æþäíÿQ<Ùî+ÿË×oÞØç¿L&XîÿxÄþÑ>.ÌIÈåk>f9@ÚxÔÛÏNñsèO[}Òþ"øwJ]H)}[k°tÃ¥K$¢?Öôv ¬Ü׿Ãø-±yuØÆßáïno4> c¼ ¢A_ñ&ö4WíÄfMÞíü_=¡+7&´÷(Å¥jWPLVúÇÕ+«óÇƾ8÷l%Úwß*úQ»ãùñNØ°¹¾Ë }d !üE6 ÊyTn\7óö½6æ-+ê·CcÖ3æìÁ-üÆÏöúá4ÂûC¼0ô{r^slóڦʳÂfÿ¹û¿ew6òÎÞ¼Ièÿ/_,Ïòý¿}¾Ô.û±\G¸ï§oÛîI]])MþàIMÞÒi;ÏZ¢CÙó¹<ÎIDâF®ï»búõp¹3$Ln;?|æR"Ï«ðÜ ÿåízÛ/··ê¹Mw:¬µWs¿´ÿ 0ÝWñÿÌsÀóáñåsÜ 3J92EQé >+Óñ·¬Ø¨#>:]â<Oqm-7rBØEÖ·Á¾¢óS²Ú¹ >+àâÉK:p¨Ìó&9Èî¨ >+S¹§:]ÊeW±§ >+êªÝÕWC-¹ÿ-_þ?îÝÿÓöÿÿÏåý¿ <BþÃÒ_:OösðÃPçé4:¿êvTwu-Ðþgëxþzüľád}ç¡Ü2ApÝ:«L/ýpÛ,«Ðú+yXYõЫçñ? îÿÉISlþ¿ýfëeâþ׫íeþ÷ <êþ[`¶¥]þXùºo?pñ°«päOo³\.¿Îa¶3ËÛ`w2e?à#£D?Up§R/»zÐá¥_:8Fl°ÂøÖåE&³ØvÏä6Tücùd3õÀÀi¯¯NÞ[¯:j>uT}uk¦áàìÓIðÉó»÷íÅgFÑ?¹ÅGþÈ&/xµ@I8ýaVqÙ°v¬¡´¾iìjåöxæ_qwJ&Aè]]^GfN£oµ¥h Ô 4°a¿ö®Î£G©«ãyÁq=¸®eEI=:!z/˨+Hg<r"$ >+Àk2Þèm/\ºt½¨ÐZ.¥U4áîÚþ¯'¿A p/×l$`îdtoå4I·¼çë0ÞúsG£¥'H6L>Gð6T]gC :l½?:Q» ¹ ÂUX<¾ÚðF§tÆúoúø-A¨À¨ð[ Ì¿eÆ[ýÍàÜ·v"¼b=nJêÐÞB4½ðûµ½å=ÜßÌÀ¬iz¥S^ÒJ5¾Á~+:^±5ä(oµ:\mâUbý·ä5»Æ&K:5bnrÎFQ÷¹sÛ8b¤ºë'··G]iF½ÂJ7Q}3÷ÕLøûF.c~ ûYÃwíGï`HO0«®6øFCÛË©¯ÎJòæE³5^ù}ÂMîi$ðKìË ðÔVÞ}âl¾²~·Ï î°=&E¶ógô;wl$hgGÓ;Ù#kùѺÿVGv.¾?i"«ä+ S}V_-ÚÂåIÅ6ÖW=)=z±ÂxÐS¼8ØùËö >+VÄ%UêxE»¬YMÏèdQÊÔR©5Q±hCx>T|Äè§ä«J«ÿ3SܼÊ+Îe_Øã3E\(*æ¡iý'ÀÔ½ÿLçIi¡¾¬ÑT± sËOËör©9ÒÿÉ+¢êhÞRªÃXP¬)Qç?!Ãp2a¸<£TÃ7 >+~ëÞQ6÷GyµÑ :¤&]¥64ÿ(CûQÈò³÷RÆ:íÖȸJ¶ÙRÂ$ûtàJ·7I#Ò®÷jõùóñô³?ÅXÑ·ìI/Ûuô«¤Ò¦<ðó£Ý÷ju¸Kªg|þ¸¸ósð w}Pg*¡dã¡kK¿ÊBXóÂÌÄ"çuÚLªÌd îd]w0 ðzÏg¢:{¨[xÇRíº «Q &>+Û{ ºÓÒ*®*:ÁFYfr¿ÚB3PúàÞmþq0¶ÙçèÝrîåÏ=ØÎÔôø¡j{úeÊTº»¬àe±Ù¨MXõh[B~±yîÎîny¦ºëdÅy=¬=~>s¼¼ÉÐóëÖïöl³']^+³m>XÑ8f¶M´.h%*hå2WRDr<§Ê³¿¾ÃR9 >+ÉIáBË[Xç;¯pröüØ@ðØõÒ2»Õvq#¾¥eÀS¼å23ZGaÝæ5¨²ÉèV$ßåż¹,îÅÐÕºsøðåOiútzùÜ÷SÈÿ{ûTmc«lüçÛ[ÿwÿùþBãO^ZÛÈóÿÜ~¹mßÿÙy½¼ÿ»ÇðÿËkÊT||?Y!ßÂqÔ¿ée|kÉËVÐëãY,®VêÑ7WW¬ zåDü7U#äál8qùt¥Fù¡'öò)ôâÿäæ[¹lþÿâ5¼´øÿKþ¿ÇàÿGÎÊ.[ñññÿ{sîÔdk U `Fæä®åØ£¸W!&·l÷TÃvÂè#¤®¬: ã:üë+ >+C $++ã]?ÃÃv7ÀØáÚ(¸ñ¨gÑ s=°¥¨5»&?Ûë²½-:hJ«.+¼ÄhùÅÐéBÁ¼pïHïG`mrßxPÊ4¬DkbFu¾ITÁD 8ÓþKÿ¿É0ñwôL' snZÌ*7þw<¼ >+Í©ÖÄä4zà%h9Ò,Kâ]tíO^ÇTO`9'Ý[i³¨ùZköGF%Z£h6 àïÖ×0eW¨¢¾S$7ìAp×3RÐ]jÉÉ&{° é-ã¹ÝäÅÑ&øÖKàz9Z#ÃwRchî£þEûÏ¥£*.¢ûO"Fl©!,fÖéLðã.÷ZLm44(~>mg~·DJÚ fñø:0e JK´«u\ìñÍ¿à'Ø×L¹2Ö4~H¨~,ðØE± 9zKθXûç3Rc>=ÕàV¨aIm{qÂx+¬àpÈ-ÐÄâtmì4Â&N%&èOÉAÑ}ç7XÅ®$V.×Ýr¨»c+7ü2n;(Ì^Â~Àù_uº{I&ÀæGV+Z´wxîiÎç`Q`|òæýOÊÔßLO¥~[¦æ>ãÉ[bc ½ÂëÏF]T >+r$a13i»óç"pXK®¶IÒê5ÍYÛV¾iI çÙÙÙ30ºãþ¡,ð~eH´ÒðtÁ·gIv¨)¥¢Ýö?Ý»MDX/°ttA®ß ë¤\ÞL¨ ¬mhãK=jì}Ã(¡XåÐ¬ß >+Wñ¬éÇ&c;tm]¯Ü,âºHýõ©zßm|L½Zà+5©gks´B¬#¤,r28ÈBªPL2´d£W¸4RFCl{,s'ô!¸uèbwø Yâ®æ½/VÎ¥&Eºuù§Ãíá°Z)´¸µÕ4W®6 ÆpÂiPbÅóy*Nn¦NX1¿ïµn¢÷{DзÊfÅ+}fL?²·TåôÜiðwÏÓúfªr±BÝä£rFùÉ&Ý4èW¢\*2ú ùðÿÔ$´qÿéÍý"ïW¤6+!æ)?`B{ßFf5 oS3©¶Viá¸ñ3ÆEqµ°Ì&1úU/ÀØbò¦QÜ;m]h&ÇVw@..)oé9A >+¨ÜbìYÂsOÑ®1hÌMâû ÈF§Ñ:õ¯6¾©3IÒö49;Õ·Åc: >+ëØVi%R%Ô°Ç`$k±iG±Ì\<,¤98;$R/éç²")8Ða²LeÎîk;Ö÷ >+ÓÄÆ<rðRn趲2Dɳ±Í: éòßD+ÖK6y<ð%BuæÈ¿?â*k¤EêÇ:äÈÆ··Áç >+¶ñIô1'Îøå'Ò #k4ær¯ÂRëã/Y$uÝbnm/nŦÒöëïV|ÍûÜÎETqo<æq¼[L÷A:]?Í(·W[ûæ§ gú³½aé÷Sx]k·rz$+D¬ÅInÙ%f»²2Ù½À¶>òtZÆòç<Éd&=Jf¬Ü\$3sdðt >+r ¦Dù¯÷ç$±XæE´µðç!FÊÂÉ À7uJ˶áÞñØz×b¥#:Mñ1¢JÜB8©$6$x¦É½=Çi`ÂI¯ AdÐß}ûÓ Ð]õy"¢¦UtpúB!ÇJlr#g3v¨´®æÿ[Ìÿ[ú±Vò1λÿ³óæ}ÿëõÎ2ÿïBáÿýqÿøM¢vë|¿}Z:`µÚÿàYùøHê±·Ó+QÜ lFÅá o þ]qXbVdf#ÃïXf§ ½C ßðß=~?Û¨WC-r² µÒúô/FµfÈêF{9 £ÌC_ïË mM'J89t#`¨*5þ-ÉÁ«y¬ÿBüæpå6røÿΫ-;ÿëÖÎë7Kþ¿Ç¸ÿÿ©rÿ§LÅ¿×Ä~@fÿ¦"f't3(ã*°*+ |²þ{êû»Y÷®oª=Rr7/ 9o¯$%ܽ DBëØó$ì+_¢çQhaÞ}.*7Yg6þh¦´þÌüÔE)vrSLâ." >+ʬko)ä\ ²n5zö¾þ£çÅtlõëPÇ·îxh_(¾¶mÂå`Þê>µx%Âû¦ªÙ©¬Y]F2*6@`¬Â"µ!¬ÇCÞðPZ|_¦-Rìϳ³ÎéÞ ò»dßiÖá·FR¦p¤U.¿)³Ì\8Zµ4Ï[ãðë2Ç+¥æf >+%Ðí×^#³%,ÕÁ2u9QÁE±,ô"b®{ÊBÍ#uÁòYÑÏqtoì²Ådç ô²¾ðkUÓJNN%uêî&ö6å ]cú)¸jHb¤X£uKnÞ¹ {JNý©ÖiÿVã߶1)URr;£cÛÒ¬w%-xræ5ÜA×'Óðk¦¡6ÈIIºãVJiÒO/ÍÍ_øLnooò© J»\ÉˤÏlÖ)n¢ïÚóÓÙЪº;ȳEMÑò9!d6Åï9»PÜgM:¹´qS»óà`0%#¾Q°"QC]áJÊ(%=ØSHÿçiüª¶gÿ}µcÇÚÞz¹Ôÿòöß³ýóÒ >+U ñ)+*TÕ Üïxì÷ÒÓy5¥hq|¦4"( Ù,y ·úì= »Ì¹Pu©hYhæÕ²ÐN/ÞÔ:ï§ãa®9Ì®åfîC/Ø9?Åø\õè|þoÿm½~¹ÿ·ÇâÿíG%*>>Þ_ÄþIM¢ø9§qÁL&ÅÙhWÑ® ýû)Öa¥WC)¨ë¿¹$ú °H"Râgîò¢íìâQE S 6ëIûnjE£+²²ÕÁ|Vʹ÷3ø¡×ì<BüÎ*·Ãÿ·Þl9âÿí,ùÿ"ÿ·9«(þ©ùw$çöaÚ÷þ #~üá]xW6<8¯ØàFoö/7 nxü÷Éþ·ââGezñ/ÿ[;_,ÕF®ü8ÿ¹½³ÿ¹Ç8ÿ?lµ÷ñÀ©+¸ÇÇòe;òáä¬b6&A7ìLA)zH >rÚîìþÔ:lÒkÌ_QÇý´bë;°|mÝn >+Wm½f¿n4xR4ÒSj:"[Q§é[ØÍ >+Ûúo«ÓWÜe¹£g{úQæ?¼-¯áel4-¿9l¾U'ßC/Ã{Êðÿªa ³ùÿöö«W/,þÏ~l-ùÿ"ÿ¯ºBýÇÇõï Ù.J°Ë|³Oý0 >+Ûh¯É;âmð4ï- `SÓ§ bOÂÍú>IÇÝöJßöÖ¼çëÒ'À[.Núð}úÜâ[ç9#û.Âv¬?ç1>ı » ßßRÏàøï½å6;Ý ûî.Fï êì ¿%ÈÚ¤Dĵ¼ûi'V$ û$½4²» ÈöùæWVàwï>I¢:$eB/ìdz·g£Fi¹Ìá ÙRvoÇÈZJTí¦NúLJ9Þ¯2´¤Í#oaâ»6-¿Ûb3AtCsbÈá°Ëô[z9~÷IÁ¡äB¦ÑâºóMøåz[]æRÎ'<,¡Ú¢ÝäWKWhÜq÷º6$9õ"0]) àÊø®2ÒêÐp}CDÃX¼íÊÂnÁð §Þº¤->,Ã$è;_Ü2ãT 14¬4;æÝÀw~ïbvu§á$æ@B"TÄ!£#ïë>9QéUq=ÖWAâW2ÛÕkÑiÕY-¬Õ"øÃÄæ6EjrÞãÄãÈà P¾àtìÍßèú/w=êÄc5ÝÏ,',o÷Ï8gi®}fäÔh3ÖÖTe¿°²kÜ ïܧª}Þð¾ÐÊ+m-ÚBpºl\f|ê|g¹ugä_6ìþKÌncʦ]M¤¡N$åÃgóù·y{êwµÑ(é_7N¢µ?!çºW~qD¬ÏcaÚe9áÒ)+Tàõͳµ3%Þº_¯îf[p¶Áß´Éj7ÞÝg ºÊØ2±Cµëö L9¨äÚ@òítü-Ò}yûØOð¦>>ßV³n@e öàWÜEЮ;60ÒˤDX±ËQa3PÜäG±YsGI¨`¡zhÝý>¥ì¿Ã@äÿ½|ýÆöÿ}ɾ/í¿xÌó±<î¢"ÿKðÝîë¶aw²oê°ßó'X¬Åvq¢¤)Ùú!Åû¶ò@3.âÊHÂXfá»»ªÅ >+»÷6VI7Vù58&0ÞøÓü >+é°Äßä5üÛÃÖáÙk2óM½?Ðh(ÏWeÍ^6࿤ȿRªֹ@y´?ªþZ Ǩc?+Ló7ô=|##aü§½$Î$dá§=.s±Àr)#dvZßð>®ïm1äY&ðµzÁmA3R7IgÌ0{â3îtèB.®%ºÛÅ,SKQÃÇOÇq¤¦A?òÛÉo°Qð5®©B`ýö$¹µYÃÆR«Î/¯r]ý(+& >éHX×ÛVû/"m£&5«ª$f¯ÑdéQ}ýeì y6¹Â«§£©$4¥YC.5jKÅíî¡7~þTÿ(Eñ6òü¿^¾Þ±å¿¥ÿ×blùïýOóKúïï˸P&TûþúǽùÓõp±ÄYe×/dO +ìÈ^"DJ[bn=ôjûó=eø¿ÈQ^¶<þϾíÿõêÍòþ×B'ÿÿÐúpzþË89çUðw£ N*ä®N®_òB¦¯©dÊM¦¡AFTâ½T]E° a3>ïj÷¶(` >+Åñ/&%Är¥p\D³Q5>Ö0±ºÐ¯ ÿø0¡C:ú¦Â¥&"'¥Hë¿Ñn:Ò¯R ÊYÿeø?y6o#ÿ¿Ùyißÿ}±½´ÿ.æqùÿVY¡þããü¬¾yáKX §A¿ÀþRÍà«ÇÙ¡´81'·`>VVsãáLü<è#¸"ç,UÃFì\Åa3x9Á_7éçãª*@öÖ!u_J}Ly Åxó1§RêAN[U×W'ñ*c:ngRM;âQD)ñÝè¸ï.ø¨[qô§µîK¯½Ãlh«äPBMT@8·D¶gK/`Êf/uà ²\\O¯5.uwcVÕî èºÏöÖïõTÑÛ6ß2;SÎÑl0áZc ÀÝVÖ¤ ab!L&&½Dbqý¸ûN+C_²IÙ\O K{£ìÖY³·Òf\ªpHºOIÿè`+2ªE¥æò Qa¾SoÑ8^ÉÑPв`ZºqáØê!CÒÁ~ð«ÍÂ:ÆfRÁH¦¥§¤Ù#Ù5á@ˬDz,VÄ\8ÐF² ¹ >+iºÔ½ø¿&Lb¹iñ:<°±ggTÜ|¿¸»W:#J µ·¼2é8q§,¤955ü´ÔÎ÷e§4cºÍÑT3nÈ52!í("©q¦fF鸦¹¨ÛCqQMiõÐ)mb.pä*´_atî¸RO¥âØ ÃwÁòûàûOh²9ýùCöÃëdMÄ¥g¾R¡Ðdªßjò¤©§¿ty0Å(TU7^þ_Öþï¬j#Çþ³óbÛ¶ÿ¼Ü^ÆÿYÌã´ÿÓÝoïßé 4¿-ÈéÖwÇì!.«Ï}e ²MEä6^Ú^D*¥´¾»lêð"[³´Êe%Hêæ»\Oâ[À d%íH²÷_6j¸åtëPº})ÒÒ_°+±×ØVF»ËÕ!å®ø ÃÊ[àRÜóÔÏÔ¹NÕ\Ó?à,u9ÆUufµÊͪ²tFò?¼ìðæwùõêÕøVp >+QC±îx8ÅÜ´í$Ö»Q®%r¬¨¬(ò²®Îé\³¶ûÞ{õÕu4[w׶¨%p+^ݽ8ðÊ 6N·»]wkWôÒYQäùI|õ[bM[Y*ÄvéÚ,Êù]«´5éNÛd1s:Û¡ï,HÈa ÕîÂ~xê¹)2eè[!»`ë-s°eïxÑ2û Zf?¼¡|¹'m(¿àJIêµ îò¯²)·¢+â%kt&Ä3Q*Ïý¡´üÿкÐ_ñ)ÿW¸ëÿñꥥÿ¿ÚZÆ_Ì®ÿÏå`%H ;@ÂQ0íf_ßïúàwq±ï¹¼ec[żUÛÍ<vD?>g¨ãÕµð[±N«mî#Ýò"|r?14.x|þRÐPxh+qyÎUé£HNW]£öBµQ\ý¨J38kønÞ$ÐÿTé½õ¤ÎãÔ®}¶S+hqnä(JÉ1%G&>Ä¢eÍÝDgF3Ö >+o½Ê"üléã^.Vt¬^éiæ¶b×kiÀíÚd%×[üKæ5[w5ÏuùÖ}ÖÔ?w`Äÿ¸0ÿ~r¦$W$fÆ}õRº¼gë ùº¡ùÎh°Ñ¾Ãï Ì£8àxÿÖ¨BxaÅö³5ꥶq6HÃ`áÅoVÆkK,à½U·WÀviå%,רä§+Á^hGº¼ÈH >+ÓÕ0ÐKE/z |M´t¨vcØE?ëN{\º=^rInÞ#6âai¤ÂÉhXäNèËDQë©!6-¹ÊYVF[Ò¬Ý0@Êf@PPª2Ü¢2þ¤Êä÷fceºþº+õZÝ_*²òô©ÙÃ<*òÖÕ:XzmñÀbH"Ñ+ÎĽîóB«·¾.VqÁi¡×åÁØÔ~§Ý1[wÑqÖFoù]»¹twý÷V2_¬K±Ò|-áO¦ºHë ê£%«ó>Ó >+hùSËyaß62£_h¤ÝJ]SçrcëðNPU«i[>ò4xµg~hf×PìQÜUµkçÄþTJÛðB¹6rì?¯w¶íü//Þ¼^æ]Ènÿ9o½¿»é§¿Õg7ÒrÜõî¬ð >+þxïasy ÐÔÍEnâ»]Å!Æ]r÷p@õ8"7qTqËÿE»¾ê¸ÚN®üz¡nÀ/»á¼Z¿ÍK"W, ânB\Ò0Ks«l«&ëÎE5Ç×lÿ½Sî©m¼a#6ÿ ¼rïFØ8ÝÏÝ?õb6{îvëAãDÙ~Åjv=ø ĸ-êÒBb±lx>¨éºuPøUî&ð/dññy=é+ù®÷`´Â>%à Ëÿyú£6Ûl¯û£îõxÚ»ñüãÿ¼IÄ{ñzgyþ¿Gèû'?´Ë*}åk>>MÏq\®T´ÍM¾:@K*\À{ûXâþb½òÆWÿbð¼øÚÉv< "Ï÷#[sÁö¹SD2N >+¾lñØ£æ:ÇmJÐ~?ìÁ(ö g#YåñZêúÏû©|³á>°v¯Æ³Ø»ß¤A÷ëÊ»ºe°ïÌ2VJмàøöÚîN² R²ýs&ÆFL¬¬ 8*^cYM"^ÒÀ<¨ìaTBEÑç¡Õ.¼bS£B¿rϼíß!O]»Såð?mï{¶ýZx¤NzÓr[µA+@ >+±ÝÀ;ý¼½-zÅ¿Yáðʯ¼äú/Êÿ?MýÉõÕ,u¾ö?Æñ_o%ï-ùÿBÁÿ¿?ß?ûáÝåÑña«´ÇWºxP69°×XÑx(-s 6H³IëP õÖÑq¿>«DØqÅú]dÝc: hì (3a2.=¸ño#ïäòøØc¬´~ö`Æ#ü>7?ÿüsNÀ<¯?akÈÌ á4mÎê`ô5± A¾'ÞM_ÃïÙ`@¨lç§ñÌаÎðt:\èÿÀè»ö² þ]ë,ÄÃÞj*\¨}èó§ðK0kÌBåB·<éȸ_$Ei/+¾Ì¯ >+ýHÁTÜ¡¸®F°¹ôzä ÇDÀßôøË?âáøzDYkR}ýZ«PrRa×$,ª§#_wÃþîW·Ç²Ç[9òÉ.5Qâ½áQ2Í27!W bøëL" ¾A0ý_Õåæ·Bà >+®Ié#úÁÌw0ad&LÆá{»çMP Æ_ -'¬]dQGLðni;üÞ0¯Ç=>êà*úæk.Fð÷ý){Çq¿%ZÃ.¥VÕÐ}à#D, {i7øFÉ¡f?¬Q>íirþz<ô ¹Yô°¹ì RL÷![EÂ+Ì-±ýÃ$m¶#ú³A\w̪ϥgE*ã$:qüáKSÌFrüüF¦Øàx òûl2ö?a"~m&ÎÍ}Ð#زÂ>1²ñ=ZåÒ3¼a>Àt;PĪK >g! Å×{Vm6lWÛØcGë" üA4VäC8 Ï&¶z¶ Àà ´â_l3öëgÏ<p-1lQD4éùZêXU®Ú%ö&3ã1no>° ¨ôû"¬+ʲ?Ù 1®{7×l>ð.N<¦`°µêÒÐZJIÓ{çIïÒ¢"@Â)×NòÙ5³JÉY qfþ@~Úª#YBkHmHö;ìÀ_5üihgH+dMoQb¡¤(nÖG¤º'Òê_ø?|ù ³ vÔ½et?G¼¨;=ÐÞ]ï°¥n:`;ûv!dt&UFÒZ÷½ÄÒf 3ÐÅ]ø¼W#ún >+f?BvN½èÙe®ÂáhPÓØ£?Üz\¨[sÐRÑà.&³;abÙK`ÇQHÔÞäJzR86©ÈÃÌöí»;b©ÃÆ ë# U¬ÊÂ=n ýè¦*E¿p¥½QÀÒñK©ÌÖõbZëyÃTV*Äl &cKmÈ£M`ÞÝ¥ÆM%«É8û|¶=ÛºÁwèË=n$Díu {íqmÅÿ Ç=fwÀ$ãh7º=ÞQõº¶¨Ôtûê®?$ìÂë4âÆôpm{æ !·R=ÜqÇ<í_ãÃqwØdzYó&øïFÚ®úI{]çÓ¤&¤SMJYBÔ.6c DBÍ&eøìÕR1ÂGHo ?Ñô¶N8«ØûÚι|ÏòY>Ëgù,õüKÑp >\ No newline at end of file >diff -Naur a/src/core/Config.cpp b/src/core/Config.cpp >--- a/src/core/Config.cpp 2013-10-08 23:59:34.000000000 +0100 >+++ b/src/core/Config.cpp 2014-09-11 20:08:18.000000000 +0100 >@@ -40,6 +40,7 @@ > #include "HashUtils.h" > #include "Logging.h" > #include "LookParse.h" >+#include "Display.h" > #include "MathUtils.h" > #include "Mutex.h" > #include "OpBuilders.h" >@@ -208,7 +209,6 @@ > if(csname.empty()) return false; > > std::string csnamelower = pystring::lower(csname); >- > for(unsigned int i = 0; i < colorspaces.size(); ++i) > { > if(csnamelower == pystring::lower(colorspaces[i]->getName())) >@@ -220,184 +220,7 @@ > > return false; > } >- >- >- // Displays >- struct View >- { >- std::string name; >- std::string colorspace; >- std::string looks; >- >- View() { } >- >- View(const std::string & name_, >- const std::string & colorspace_, >- const std::string & looksList_) : >- name(name_), >- colorspace(colorspace_), >- looks(looksList_) >- { } >- }; >- >- typedef std::vector<View> ViewVec; >- typedef std::map<std::string, ViewVec> DisplayMap; // (display name : ViewVec) >- >- void operator >> (const YAML::Node& node, View& v) >- { >- if(node.Tag() != "View") >- return; >- >- std::string key, stringval; >- >- for (YAML::Iterator iter = node.begin(); >- iter != node.end(); >- ++iter) >- { >- iter.first() >> key; >- >- if(key == "name") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- v.name = stringval; >- } >- else if(key == "colorspace") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- v.colorspace = stringval; >- } >- else if(key == "looks" || key == "look") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- v.looks = stringval; >- } >- else >- { >- LogUnknownKeyWarning(node.Tag(), iter.first()); >- } >- } >- >- if(v.name.empty()) >- { >- throw Exception("View does not specify 'name'."); >- } >- if(v.colorspace.empty()) >- { >- std::ostringstream os; >- os << "View '" << v.name << "' "; >- os << "does not specify colorspace."; >- throw Exception(os.str().c_str()); >- } >- } >- >- YAML::Emitter& operator << (YAML::Emitter& out, View view) >- { >- out << YAML::VerbatimTag("View"); >- out << YAML::Flow; >- out << YAML::BeginMap; >- out << YAML::Key << "name" << YAML::Value << view.name; >- out << YAML::Key << "colorspace" << YAML::Value << view.colorspace; >- if(!view.looks.empty()) out << YAML::Key << "looks" << YAML::Value << view.looks; >- out << YAML::EndMap; >- return out; >- } >- >- DisplayMap::iterator find_display(DisplayMap & displays, const std::string & display) >- { >- for(DisplayMap::iterator iter = displays.begin(); >- iter != displays.end(); >- ++iter) >- { >- if(StrEqualsCaseIgnore(display, iter->first)) return iter; >- } >- return displays.end(); >- } >- >- DisplayMap::const_iterator find_display_const(const DisplayMap & displays, const std::string & display) >- { >- for(DisplayMap::const_iterator iter = displays.begin(); >- iter != displays.end(); >- ++iter) >- { >- if(StrEqualsCaseIgnore(display, iter->first)) return iter; >- } >- return displays.end(); >- } >- >- int find_view(const ViewVec & vec, const std::string & name) >- { >- for(unsigned int i=0; i<vec.size(); ++i) >- { >- if(StrEqualsCaseIgnore(name, vec[i].name)) return i; >- } >- return -1; >- } >- >- void AddDisplay(DisplayMap & displays, >- const std::string & display, >- const std::string & view, >- const std::string & colorspace, >- const std::string & looks) >- { >- DisplayMap::iterator iter = find_display(displays, display); >- if(iter == displays.end()) >- { >- ViewVec views; >- views.push_back( View(view, colorspace, looks) ); >- displays[display] = views; >- } >- else >- { >- ViewVec & views = iter->second; >- int index = find_view(views, view); >- if(index<0) >- { >- views.push_back( View(view, colorspace, looks) ); >- } >- else >- { >- views[index].colorspace = colorspace; >- views[index].looks = looks; >- } >- } >- } >- >- void ComputeDisplays(StringVec & displayCache, >- const DisplayMap & displays, >- const StringVec & activeDisplays, >- const StringVec & activeDisplaysEnvOverride) >- { >- displayCache.clear(); > >- StringVec displayMasterList; >- for(DisplayMap::const_iterator iter = displays.begin(); >- iter != displays.end(); >- ++iter) >- { >- displayMasterList.push_back(iter->first); >- } >- >- // Apply the env override if it's not empty. >- if(!activeDisplaysEnvOverride.empty()) >- { >- displayCache = IntersectStringVecsCaseIgnore(displayMasterList, activeDisplaysEnvOverride); >- if(!displayCache.empty()) return; >- } >- // Otherwise, aApply the active displays if it's not empty. >- else if(!activeDisplays.empty()) >- { >- displayCache = IntersectStringVecsCaseIgnore(displayMasterList, activeDisplays); >- if(!displayCache.empty()) return; >- } >- >- displayCache = displayMasterList; >- } >- >- >- > } // namespace > > class Config::Impl >@@ -431,6 +254,8 @@ > mutable StringMap cacheids_; > mutable std::string cacheidnocontext_; > >+ OCIOYaml io_; >+ > Impl() : > context_(Context::Create()), > strictParsing_(true), >@@ -497,8 +322,6 @@ > return *this; > } > >- void load(std::istream & istream, const char * name); >- > // Any time you modify the state of the config, you must call this > // to reset internal cache states. You also should do this in a > // thread safe manner by acquiring the cacheidMutex_; >@@ -536,7 +359,7 @@ > istream.str(INTERNAL_RAW_PROFILE); > > ConfigRcPtr config = Config::Create(); >- config->getImpl()->load(istream, ""); >+ config->getImpl()->io_.open(istream, config); > return config; > } > >@@ -551,14 +374,14 @@ > } > > ConfigRcPtr config = Config::Create(); >- config->getImpl()->load(istream, filename); >+ config->getImpl()->io_.open(istream, config, filename); > return config; > } > > ConstConfigRcPtr Config::CreateFromStream(std::istream & istream) > { > ConfigRcPtr config = Config::Create(); >- config->getImpl()->load(istream, ""); >+ config->getImpl()->io_.open(istream, config); > return config; > } > >@@ -893,6 +716,27 @@ > getImpl()->resetCacheIDs(); > } > >+ void Config::setEnvironmentMode(EnvironmentMode mode) >+ { >+ getImpl()->context_->setEnvironmentMode(mode); >+ >+ AutoMutex lock(getImpl()->cacheidMutex_); >+ getImpl()->resetCacheIDs(); >+ } >+ >+ EnvironmentMode Config::getEnvironmentMode() const >+ { >+ return getImpl()->context_->getEnvironmentMode(); >+ } >+ >+ void Config::loadEnvironment() >+ { >+ getImpl()->context_->loadEnvironment(); >+ >+ AutoMutex lock(getImpl()->cacheidMutex_); >+ getImpl()->resetCacheIDs(); >+ } >+ > const char * Config::getSearchPath() const > { > return getImpl()->context_->getSearchPath(); >@@ -1647,60 +1491,7 @@ > { > try > { >- YAML::Emitter out; >- out << YAML::Block; >- out << YAML::BeginMap; >- out << YAML::Key << "ocio_profile_version" << YAML::Value << 1; >- out << YAML::Newline; >- if(getImpl()->env_.size() > 0) { >- out << YAML::Key << "environment"; >- out << YAML::Value << getImpl()->env_; >- out << YAML::Newline; >- } >- out << YAML::Key << "search_path" << YAML::Value << getImpl()->context_->getSearchPath(); >- out << YAML::Key << "strictparsing" << YAML::Value << getImpl()->strictParsing_; >- out << YAML::Key << "luma" << YAML::Value << YAML::Flow << getImpl()->defaultLumaCoefs_; >- >- if(getImpl()->description_ != "") >- { >- out << YAML::Newline; >- out << YAML::Key << "description"; >- out << YAML::Value << getImpl()->description_; >- } >- >- // Roles >- out << YAML::Newline; >- out << YAML::Key << "roles"; >- out << YAML::Value << getImpl()->roles_; >- >- // Displays >- out << YAML::Newline; >- out << YAML::Key << "displays"; >- out << YAML::Value << getImpl()->displays_; >- out << YAML::Newline; >- out << YAML::Key << "active_displays"; >- out << YAML::Value << YAML::Flow << getImpl()->activeDisplays_; >- out << YAML::Key << "active_views"; >- out << YAML::Value << YAML::Flow << getImpl()->activeViews_; >- >- // Looks >- if(!getImpl()->looksList_.empty()) >- { >- out << YAML::Newline; >- out << YAML::Key << "looks"; >- out << YAML::Value << getImpl()->looksList_; >- } >- >- // ColorSpaces >- { >- out << YAML::Newline; >- out << YAML::Key << "colorspaces"; >- out << YAML::Value << getImpl()->colorspaces_; >- } >- >- out << YAML::EndMap; >- >- os << out.c_str(); >+ getImpl()->io_.write(os, this); > } > catch( const std::exception & e) > { >@@ -1710,246 +1501,6 @@ > } > } > >- void Config::Impl::load(std::istream & istream, const char * filename) >- { >- try >- { >- YAML::Parser parser(istream); >- YAML::Node node; >- parser.GetNextDocument(node); >- >- // check profile version >- int profile_version = 0; >- if(node.FindValue("ocio_profile_version") == NULL) >- { >- std::ostringstream os; >- os << "The specified file "; >- os << "does not appear to be an OCIO configuration."; >- throw Exception (os.str().c_str()); >- } >- >- node["ocio_profile_version"] >> profile_version; >- if(profile_version > 1) >- { >- std::ostringstream os; >- os << "This .ocio config "; >- if(filename && *filename) >- { >- os << " '" << filename << "' "; >- } >- os << "is version " << profile_version << ". "; >- os << "This version of the OpenColorIO library (" << OCIO_VERSION ") "; >- os << "is not known to be able to load this profile. "; >- os << "An attempt will be made, but there are no guarantees that the "; >- os << "results will be accurate. Continue at your own risk."; >- LogWarning(os.str()); >- } >- >- >- std::string key, stringval; >- bool boolval = false; >- EnvironmentMode mode = ENV_ENVIRONMENT_LOAD_ALL; >- >- for (YAML::Iterator iter = node.begin(); >- iter != node.end(); >- ++iter) >- { >- iter.first() >> key; >- >- if(key == "ocio_profile_version") { } // Already handled above. >- else if(key == "environment") >- { >- mode = ENV_ENVIRONMENT_LOAD_PREDEFINED; >- const YAML::Node& environment = iter.second(); >- if(environment.Type() != YAML::NodeType::Map) >- { >- std::ostringstream os; >- os << "'environment' field needs to be a (name: key) map."; >- throw Exception(os.str().c_str()); >- } >- for (YAML::Iterator it = environment.begin(); >- it != environment.end(); ++it) >- { >- std::string k, v; >- it.first() >> k; >- it.second() >> v; >- env_[k] = v; >- context_->setStringVar(k.c_str(), v.c_str()); >- } >- } >- else if(key == "search_path" || key == "resource_path") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- context_->setSearchPath(stringval.c_str()); >- } >- else if(key == "strictparsing") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<bool>(boolval)) >- strictParsing_ = boolval; >- } >- else if(key == "description") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- description_ = stringval; >- } >- else if(key == "luma") >- { >- std::vector<float> val; >- if (iter.second().Type() != YAML::NodeType::Null) >- { >- iter.second() >> val; >- if(val.size() != 3) >- { >- std::ostringstream os; >- os << "'luma' field must be 3 "; >- os << "floats. Found '" << val.size() << "'."; >- throw Exception(os.str().c_str()); >- } >- defaultLumaCoefs_ = val; >- } >- } >- else if(key == "roles") >- { >- const YAML::Node& roles = iter.second(); >- if(roles.Type() != YAML::NodeType::Map) >- { >- std::ostringstream os; >- os << "'roles' field needs to be a (name: key) map."; >- throw Exception(os.str().c_str()); >- } >- for (YAML::Iterator it = roles.begin(); >- it != roles.end(); ++it) >- { >- std::string k, v; >- it.first() >> k; >- it.second() >> v; >- roles_[pystring::lower(k)] = v; >- } >- } >- else if(key == "displays") >- { >- if (iter.second().Type() != YAML::NodeType::Null) >- { >- iter.second() >> displays_; >- } >- } >- else if(key == "active_displays") >- { >- if (iter.second().Type() != YAML::NodeType::Null) >- { >- iter.second() >> activeDisplays_; >- } >- } >- else if(key == "active_views") >- { >- if (iter.second().Type() != YAML::NodeType::Null) >- { >- iter.second() >> activeViews_; >- } >- } >- else if(key == "colorspaces") >- { >- const YAML::Node& colorspaces = iter.second(); >- >- if(colorspaces.Type() != YAML::NodeType::Sequence) >- { >- std::ostringstream os; >- os << "'colorspaces' field needs to be a (- !<ColorSpace>) list."; >- throw Exception(os.str().c_str()); >- } >- >- for(unsigned i = 0; i < colorspaces.size(); ++i) >- { >- if(colorspaces[i].Tag() == "ColorSpace") >- { >- ColorSpaceRcPtr cs = ColorSpace::Create(); >- colorspaces[i] >> cs; >- colorspaces_.push_back( cs ); >- } >- else >- { >- std::ostringstream os; >- os << "Unknown element found in colorspaces:"; >- os << colorspaces[i].Tag() << ". Only ColorSpace(s)"; >- os << " currently handled."; >- LogWarning(os.str()); >- } >- } >- } >- else if(key == "looks") >- { >- const YAML::Node& looks = iter.second(); >- >- if(looks.Type() != YAML::NodeType::Sequence) >- { >- std::ostringstream os; >- os << "'looks' field needs to be a (- !<Look>) list."; >- throw Exception(os.str().c_str()); >- } >- >- for(unsigned i = 0; i < looks.size(); ++i) >- { >- if(looks[i].Tag() == "Look") >- { >- LookRcPtr look = Look::Create(); >- looks[i] >> look; >- looksList_.push_back( look ); >- } >- else >- { >- std::ostringstream os; >- os << "Unknown element found in looks:"; >- os << looks[i].Tag() << ". Only Look(s)"; >- os << " currently handled."; >- LogWarning(os.str()); >- } >- } >- } >- else >- { >- LogUnknownKeyWarning("profile", iter.first()); >- } >- } >- >- if(filename) >- { >- std::string realfilename = pystring::os::path::abspath(filename); >- std::string configrootdir = pystring::os::path::dirname(realfilename); >- context_->setWorkingDir(configrootdir.c_str()); >- } >- >- context_->setEnvironmentMode(mode); >- context_->loadEnvironment(); >- >- if(mode == ENV_ENVIRONMENT_LOAD_ALL) >- { >- std::ostringstream os; >- os << "This .ocio config "; >- if(filename && *filename) >- { >- os << " '" << filename << "' "; >- } >- os << "has no environment section defined. The default behaviour is to "; >- os << "load all environment variables (" << context_->getNumStringVars() << ")"; >- os << ", which reduces the efficiency of OCIO's caching. Considering "; >- os << "predefining the environment variables used."; >- LogDebug(os.str()); >- } >- >- } >- catch( const std::exception & e) >- { >- std::ostringstream os; >- os << "Error: Loading the OCIO profile "; >- if(filename) os << "'" << filename << "' "; >- os << "failed. " << e.what(); >- throw Exception(os.str().c_str()); >- } >- } >- > void Config::Impl::resetCacheIDs() > { > cacheids_.clear(); >@@ -2287,9 +1838,7 @@ > std::istringstream is; > is.str(SIMPLE_PROFILE); > OCIO::ConstConfigRcPtr config; >- OIIO_CHECK_NO_THOW(config = OCIO::Config::CreateFromStream(is)); >- >- OIIO_CHECK_THOW(config->sanityCheck(), OCIO::Exception); >+ OIIO_CHECK_THOW(config = OCIO::Config::CreateFromStream(is), OCIO::Exception); > } > > { >@@ -2330,8 +1879,6 @@ > "colorspaces:\n" > " - !<ColorSpace>\n" > " name: raw\n" >- " - !<ColorSpace>\n" >- " name: raw\n" > "strictparsing: false\n" > "roles:\n" > " default: raw\n" >@@ -2345,8 +1892,6 @@ > "colorspaces:\n" > " - !<ColorSpace>\n" > " name: raw\n" >- " - !<ColorSpace>\n" >- " name: raw\n" > "strictparsing: false\n" > "roles:\n" > " default: raw\n" >@@ -2370,7 +1915,6 @@ > "testbarchedder") == 0); > OIIO_CHECK_ASSERT(strcmp(config->getCurrentContext()->resolveStringVar("${SHOW}"), > "bar") == 0); >- OIIO_CHECK_THOW(config->sanityCheck(), OCIO::Exception); > OIIO_CHECK_ASSERT(strcmp(config->getEnvironmentVarDefault("SHOW"), "super") == 0); > > OCIO::ConfigRcPtr edit = config->createEditableCopy(); >@@ -2403,6 +1947,10 @@ > "lighting") == 0); > OCIO::SetLoggingLevel(loglevel); > >+ OIIO_CHECK_EQUAL(edit->getEnvironmentMode(), OCIO::ENV_ENVIRONMENT_LOAD_PREDEFINED); >+ edit->setEnvironmentMode(OCIO::ENV_ENVIRONMENT_LOAD_ALL); >+ OIIO_CHECK_EQUAL(edit->getEnvironmentMode(), OCIO::ENV_ENVIRONMENT_LOAD_ALL); >+ > } > } > >diff -Naur a/src/core/Display.cpp b/src/core/Display.cpp >--- a/src/core/Display.cpp 1970-01-01 01:00:00.000000000 +0100 >+++ b/src/core/Display.cpp 2014-09-11 20:08:18.000000000 +0100 >@@ -0,0 +1,145 @@ >+/* >+Copyright (c) 2003-2010 Sony Pictures Imageworks Inc., et al. >+All Rights Reserved. >+ >+Redistribution and use in source and binary forms, with or without >+modification, are permitted provided that the following conditions are >+met: >+* Redistributions of source code must retain the above copyright >+ notice, this list of conditions and the following disclaimer. >+* Redistributions in binary form must reproduce the above copyright >+ notice, this list of conditions and the following disclaimer in the >+ documentation and/or other materials provided with the distribution. >+* Neither the name of Sony Pictures Imageworks nor the names of its >+ contributors may be used to endorse or promote products derived from >+ this software without specific prior written permission. >+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS >+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT >+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR >+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT >+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, >+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT >+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, >+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY >+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+*/ >+ >+#include <string> >+ >+#include <OpenColorIO/OpenColorIO.h> >+ >+#include "Display.h" >+#include "ParseUtils.h" >+ >+OCIO_NAMESPACE_ENTER >+{ >+ >+ DisplayMap::iterator find_display(DisplayMap & displays, const std::string & display) >+ { >+ for(DisplayMap::iterator iter = displays.begin(); >+ iter != displays.end(); >+ ++iter) >+ { >+ if(StrEqualsCaseIgnore(display, iter->first)) return iter; >+ } >+ return displays.end(); >+ } >+ >+ DisplayMap::const_iterator find_display_const(const DisplayMap & displays, const std::string & display) >+ { >+ for(DisplayMap::const_iterator iter = displays.begin(); >+ iter != displays.end(); >+ ++iter) >+ { >+ if(StrEqualsCaseIgnore(display, iter->first)) return iter; >+ } >+ return displays.end(); >+ } >+ >+ int find_view(const ViewVec & vec, const std::string & name) >+ { >+ for(unsigned int i=0; i<vec.size(); ++i) >+ { >+ if(StrEqualsCaseIgnore(name, vec[i].name)) return i; >+ } >+ return -1; >+ } >+ >+ void AddDisplay(DisplayMap & displays, >+ const std::string & display, >+ const std::string & view, >+ const std::string & colorspace, >+ const std::string & looks) >+ { >+ DisplayMap::iterator iter = find_display(displays, display); >+ if(iter == displays.end()) >+ { >+ ViewVec views; >+ views.push_back( View(view, colorspace, looks) ); >+ displays[display] = views; >+ } >+ else >+ { >+ ViewVec & views = iter->second; >+ int index = find_view(views, view); >+ if(index<0) >+ { >+ views.push_back( View(view, colorspace, looks) ); >+ } >+ else >+ { >+ views[index].colorspace = colorspace; >+ views[index].looks = looks; >+ } >+ } >+ } >+ >+ void ComputeDisplays(StringVec & displayCache, >+ const DisplayMap & displays, >+ const StringVec & activeDisplays, >+ const StringVec & activeDisplaysEnvOverride) >+ { >+ displayCache.clear(); >+ >+ StringVec displayMasterList; >+ for(DisplayMap::const_iterator iter = displays.begin(); >+ iter != displays.end(); >+ ++iter) >+ { >+ displayMasterList.push_back(iter->first); >+ } >+ >+ // Apply the env override if it's not empty. >+ if(!activeDisplaysEnvOverride.empty()) >+ { >+ displayCache = IntersectStringVecsCaseIgnore(displayMasterList, activeDisplaysEnvOverride); >+ if(!displayCache.empty()) return; >+ } >+ // Otherwise, aApply the active displays if it's not empty. >+ else if(!activeDisplays.empty()) >+ { >+ displayCache = IntersectStringVecsCaseIgnore(displayMasterList, activeDisplays); >+ if(!displayCache.empty()) return; >+ } >+ >+ displayCache = displayMasterList; >+ } >+ >+} >+OCIO_NAMESPACE_EXIT >+ >+/////////////////////////////////////////////////////////////////////////////// >+ >+#ifdef OCIO_UNIT_TEST >+ >+namespace OCIO = OCIO_NAMESPACE; >+#include "UnitTest.h" >+ >+OIIO_ADD_TEST(Display, Basic) >+{ >+ >+} >+ >+#endif // OCIO_UNIT_TEST >\ No newline at end of file >diff -Naur a/src/core/Display.h b/src/core/Display.h >--- a/src/core/Display.h 1970-01-01 01:00:00.000000000 +0100 >+++ b/src/core/Display.h 2014-09-11 20:08:18.000000000 +0100 >@@ -0,0 +1,85 @@ >+/* >+Copyright (c) 2003-2010 Sony Pictures Imageworks Inc., et al. >+All Rights Reserved. >+ >+Redistribution and use in source and binary forms, with or without >+modification, are permitted provided that the following conditions are >+met: >+* Redistributions of source code must retain the above copyright >+ notice, this list of conditions and the following disclaimer. >+* Redistributions in binary form must reproduce the above copyright >+ notice, this list of conditions and the following disclaimer in the >+ documentation and/or other materials provided with the distribution. >+* Neither the name of Sony Pictures Imageworks nor the names of its >+ contributors may be used to endorse or promote products derived from >+ this software without specific prior written permission. >+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS >+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT >+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR >+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT >+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, >+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT >+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, >+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY >+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+*/ >+ >+ >+#ifndef INCLUDED_OCIO_DISPLAY_H >+#define INCLUDED_OCIO_DISPLAY_H >+ >+#include <OpenColorIO/OpenColorIO.h> >+ >+#include <string> >+#include <vector> >+#include <map> >+ >+#include "PrivateTypes.h" >+ >+OCIO_NAMESPACE_ENTER >+{ >+ >+ // Displays >+ struct View >+ { >+ std::string name; >+ std::string colorspace; >+ std::string looks; >+ >+ View() { } >+ >+ View(const std::string & name_, >+ const std::string & colorspace_, >+ const std::string & looksList_) : >+ name(name_), >+ colorspace(colorspace_), >+ looks(looksList_) >+ { } >+ }; >+ >+ typedef std::vector<View> ViewVec; >+ typedef std::map<std::string, ViewVec> DisplayMap; // (display name : ViewVec) >+ >+ DisplayMap::iterator find_display(DisplayMap & displays, const std::string & display); >+ >+ DisplayMap::const_iterator find_display_const(const DisplayMap & displays, const std::string & display); >+ >+ int find_view(const ViewVec & vec, const std::string & name); >+ >+ void AddDisplay(DisplayMap & displays, >+ const std::string & display, >+ const std::string & view, >+ const std::string & colorspace, >+ const std::string & looks); >+ >+ void ComputeDisplays(StringVec & displayCache, >+ const DisplayMap & displays, >+ const StringVec & activeDisplays, >+ const StringVec & activeDisplaysEnvOverride); >+ >+} >+OCIO_NAMESPACE_EXIT >+ >+#endif >\ No newline at end of file >diff -Naur a/src/core/FileFormatTruelight.cpp b/src/core/FileFormatTruelight.cpp >--- a/src/core/FileFormatTruelight.cpp 2013-10-08 23:59:34.000000000 +0100 >+++ b/src/core/FileFormatTruelight.cpp 2014-09-11 20:08:18.000000000 +0100 >@@ -28,6 +28,7 @@ > > #include <cstdio> > #include <iostream> >+#include <iomanip> > #include <iterator> > > #include <OpenColorIO/OpenColorIO.h> >@@ -90,6 +91,10 @@ > > virtual CachedFileRcPtr Read(std::istream & istream) const; > >+ virtual void Write(const Baker & baker, >+ const std::string & formatName, >+ std::ostream & ostream) const; >+ > virtual void BuildFileOps(OpRcPtrVec & ops, > const Config& config, > const ConstContextRcPtr & context, >@@ -103,7 +108,7 @@ > FormatInfo info; > info.name = "truelight"; > info.extension = "cub"; >- info.capabilities = FORMAT_CAPABILITY_READ; >+ info.capabilities = (FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_WRITE); > formatInfoVec.push_back(info); > } > >@@ -287,6 +292,69 @@ > > return cachedFile; > } >+ >+ >+ void >+ LocalFileFormat::Write(const Baker & baker, >+ const std::string & /*formatName*/, >+ std::ostream & ostream) const >+ { >+ const int DEFAULT_CUBE_SIZE = 32; >+ const int DEFAULT_SHAPER_SIZE = 1024; >+ >+ ConstConfigRcPtr config = baker.getConfig(); >+ >+ int cubeSize = baker.getCubeSize(); >+ if (cubeSize==-1) cubeSize = DEFAULT_CUBE_SIZE; >+ cubeSize = std::max(2, cubeSize); // smallest cube is 2x2x2 >+ >+ std::vector<float> cubeData; >+ cubeData.resize(cubeSize*cubeSize*cubeSize*3); >+ GenerateIdentityLut3D(&cubeData[0], cubeSize, 3, LUT3DORDER_FAST_RED); >+ PackedImageDesc cubeImg(&cubeData[0], cubeSize*cubeSize*cubeSize, 1, 3); >+ >+ // Apply processor to lut data >+ ConstProcessorRcPtr inputToTarget; >+ inputToTarget = config->getProcessor(baker.getInputSpace(), baker.getTargetSpace()); >+ inputToTarget->apply(cubeImg); >+ >+ int shaperSize = baker.getShaperSize(); >+ if (shaperSize==-1) shaperSize = DEFAULT_SHAPER_SIZE; >+ shaperSize = std::max(2, shaperSize); // smallest shaper is 2x2x2 >+ >+ >+ // Write the header >+ ostream << "# Truelight Cube v2.0\n"; >+ ostream << "# lutLength " << shaperSize << "\n"; >+ ostream << "# iDims 3\n"; >+ ostream << "# oDims 3\n"; >+ ostream << "# width " << cubeSize << " " << cubeSize << " " << cubeSize << "\n"; >+ ostream << "\n"; >+ >+ >+ // Write the shaper lut >+ // (We are just going to use a unity lut) >+ ostream << "# InputLUT\n"; >+ ostream << std::setprecision(6) << std::fixed; >+ float v = 0.0f; >+ for (int i=0; i < shaperSize-1; i++) >+ { >+ v = ((float)i / (float)(shaperSize-1)) * (float)(cubeSize-1); >+ ostream << v << " " << v << " " << v << "\n"; >+ } >+ v = (float) (cubeSize-1); >+ ostream << v << " " << v << " " << v << "\n"; // ensure that the last value is spot on >+ ostream << "\n"; >+ >+ // Write the cube >+ ostream << "# Cube\n"; >+ for (int i=0; i<cubeSize*cubeSize*cubeSize; ++i) >+ { >+ ostream << cubeData[3*i+0] << " " << cubeData[3*i+1] << " " << cubeData[3*i+2] << "\n"; >+ } >+ >+ ostream << "# end\n"; >+ } > > void > LocalFileFormat::BuildFileOps(OpRcPtrVec & ops, >diff -Naur a/src/core/NoOps.cpp b/src/core/NoOps.cpp >--- a/src/core/NoOps.cpp 2013-10-08 23:59:34.000000000 +0100 >+++ b/src/core/NoOps.cpp 2014-09-11 20:08:18.000000000 +0100 >@@ -411,13 +411,13 @@ > > OpRcPtr LookNoOp::clone() const > { >- OpRcPtr op = OpRcPtr(new FileNoOp(m_look)); >+ OpRcPtr op = OpRcPtr(new LookNoOp(m_look)); > return op; > } > > bool LookNoOp::isSameType(const OpRcPtr & op) const > { >- FileNoOpRcPtr typedRcPtr = DynamicPtrCast<FileNoOp>(op); >+ LookNoOpRcPtr typedRcPtr = DynamicPtrCast<LookNoOp>(op); > if(!typedRcPtr) return false; > return true; > } >diff -Naur a/src/core/OCIOYaml.cpp b/src/core/OCIOYaml.cpp >--- a/src/core/OCIOYaml.cpp 2013-10-08 23:59:34.000000000 +0100 >+++ b/src/core/OCIOYaml.cpp 2014-09-11 20:08:18.000000000 +0100 >@@ -30,1188 +30,1797 @@ > > #include <OpenColorIO/OpenColorIO.h> > >+#ifndef WINDOWS >+ >+// fwd declare yaml-cpp visibility >+#pragma GCC visibility push(hidden) >+namespace YAML { >+ class Exception; >+ class BadDereference; >+ class RepresentationException; >+ class EmitterException; >+ class ParserException; >+ class InvalidScalar; >+ class KeyNotFound; >+ template <typename T> class TypedKeyNotFound; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::ColorSpace>; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::Config>; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::Exception>; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::GpuShaderDesc>; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::ImageDesc>; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::Look>; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::Processor>; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::Transform>; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::AllocationTransform>; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::CDLTransform>; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::ColorSpaceTransform>; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::DisplayTransform>; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::ExponentTransform>; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::FileTransform>; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::GroupTransform>; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::LogTransform>; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::LookTransform>; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::MatrixTransform>; >+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::TruelightTransform>; >+} >+#pragma GCC visibility pop >+ >+#endif >+ >+#include <yaml-cpp/yaml.h> >+ > #include "Logging.h" > #include "MathUtils.h" >+#include "pystring/pystring.h" >+#include "PathUtils.h" >+#include "ParseUtils.h" >+#include "Display.h" > #include "OCIOYaml.h" > > OCIO_NAMESPACE_ENTER > { >- /////////////////////////////////////////////////////////////////////////// >- // Core > >- void LogUnknownKeyWarning(const std::string & name, const YAML::Node& tag) >+ namespace > { >- std::string key; >- tag >> key; >- >- std::ostringstream os; >- os << "Unknown key in " << name << ": "; >- os << "'" << key << "'. (line "; >- os << (tag.GetMark().line+1) << ", column "; // (yaml line numbers start at 0) >- os << tag.GetMark().column << ")"; >- LogWarning(os.str()); >- } > >- void operator >> (const YAML::Node& node, ColorSpaceRcPtr& cs) >- { >- if(node.Tag() != "ColorSpace") >- return; // not a !<ColorSpace> tag >- >- std::string key, stringval; >- bool boolval; >- >- for (YAML::Iterator iter = node.begin(); >- iter != node.end(); >- ++iter) >+#ifdef OLDYAML >+ typedef YAML::Iterator Iterator; >+#else >+ typedef YAML::const_iterator Iterator; >+#endif >+ >+ // Iterator access >+ // Note: The ownership semantics have changed between yaml-cpp 0.3.x and 0.5.x . >+ // Returning a const reference to a yaml node screws with the internal yaml-cpp smart ptr >+ // implementation in the newer version. Luckily, the compiler does not care if we maintain >+ // const YAML::Node & = get_first(iter) syntax at the call site even when returning an actual object >+ // (instead of the reference as expected). >+#ifdef OLDYAML >+ inline const YAML::Node& get_first(const Iterator &it) > { >- iter.first() >> key; >- >- if(key == "name") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- cs->setName(stringval.c_str()); >- } >- else if(key == "description") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- cs->setDescription(stringval.c_str()); >- } >- else if(key == "family") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- cs->setFamily(stringval.c_str()); >- } >- else if(key == "equalitygroup") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- cs->setEqualityGroup(stringval.c_str()); >- } >- else if(key == "bitdepth") >- { >- BitDepth ret; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<BitDepth>(ret)) >- cs->setBitDepth(ret); >- } >- else if(key == "isdata") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<bool>(boolval)) >- cs->setIsData(boolval); >- } >- else if(key == "allocation") >- { >- Allocation val; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<Allocation>(val)) >- cs->setAllocation(val); >- } >- else if(key == "allocationvars") >- { >- std::vector<float> val; >- if (iter.second().Type() != YAML::NodeType::Null) >- { >- iter.second() >> val; >- if(!val.empty()) >- { >- cs->setAllocationVars(static_cast<int>(val.size()), &val[0]); >- } >- } >- } >- else if(key == "to_reference") >- { >- TransformRcPtr val; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<TransformRcPtr>(val)) >- cs->setTransform(val, COLORSPACE_DIR_TO_REFERENCE); >- } >- else if(key == "from_reference") >- { >- TransformRcPtr val; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<TransformRcPtr>(val)) >- cs->setTransform(val, COLORSPACE_DIR_FROM_REFERENCE); >- } >- else >- { >- LogUnknownKeyWarning(node.Tag(), iter.first()); >- } >+ return it.first(); > } >- } >- >- YAML::Emitter& operator << (YAML::Emitter& out, ColorSpaceRcPtr cs) >- { >- out << YAML::VerbatimTag("ColorSpace"); >- out << YAML::BeginMap; >- >- out << YAML::Key << "name" << YAML::Value << cs->getName(); >- out << YAML::Key << "family" << YAML::Value << cs->getFamily(); >- out << YAML::Key << "equalitygroup" << YAML::Value << cs->getEqualityGroup(); >- out << YAML::Key << "bitdepth" << YAML::Value << cs->getBitDepth(); >- if(strlen(cs->getDescription()) > 0) >+#else >+ inline YAML::Node get_first(const Iterator &it) > { >- out << YAML::Key << "description"; >- out << YAML::Value << YAML::Literal << cs->getDescription(); >+ return it->first; > } >- out << YAML::Key << "isdata" << YAML::Value << cs->isData(); >+#endif > >- out << YAML::Key << "allocation" << YAML::Value << cs->getAllocation(); >- if(cs->getAllocationNumVars() > 0) >+#ifdef OLDYAML >+ inline const YAML::Node& get_second(const Iterator &it) > { >- std::vector<float> allocationvars(cs->getAllocationNumVars()); >- cs->getAllocationVars(&allocationvars[0]); >- out << YAML::Key << "allocationvars"; >- out << YAML::Flow << YAML::Value << allocationvars; >+ return it.second(); > } >+#else >+ inline YAML::Node get_second(const Iterator &it) >+ { >+ return it->second; >+ } >+#endif > >- ConstTransformRcPtr toref = \ >- cs->getTransform(COLORSPACE_DIR_TO_REFERENCE); >- if(toref) >- out << YAML::Key << "to_reference" << YAML::Value << toref; >- >- ConstTransformRcPtr fromref = \ >- cs->getTransform(COLORSPACE_DIR_FROM_REFERENCE); >- if(fromref) >- out << YAML::Key << "from_reference" << YAML::Value << fromref; >+ // Basic types > >- out << YAML::EndMap; >- out << YAML::Newline; >+ inline void load(const YAML::Node& node, bool& x) >+ { >+#ifdef OLDYAML >+ node.Read<bool>(x); >+#else >+ x = node.as<bool>(); >+#endif >+ } > >- return out; >- } >- >- >- /////////////////////////////////////////////////////////////////////////// >- >- // Look. (not the transform, the top-level class) >- >- void operator >> (const YAML::Node& node, LookRcPtr& look) >- { >- if(node.Tag() != "Look") >- return; >+ inline void load(const YAML::Node& node, int& x) >+ { >+#ifdef OLDYAML >+ node.Read<int>(x); >+#else >+ x = node.as<int>(); >+#endif >+ } > >- std::string key, stringval; >+ inline void load(const YAML::Node& node, float& x) >+ { >+#ifdef OLDYAML >+ node.Read<float>(x); >+#else >+ x = node.as<float>(); >+#endif >+ } > >- for (YAML::Iterator iter = node.begin(); >- iter != node.end(); >- ++iter) >+ inline void load(const YAML::Node& node, std::string& x) > { >- iter.first() >> key; >- >- if(key == "name") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- look->setName(stringval.c_str()); >- } >- else if(key == "process_space") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- look->setProcessSpace(stringval.c_str()); >- } >- else if(key == "transform") >- { >- TransformRcPtr val; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<TransformRcPtr>(val)) >- look->setTransform(val); >- } >- else if(key == "inverse_transform") >- { >- TransformRcPtr val; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<TransformRcPtr>(val)) >- look->setInverseTransform(val); >- } >- else >- { >- LogUnknownKeyWarning(node.Tag(), iter.first()); >- } >+#ifdef OLDYAML >+ node.Read<std::string>(x); >+#else >+ x = node.as<std::string>(); >+#endif > } >- } >- >- YAML::Emitter& operator << (YAML::Emitter& out, LookRcPtr look) >- { >- out << YAML::VerbatimTag("Look"); >- out << YAML::BeginMap; >- out << YAML::Key << "name" << YAML::Value << look->getName(); >- out << YAML::Key << "process_space" << YAML::Value << look->getProcessSpace(); > >- if(look->getTransform()) >+ inline void load(const YAML::Node& node, std::vector<std::string>& x) > { >- out << YAML::Key << "transform"; >- out << YAML::Value << look->getTransform(); >+#ifdef OLDYAML >+ node >> x; >+#else >+ x = node.as<std::vector<std::string> >(); >+#endif > } > >- if(look->getInverseTransform()) >+ inline void load(const YAML::Node& node, std::vector<float>& x) > { >- out << YAML::Key << "inverse_transform"; >- out << YAML::Value << look->getInverseTransform(); >+#ifdef OLDYAML >+ node >> x; >+#else >+ x = node.as<std::vector<float> >(); >+#endif > } > >- out << YAML::EndMap; >- out << YAML::Newline; >+ // Enums > >- return out; >- } >- >- >- >- /////////////////////////////////////////////////////////////////////////// >- >- >- namespace >- { >- void EmitBaseTransformKeyValues(YAML::Emitter & out, >- const ConstTransformRcPtr & t) >+ inline void load(const YAML::Node& node, BitDepth& depth) > { >- if(t->getDirection() != TRANSFORM_DIR_FORWARD) >- { >- out << YAML::Key << "direction"; >- out << YAML::Value << YAML::Flow << t->getDirection(); >- } >+ std::string str; >+ load(node, str); >+ depth = BitDepthFromString(str.c_str()); > } >- } >- >- void operator >> (const YAML::Node& node, TransformRcPtr& t) >- { >- if(node.Type() != YAML::NodeType::Map) >+ >+ inline void save(YAML::Emitter& out, BitDepth depth) > { >- std::ostringstream os; >- os << "Unsupported Transform type encountered: (" << node.Type() << ") in OCIO profile. "; >- os << "Only Mapping types supported. (line "; >- os << (node.GetMark().line+1) << ", column "; // (yaml line numbers start at 0) >- os << node.GetMark().column << ")"; >- throw Exception(os.str().c_str()); >+ out << BitDepthToString(depth); > } > >- std::string type = node.Tag(); >- >- if(type == "AllocationTransform") { >- AllocationTransformRcPtr temp; >- node.Read<AllocationTransformRcPtr>(temp); >- t = temp; >- } >- else if(type == "CDLTransform") { >- CDLTransformRcPtr temp; >- node.Read<CDLTransformRcPtr>(temp); >- t = temp; >- } >- else if(type == "ColorSpaceTransform") { >- ColorSpaceTransformRcPtr temp; >- node.Read<ColorSpaceTransformRcPtr>(temp); >- t = temp; >- } >- // TODO: DisplayTransform >- else if(type == "ExponentTransform") { >- ExponentTransformRcPtr temp; >- node.Read<ExponentTransformRcPtr>(temp); >- t = temp; >- } >- else if(type == "FileTransform") { >- FileTransformRcPtr temp; >- node.Read<FileTransformRcPtr>(temp); >- t = temp; >- } >- else if(type == "GroupTransform") { >- GroupTransformRcPtr temp; >- node.Read<GroupTransformRcPtr>(temp); >- t = temp; >- } >- else if(type == "LogTransform") { >- LogTransformRcPtr temp; >- node.Read<LogTransformRcPtr>(temp); >- t = temp; >- } >- else if(type == "LookTransform") { >- LookTransformRcPtr temp; >- node.Read<LookTransformRcPtr>(temp); >- t = temp; >- } >- else if(type == "MatrixTransform") { >- MatrixTransformRcPtr temp; >- node.Read<MatrixTransformRcPtr>(temp); >- t = temp; >- } >- else if(type == "TruelightTransform") { >- TruelightTransformRcPtr temp; >- node.Read<TruelightTransformRcPtr>(temp); >- t = temp; >- } >- else >- { >- // TODO: add a new empty (better name?) aka passthru Transform() >- // which does nothing. This is so upsupported !<tag> types don't >- // throw an exception. Alternativly this could be caught in the >- // GroupTransformRcPtr >> operator with some type of >- // supported_tag() method >- >- // TODO: consider the forwards-compatibility implication of >- // throwing an exception. Should this be a warning, instead? >- >- // t = EmptyTransformRcPtr(new EmptyTransform(), &deleter); >- std::ostringstream os; >- os << "Unsupported transform type !<" << type << "> in OCIO profile. "; >- os << " (line "; >- os << (node.GetMark().line+1) << ", column "; // (yaml line numbers start at 0) >- os << node.GetMark().column << ")"; >- throw Exception(os.str().c_str()); >+ inline void load(const YAML::Node& node, Allocation& alloc) >+ { >+ std::string str; >+ load(node, str); >+ alloc = AllocationFromString(str.c_str()); > } >- } >- >- YAML::Emitter& operator << (YAML::Emitter& out, ConstTransformRcPtr t) >- { >- if(ConstAllocationTransformRcPtr Allocation_tran = \ >- DynamicPtrCast<const AllocationTransform>(t)) >- out << Allocation_tran; >- else if(ConstCDLTransformRcPtr CDL_tran = \ >- DynamicPtrCast<const CDLTransform>(t)) >- out << CDL_tran; >- else if(ConstColorSpaceTransformRcPtr ColorSpace_tran = \ >- DynamicPtrCast<const ColorSpaceTransform>(t)) >- out << ColorSpace_tran; >- else if(ConstExponentTransformRcPtr Exponent_tran = \ >- DynamicPtrCast<const ExponentTransform>(t)) >- out << Exponent_tran; >- else if(ConstFileTransformRcPtr File_tran = \ >- DynamicPtrCast<const FileTransform>(t)) >- out << File_tran; >- else if(ConstGroupTransformRcPtr Group_tran = \ >- DynamicPtrCast<const GroupTransform>(t)) >- out << Group_tran; >- else if(ConstLogTransformRcPtr Log_tran = \ >- DynamicPtrCast<const LogTransform>(t)) >- out << Log_tran; >- else if(ConstLookTransformRcPtr Look_tran = \ >- DynamicPtrCast<const LookTransform>(t)) >- out << Look_tran; >- else if(ConstMatrixTransformRcPtr Matrix_tran = \ >- DynamicPtrCast<const MatrixTransform>(t)) >- out << Matrix_tran; >- else if(ConstTruelightTransformRcPtr Truelight_tran = \ >- DynamicPtrCast<const TruelightTransform>(t)) >- out << Truelight_tran; >- else >- throw Exception("Unsupported Transform() type for serialization."); > >- return out; >- } >- >- >- /////////////////////////////////////////////////////////////////////////// >- // Transforms >- >- void operator >> (const YAML::Node& node, GroupTransformRcPtr& t) >- { >- t = GroupTransform::Create(); >+ inline void save(YAML::Emitter& out, Allocation alloc) >+ { >+ out << AllocationToString(alloc); >+ } > >- std::string key; >+ inline void load(const YAML::Node& node, ColorSpaceDirection& dir) >+ { >+ std::string str; >+ load(node, str); >+ dir = ColorSpaceDirectionFromString(str.c_str()); >+ } > >- for (YAML::Iterator iter = node.begin(); >- iter != node.end(); >- ++iter) >+ inline void save(YAML::Emitter& out, ColorSpaceDirection dir) > { >- iter.first() >> key; >- >- if(key == "children") >- { >- const YAML::Node & children = iter.second(); >- for(unsigned i = 0; i <children.size(); ++i) >- { >- TransformRcPtr childTransform; >- children[i].Read<TransformRcPtr>(childTransform); >- >- // TODO: consider the forwards-compatibility implication of >- // throwing an exception. Should this be a warning, instead? >- if(!childTransform) >- { >- throw Exception("Child transform could not be parsed."); >- } >- >- t->push_back(childTransform); >- } >- } >- else if(key == "direction") >- { >- TransformDirection val; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<TransformDirection>(val)) >- t->setDirection(val); >- } >- else >- { >- LogUnknownKeyWarning(node.Tag(), iter.first()); >- } >+ out << ColorSpaceDirectionToString(dir); > } >- } >- >- YAML::Emitter& operator << (YAML::Emitter& out, ConstGroupTransformRcPtr t) >- { >- out << YAML::VerbatimTag("GroupTransform"); >- out << YAML::BeginMap; >- EmitBaseTransformKeyValues(out, t); > >- out << YAML::Key << "children"; >- out << YAML::Value; >+ inline void load(const YAML::Node& node, TransformDirection& dir) >+ { >+ std::string str; >+ load(node, str); >+ dir = TransformDirectionFromString(str.c_str()); >+ } > >- out << YAML::BeginSeq; >- for(int i = 0; i < t->size(); ++i) >+ inline void save(YAML::Emitter& out, TransformDirection dir) > { >- out << t->getTransform(i); >+ out << TransformDirectionToString(dir); > } >- out << YAML::EndSeq; > >- out << YAML::EndMap; >+ inline void load(const YAML::Node& node, Interpolation& interp) >+ { >+ std::string str; >+ load(node, str); >+ interp = InterpolationFromString(str.c_str()); >+ } > >- return out; >- } >- >- >- >- void operator >> (const YAML::Node& node, FileTransformRcPtr& t) >- { >- t = FileTransform::Create(); >+ inline void save(YAML::Emitter& out, Interpolation interp) >+ { >+ out << InterpolationToString(interp); >+ } > >- std::string key, stringval; >+ // > >- for (YAML::Iterator iter = node.begin(); >- iter != node.end(); >- ++iter) >+ inline void LogUnknownKeyWarning(const std::string & name, >+ const YAML::Node& tag) > { >- iter.first() >> key; >- >- if(key == "src") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- t->setSrc(stringval.c_str()); >- } >- else if(key == "cccid") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- t->setCCCId(stringval.c_str()); >- } >- else if(key == "interpolation") >- { >- Interpolation val; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<Interpolation>(val)) >- t->setInterpolation(val); >- } >- else if(key == "direction") >- { >- TransformDirection val; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<TransformDirection>(val)) >- t->setDirection(val); >- } >- else >- { >- LogUnknownKeyWarning(node.Tag(), iter.first()); >- } >+ std::string key; >+ load(tag, key); >+ >+ std::ostringstream os; >+ os << "Unknown key in " << name << ": '" << key << "'."; >+ LogWarning(os.str()); > } >- } >- >- YAML::Emitter& operator << (YAML::Emitter& out, ConstFileTransformRcPtr t) >- { >- out << YAML::VerbatimTag("FileTransform"); >- out << YAML::Flow << YAML::BeginMap; >- out << YAML::Key << "src" << YAML::Value << t->getSrc(); >- const char * cccid = t->getCCCId(); >- if(cccid && *cccid) >- { >- out << YAML::Key << "cccid" << YAML::Value << t->getCCCId(); >- } >- out << YAML::Key << "interpolation"; >- out << YAML::Value << t->getInterpolation(); >- >- EmitBaseTransformKeyValues(out, t); >- out << YAML::EndMap; >- return out; >- } >- >- void operator >> (const YAML::Node& node, ColorSpaceTransformRcPtr& t) >- { >- t = ColorSpaceTransform::Create(); > >- std::string key, stringval; >+ // View > >- for (YAML::Iterator iter = node.begin(); >- iter != node.end(); >- ++iter) >+ inline void load(const YAML::Node& node, View& v) > { >- iter.first() >> key; >+ if(node.Tag() != "View") >+ return; > >- if(key == "src") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- t->setSrc(stringval.c_str()); >- } >- else if(key == "dst") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- t->setDst(stringval.c_str()); >+ std::string key, stringval; >+ >+ for (Iterator iter = node.begin(); >+ iter != node.end(); >+ ++iter) >+ { >+ const YAML::Node& first = get_first(iter); >+ const YAML::Node& second = get_second(iter); >+ >+ load(first, key); >+ >+ if (second.Type() == YAML::NodeType::Null) continue; >+ >+ if(key == "name") >+ { >+ load(second, stringval); >+ v.name = stringval; >+ } >+ else if(key == "colorspace") >+ { >+ load(second, stringval); >+ v.colorspace = stringval; >+ } >+ else if(key == "looks" || key == "look") >+ { >+ load(second, stringval); >+ v.looks = stringval; >+ } >+ else >+ { >+ LogUnknownKeyWarning(node.Tag(), first); >+ } > } >- else if(key == "direction") >+ >+ if(v.name.empty()) > { >- TransformDirection val; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<TransformDirection>(val)) >- t->setDirection(val); >+ throw Exception("View does not specify 'name'."); > } >- else >+ if(v.colorspace.empty()) > { >- LogUnknownKeyWarning(node.Tag(), iter.first()); >+ std::ostringstream os; >+ os << "View '" << v.name << "' "; >+ os << "does not specify colorspace."; >+ throw Exception(os.str().c_str()); > } > } >- } >- >- YAML::Emitter& operator << (YAML::Emitter& out, ConstColorSpaceTransformRcPtr t) >- { >- out << YAML::VerbatimTag("ColorSpaceTransform"); >- out << YAML::Flow << YAML::BeginMap; >- out << YAML::Key << "src" << YAML::Value << t->getSrc(); >- out << YAML::Key << "dst" << YAML::Value << t->getDst(); >- EmitBaseTransformKeyValues(out, t); >- out << YAML::EndMap; >- return out; >- } >- >- void operator >> (const YAML::Node& node, LookTransformRcPtr& t) >- { >- t = LookTransform::Create(); > >- std::string key, stringval; >+ inline void save(YAML::Emitter& out, View view) >+ { >+ out << YAML::VerbatimTag("View"); >+ out << YAML::Flow; >+ out << YAML::BeginMap; >+ out << YAML::Key << "name" << YAML::Value << view.name; >+ out << YAML::Key << "colorspace" << YAML::Value << view.colorspace; >+ if(!view.looks.empty()) out << YAML::Key << "looks" << YAML::Value << view.looks; >+ out << YAML::EndMap; >+ } >+ >+ // Common Transform > >- for (YAML::Iterator iter = node.begin(); >- iter != node.end(); >- ++iter) >+ inline void EmitBaseTransformKeyValues(YAML::Emitter & out, >+ const ConstTransformRcPtr & t) > { >- iter.first() >> key; >- >- if(key == "src") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- t->setSrc(stringval.c_str()); >- } >- else if(key == "dst") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- t->setDst(stringval.c_str()); >- } >- else if(key == "looks") >- { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- t->setLooks(stringval.c_str()); >- } >- else if(key == "direction") >- { >- TransformDirection val; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<TransformDirection>(val)) >- t->setDirection(val); >- } >- else >+ if(t->getDirection() != TRANSFORM_DIR_FORWARD) > { >- LogUnknownKeyWarning(node.Tag(), iter.first()); >+ out << YAML::Key << "direction"; >+ out << YAML::Value << YAML::Flow; >+ save(out, t->getDirection()); > } > } >- } >- >- YAML::Emitter& operator << (YAML::Emitter& out, ConstLookTransformRcPtr t) >- { >- out << YAML::VerbatimTag("LookTransform"); >- out << YAML::Flow << YAML::BeginMap; >- out << YAML::Key << "src" << YAML::Value << t->getSrc(); >- out << YAML::Key << "dst" << YAML::Value << t->getDst(); >- out << YAML::Key << "looks" << YAML::Value << t->getLooks(); >- EmitBaseTransformKeyValues(out, t); >- out << YAML::EndMap; >- return out; >- } >- >- void operator >> (const YAML::Node& node, ExponentTransformRcPtr& t) >- { >- t = ExponentTransform::Create(); > >- std::string key; >+ // AllocationTransform > >- for (YAML::Iterator iter = node.begin(); >- iter != node.end(); >- ++iter) >+ inline void load(const YAML::Node& node, AllocationTransformRcPtr& t) > { >- iter.first() >> key; >+ t = AllocationTransform::Create(); > >- if(key == "value") >- { >- std::vector<float> val; >- if (iter.second().Type() != YAML::NodeType::Null) >+ std::string key; >+ >+ for (Iterator iter = node.begin(); >+ iter != node.end(); >+ ++iter) >+ { >+ const YAML::Node& first = get_first(iter); >+ const YAML::Node& second = get_second(iter); >+ >+ load(first, key); >+ >+ if (second.Type() == YAML::NodeType::Null) continue; >+ >+ if(key == "allocation") > { >- iter.second() >> val; >- if(val.size() != 4) >+ Allocation val; >+ load(second, val); >+ t->setAllocation(val); >+ } >+ else if(key == "vars") >+ { >+ std::vector<float> val; >+ load(second, val); >+ if(!val.empty()) > { >- std::ostringstream os; >- os << "ExponentTransform parse error, value field must be 4 "; >- os << "floats. Found '" << val.size() << "'."; >- throw Exception(os.str().c_str()); >+ t->setVars(static_cast<int>(val.size()), &val[0]); > } >- t->setValue(&val[0]); > } >- } >- else if(key == "direction") >- { >- TransformDirection val; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<TransformDirection>(val)) >- t->setDirection(val); >- } >- else >- { >- LogUnknownKeyWarning(node.Tag(), iter.first()); >+ else if(key == "direction") >+ { >+ TransformDirection val; >+ load(second, val); >+ t->setDirection(val); >+ } >+ else >+ { >+ LogUnknownKeyWarning(node.Tag(), first); >+ } > } > } >- } >- >- YAML::Emitter& operator << (YAML::Emitter& out, ConstExponentTransformRcPtr t) >- { >- out << YAML::VerbatimTag("ExponentTransform"); >- out << YAML::Flow << YAML::BeginMap; >- >- std::vector<float> value(4, 0.0); >- t->getValue(&value[0]); >- out << YAML::Key << "value"; >- out << YAML::Value << YAML::Flow << value; >- EmitBaseTransformKeyValues(out, t); >- out << YAML::EndMap; >- return out; >- } >- >- void operator >> (const YAML::Node& node, LogTransformRcPtr& t) >- { >- t = LogTransform::Create(); > >- std::string key; >- >- for (YAML::Iterator iter = node.begin(); >- iter != node.end(); >- ++iter) >+ inline void save(YAML::Emitter& out, ConstAllocationTransformRcPtr t) > { >- iter.first() >> key; >+ out << YAML::VerbatimTag("AllocationTransform"); >+ out << YAML::Flow << YAML::BeginMap; > >- if(key == "base") >- { >- float val = 0.0f; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<float>(val)) >- t->setBase(val); >- } >- else if(key == "direction") >- { >- TransformDirection val; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<TransformDirection>(val)) >- t->setDirection(val); >- } >- else >+ out << YAML::Key << "allocation"; >+ out << YAML::Value << YAML::Flow; >+ save(out, t->getAllocation()); >+ >+ if(t->getNumVars() > 0) > { >- LogUnknownKeyWarning(node.Tag(), iter.first()); >+ std::vector<float> vars(t->getNumVars()); >+ t->getVars(&vars[0]); >+ out << YAML::Key << "vars"; >+ out << YAML::Flow << YAML::Value << vars; > } >+ >+ EmitBaseTransformKeyValues(out, t); >+ out << YAML::EndMap; > } >- } >- >- YAML::Emitter& operator << (YAML::Emitter& out, ConstLogTransformRcPtr t) >- { >- out << YAML::VerbatimTag("LogTransform"); >- out << YAML::Flow << YAML::BeginMap; >- out << YAML::Key << "base" << YAML::Value << t->getBase(); >- EmitBaseTransformKeyValues(out, t); >- out << YAML::EndMap; >- return out; >- } >- >- void operator >> (const YAML::Node& node, MatrixTransformRcPtr& t) >- { >- t = MatrixTransform::Create(); > >- std::string key; >+ // CDLTransform > >- for (YAML::Iterator iter = node.begin(); >- iter != node.end(); >- ++iter) >+ inline void load(const YAML::Node& node, CDLTransformRcPtr& t) > { >- iter.first() >> key; >+ t = CDLTransform::Create(); > >- if(key == "matrix") >- { >- std::vector<float> val; >- if (iter.second().Type() != YAML::NodeType::Null) >+ std::string key; >+ std::vector<float> floatvecval; >+ >+ for (Iterator iter = node.begin(); >+ iter != node.end(); >+ ++iter) >+ { >+ const YAML::Node& first = get_first(iter); >+ const YAML::Node& second = get_second(iter); >+ >+ load(first, key); >+ >+ if (second.Type() == YAML::NodeType::Null) continue; >+ >+ if(key == "slope") > { >- iter.second() >> val; >- if(val.size() != 16) >+ load(second, floatvecval); >+ if(floatvecval.size() != 3) > { > std::ostringstream os; >- os << "MatrixTransform parse error, matrix field must be 16 "; >- os << "floats. Found '" << val.size() << "'."; >+ os << "CDLTransform parse error, 'slope' field must be 3 "; >+ os << "floats. Found '" << floatvecval.size() << "'."; > throw Exception(os.str().c_str()); > } >- t->setMatrix(&val[0]); >+ t->setSlope(&floatvecval[0]); > } >- } >- else if(key == "offset") >- { >- std::vector<float> val; >- if (iter.second().Type() != YAML::NodeType::Null) >+ else if(key == "offset") > { >- iter.second() >> val; >- if(val.size() != 4) >+ load(second, floatvecval); >+ if(floatvecval.size() != 3) > { > std::ostringstream os; >- os << "MatrixTransform parse error, offset field must be 4 "; >- os << "floats. Found '" << val.size() << "'."; >+ os << "CDLTransform parse error, 'offset' field must be 3 "; >+ os << "floats. Found '" << floatvecval.size() << "'."; > throw Exception(os.str().c_str()); > } >- t->setOffset(&val[0]); >+ t->setOffset(&floatvecval[0]); >+ } >+ else if(key == "power") >+ { >+ load(second, floatvecval); >+ if(floatvecval.size() != 3) >+ { >+ std::ostringstream os; >+ os << "CDLTransform parse error, 'power' field must be 3 "; >+ os << "floats. Found '" << floatvecval.size() << "'."; >+ throw Exception(os.str().c_str()); >+ } >+ t->setPower(&floatvecval[0]); >+ } >+ else if(key == "saturation" || key == "sat") >+ { >+ float val = 0.0f; >+ load(second, val); >+ t->setSat(val); >+ } >+ else if(key == "direction") >+ { >+ TransformDirection val; >+ load(second, val); >+ t->setDirection(val); >+ } >+ else >+ { >+ LogUnknownKeyWarning(node.Tag(), first); > } > } >- else if(key == "direction") >+ } >+ >+ inline void save(YAML::Emitter& out, ConstCDLTransformRcPtr t) >+ { >+ out << YAML::VerbatimTag("CDLTransform"); >+ out << YAML::Flow << YAML::BeginMap; >+ >+ std::vector<float> slope(3); >+ t->getSlope(&slope[0]); >+ if(!IsVecEqualToOne(&slope[0], 3)) > { >- TransformDirection val; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<TransformDirection>(val)) >- t->setDirection(val); >+ out << YAML::Key << "slope"; >+ out << YAML::Value << YAML::Flow << slope; > } >- else >+ >+ std::vector<float> offset(3); >+ t->getOffset(&offset[0]); >+ if(!IsVecEqualToZero(&offset[0], 3)) >+ { >+ out << YAML::Key << "offset"; >+ out << YAML::Value << YAML::Flow << offset; >+ } >+ >+ std::vector<float> power(3); >+ t->getPower(&power[0]); >+ if(!IsVecEqualToOne(&power[0], 3)) > { >- LogUnknownKeyWarning(node.Tag(), iter.first()); >+ out << YAML::Key << "power"; >+ out << YAML::Value << YAML::Flow << power; > } >+ >+ if(!IsScalarEqualToOne(t->getSat())) >+ { >+ out << YAML::Key << "sat" << YAML::Value << t->getSat(); >+ } >+ >+ EmitBaseTransformKeyValues(out, t); >+ out << YAML::EndMap; > } >- } >- >- YAML::Emitter& operator << (YAML::Emitter& out, ConstMatrixTransformRcPtr t) >- { >- out << YAML::VerbatimTag("MatrixTransform"); >- out << YAML::Flow << YAML::BeginMap; > >- std::vector<float> matrix(16, 0.0); >- t->getMatrix(&matrix[0]); >- if(!IsM44Identity(&matrix[0])) >+ // ColorSpaceTransform >+ >+ inline void load(const YAML::Node& node, ColorSpaceTransformRcPtr& t) > { >- out << YAML::Key << "matrix"; >- out << YAML::Value << YAML::Flow << matrix; >+ t = ColorSpaceTransform::Create(); >+ >+ std::string key, stringval; >+ >+ for (Iterator iter = node.begin(); >+ iter != node.end(); >+ ++iter) >+ { >+ const YAML::Node& first = get_first(iter); >+ const YAML::Node& second = get_second(iter); >+ >+ load(first, key); >+ >+ if (second.Type() == YAML::NodeType::Null) continue; >+ >+ if(key == "src") >+ { >+ load(second, stringval); >+ t->setSrc(stringval.c_str()); >+ } >+ else if(key == "dst") >+ { >+ load(second, stringval); >+ t->setDst(stringval.c_str()); >+ } >+ else if(key == "direction") >+ { >+ TransformDirection val; >+ load(second, val); >+ t->setDirection(val); >+ } >+ else >+ { >+ LogUnknownKeyWarning(node.Tag(), first); >+ } >+ } > } > >- std::vector<float> offset(4, 0.0); >- t->getOffset(&offset[0]); >- if(!IsVecEqualToZero(&offset[0],4)) >+ inline void save(YAML::Emitter& out, ConstColorSpaceTransformRcPtr t) > { >- out << YAML::Key << "offset"; >- out << YAML::Value << YAML::Flow << offset; >+ out << YAML::VerbatimTag("ColorSpaceTransform"); >+ out << YAML::Flow << YAML::BeginMap; >+ out << YAML::Key << "src" << YAML::Value << t->getSrc(); >+ out << YAML::Key << "dst" << YAML::Value << t->getDst(); >+ EmitBaseTransformKeyValues(out, t); >+ out << YAML::EndMap; > } > >- EmitBaseTransformKeyValues(out, t); >- out << YAML::EndMap; >- return out; >- } >- >- void operator >> (const YAML::Node& node, CDLTransformRcPtr& t) >- { >- t = CDLTransform::Create(); >+ // ExponentTransform > >- std::string key; >- std::vector<float> floatvecval; >- >- for (YAML::Iterator iter = node.begin(); >- iter != node.end(); >- ++iter) >+ inline void load(const YAML::Node& node, ExponentTransformRcPtr& t) > { >- iter.first() >> key; >+ t = ExponentTransform::Create(); > >- if(key == "slope") >- { >- if (iter.second().Type() != YAML::NodeType::Null) >+ std::string key; >+ >+ for (Iterator iter = node.begin(); >+ iter != node.end(); >+ ++iter) >+ { >+ const YAML::Node& first = get_first(iter); >+ const YAML::Node& second = get_second(iter); >+ >+ load(first, key); >+ >+ if (second.Type() == YAML::NodeType::Null) continue; >+ >+ if(key == "value") > { >- iter.second() >> floatvecval; >- if(floatvecval.size() != 3) >+ std::vector<float> val; >+ load(second, val); >+ if(val.size() != 4) > { > std::ostringstream os; >- os << "CDLTransform parse error, 'slope' field must be 3 "; >- os << "floats. Found '" << floatvecval.size() << "'."; >+ os << "ExponentTransform parse error, value field must be 4 "; >+ os << "floats. Found '" << val.size() << "'."; > throw Exception(os.str().c_str()); > } >- t->setSlope(&floatvecval[0]); >+ t->setValue(&val[0]); >+ } >+ else if(key == "direction") >+ { >+ TransformDirection val; >+ load(second, val); >+ t->setDirection(val); >+ } >+ else >+ { >+ LogUnknownKeyWarning(node.Tag(), first); > } > } >- else if(key == "offset") >- { >- if (iter.second().Type() != YAML::NodeType::Null) >+ } >+ >+ inline void save(YAML::Emitter& out, ConstExponentTransformRcPtr t) >+ { >+ out << YAML::VerbatimTag("ExponentTransform"); >+ out << YAML::Flow << YAML::BeginMap; >+ >+ std::vector<float> value(4, 0.0); >+ t->getValue(&value[0]); >+ out << YAML::Key << "value"; >+ out << YAML::Value << YAML::Flow << value; >+ EmitBaseTransformKeyValues(out, t); >+ out << YAML::EndMap; >+ } >+ >+ // FileTransform >+ >+ inline void load(const YAML::Node& node, FileTransformRcPtr& t) >+ { >+ t = FileTransform::Create(); >+ >+ std::string key, stringval; >+ >+ for (Iterator iter = node.begin(); >+ iter != node.end(); >+ ++iter) >+ { >+ const YAML::Node& first = get_first(iter); >+ const YAML::Node& second = get_second(iter); >+ >+ load(first, key); >+ >+ if (second.Type() == YAML::NodeType::Null) continue; >+ >+ if(key == "src") > { >- iter.second() >> floatvecval; >- if(floatvecval.size() != 3) >- { >- std::ostringstream os; >- os << "CDLTransform parse error, 'offset' field must be 3 "; >- os << "floats. Found '" << floatvecval.size() << "'."; >- throw Exception(os.str().c_str()); >- } >- t->setOffset(&floatvecval[0]); >+ load(second, stringval); >+ t->setSrc(stringval.c_str()); >+ } >+ else if(key == "cccid") >+ { >+ load(second, stringval); >+ t->setCCCId(stringval.c_str()); >+ } >+ else if(key == "interpolation") >+ { >+ Interpolation val; >+ load(second, val); >+ t->setInterpolation(val); >+ } >+ else if(key == "direction") >+ { >+ TransformDirection val; >+ load(second, val); >+ t->setDirection(val); >+ } >+ else >+ { >+ LogUnknownKeyWarning(node.Tag(), first); > } > } >- else if(key == "power") >- { >- if (iter.second().Type() != YAML::NodeType::Null) >+ } >+ >+ inline void save(YAML::Emitter& out, ConstFileTransformRcPtr t) >+ { >+ out << YAML::VerbatimTag("FileTransform"); >+ out << YAML::Flow << YAML::BeginMap; >+ out << YAML::Key << "src" << YAML::Value << t->getSrc(); >+ const char * cccid = t->getCCCId(); >+ if(cccid && *cccid) >+ { >+ out << YAML::Key << "cccid" << YAML::Value << t->getCCCId(); >+ } >+ out << YAML::Key << "interpolation"; >+ out << YAML::Value; >+ save(out, t->getInterpolation()); >+ >+ EmitBaseTransformKeyValues(out, t); >+ out << YAML::EndMap; >+ } >+ >+ // GroupTransform >+ >+ void load(const YAML::Node& node, TransformRcPtr& t); >+ void save(YAML::Emitter& out, ConstTransformRcPtr t); >+ >+ inline void load(const YAML::Node& node, GroupTransformRcPtr& t) >+ { >+ t = GroupTransform::Create(); >+ >+ std::string key; >+ >+ for (Iterator iter = node.begin(); >+ iter != node.end(); >+ ++iter) >+ { >+ const YAML::Node& first = get_first(iter); >+ const YAML::Node& second = get_second(iter); >+ >+ load(first, key); >+ >+ if (second.Type() == YAML::NodeType::Null) continue; >+ >+ if(key == "children") > { >- iter.second() >> floatvecval; >- if(floatvecval.size() != 3) >+ for(unsigned i = 0; i < second.size(); ++i) > { >- std::ostringstream os; >- os << "CDLTransform parse error, 'power' field must be 3 "; >- os << "floats. Found '" << floatvecval.size() << "'."; >- throw Exception(os.str().c_str()); >+ TransformRcPtr childTransform; >+ load(second[i], childTransform); >+ >+ // TODO: consider the forwards-compatibility implication of >+ // throwing an exception. Should this be a warning, instead? >+ if(!childTransform) >+ { >+ throw Exception("Child transform could not be parsed."); >+ } >+ >+ t->push_back(childTransform); > } >- t->setPower(&floatvecval[0]); >+ } >+ else if(key == "direction") >+ { >+ TransformDirection val; >+ load(second, val); >+ t->setDirection(val); >+ } >+ else >+ { >+ LogUnknownKeyWarning(node.Tag(), first); > } > } >- else if(key == "saturation" || key == "sat") >- { >- float val = 0.0f; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<float>(val)) >- t->setSat(val); >- } >- else if(key == "direction") >- { >- TransformDirection val; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<TransformDirection>(val)) >- t->setDirection(val); >- } >- else >+ } >+ >+ inline void save(YAML::Emitter& out, ConstGroupTransformRcPtr t) >+ { >+ out << YAML::VerbatimTag("GroupTransform"); >+ out << YAML::BeginMap; >+ EmitBaseTransformKeyValues(out, t); >+ >+ out << YAML::Key << "children"; >+ out << YAML::Value; >+ >+ out << YAML::BeginSeq; >+ for(int i = 0; i < t->size(); ++i) > { >- LogUnknownKeyWarning(node.Tag(), iter.first()); >+ save(out, t->getTransform(i)); > } >+ out << YAML::EndSeq; >+ >+ out << YAML::EndMap; > } >- } >- >- YAML::Emitter& operator << (YAML::Emitter& out, ConstCDLTransformRcPtr t) >- { >- out << YAML::VerbatimTag("CDLTransform"); >- out << YAML::Flow << YAML::BeginMap; > >- std::vector<float> slope(3); >- t->getSlope(&slope[0]); >- if(!IsVecEqualToOne(&slope[0], 3)) >+ // LogTransform >+ >+ inline void load(const YAML::Node& node, LogTransformRcPtr& t) > { >- out << YAML::Key << "slope"; >- out << YAML::Value << YAML::Flow << slope; >+ t = LogTransform::Create(); >+ >+ std::string key; >+ >+ for (Iterator iter = node.begin(); >+ iter != node.end(); >+ ++iter) >+ { >+ const YAML::Node& first = get_first(iter); >+ const YAML::Node& second = get_second(iter); >+ >+ load(first, key); >+ >+ if (second.Type() == YAML::NodeType::Null) continue; >+ >+ if(key == "base") >+ { >+ float val = 0.0f; >+ load(second, val); >+ t->setBase(val); >+ } >+ else if(key == "direction") >+ { >+ TransformDirection val; >+ load(second, val); >+ t->setDirection(val); >+ } >+ else >+ { >+ LogUnknownKeyWarning(node.Tag(), first); >+ } >+ } > } > >- std::vector<float> offset(3); >- t->getOffset(&offset[0]); >- if(!IsVecEqualToZero(&offset[0], 3)) >+ inline void save(YAML::Emitter& out, ConstLogTransformRcPtr t) > { >- out << YAML::Key << "offset"; >- out << YAML::Value << YAML::Flow << offset; >+ out << YAML::VerbatimTag("LogTransform"); >+ out << YAML::Flow << YAML::BeginMap; >+ out << YAML::Key << "base" << YAML::Value << t->getBase(); >+ EmitBaseTransformKeyValues(out, t); >+ out << YAML::EndMap; > } > >- std::vector<float> power(3); >- t->getPower(&power[0]); >- if(!IsVecEqualToOne(&power[0], 3)) >+ // LookTransform >+ >+ inline void load(const YAML::Node& node, LookTransformRcPtr& t) > { >- out << YAML::Key << "power"; >- out << YAML::Value << YAML::Flow << power; >+ t = LookTransform::Create(); >+ >+ std::string key, stringval; >+ >+ for (Iterator iter = node.begin(); >+ iter != node.end(); >+ ++iter) >+ { >+ const YAML::Node& first = get_first(iter); >+ const YAML::Node& second = get_second(iter); >+ >+ load(first, key); >+ >+ if (second.Type() == YAML::NodeType::Null) continue; >+ >+ if(key == "src") >+ { >+ load(second, stringval); >+ t->setSrc(stringval.c_str()); >+ } >+ else if(key == "dst") >+ { >+ load(second, stringval); >+ t->setDst(stringval.c_str()); >+ } >+ else if(key == "looks") >+ { >+ load(second, stringval); >+ t->setLooks(stringval.c_str()); >+ } >+ else if(key == "direction") >+ { >+ TransformDirection val; >+ load(second, val); >+ t->setDirection(val); >+ } >+ else >+ { >+ LogUnknownKeyWarning(node.Tag(), first); >+ } >+ } > } > >- if(!IsScalarEqualToOne(t->getSat())) >+ inline void save(YAML::Emitter& out, ConstLookTransformRcPtr t) > { >- out << YAML::Key << "sat" << YAML::Value << t->getSat(); >+ out << YAML::VerbatimTag("LookTransform"); >+ out << YAML::Flow << YAML::BeginMap; >+ out << YAML::Key << "src" << YAML::Value << t->getSrc(); >+ out << YAML::Key << "dst" << YAML::Value << t->getDst(); >+ out << YAML::Key << "looks" << YAML::Value << t->getLooks(); >+ EmitBaseTransformKeyValues(out, t); >+ out << YAML::EndMap; > } > >- EmitBaseTransformKeyValues(out, t); >- out << YAML::EndMap; >- return out; >- } >- >- void operator >> (const YAML::Node& node, AllocationTransformRcPtr& t) >- { >- t = AllocationTransform::Create(); >- >- std::string key; >+ // MatrixTransform > >- for (YAML::Iterator iter = node.begin(); >- iter != node.end(); >- ++iter) >+ inline void load(const YAML::Node& node, MatrixTransformRcPtr& t) > { >- iter.first() >> key; >+ t = MatrixTransform::Create(); > >- if(key == "allocation") >- { >- Allocation val; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<Allocation>(val)) >- t->setAllocation(val); >- } >- else if(key == "vars") >- { >- std::vector<float> val; >- if (iter.second().Type() != YAML::NodeType::Null) >+ std::string key; >+ >+ for (Iterator iter = node.begin(); >+ iter != node.end(); >+ ++iter) >+ { >+ const YAML::Node& first = get_first(iter); >+ const YAML::Node& second = get_second(iter); >+ >+ load(first, key); >+ >+ if (second.Type() == YAML::NodeType::Null) continue; >+ >+ if(key == "matrix") > { >- iter.second() >> val; >- if(!val.empty()) >+ std::vector<float> val; >+ load(second, val); >+ if(val.size() != 16) > { >- t->setVars(static_cast<int>(val.size()), &val[0]); >+ std::ostringstream os; >+ os << "MatrixTransform parse error, matrix field must be 16 "; >+ os << "floats. Found '" << val.size() << "'."; >+ throw Exception(os.str().c_str()); > } >+ t->setMatrix(&val[0]); >+ } >+ else if(key == "offset") >+ { >+ std::vector<float> val; >+ load(second, val); >+ if(val.size() != 4) >+ { >+ std::ostringstream os; >+ os << "MatrixTransform parse error, offset field must be 4 "; >+ os << "floats. Found '" << val.size() << "'."; >+ throw Exception(os.str().c_str()); >+ } >+ t->setOffset(&val[0]); >+ } >+ else if(key == "direction") >+ { >+ TransformDirection val; >+ load(second, val); >+ t->setDirection(val); >+ } >+ else >+ { >+ LogUnknownKeyWarning(node.Tag(), first); > } > } >- else if(key == "direction") >+ } >+ >+ inline void save(YAML::Emitter& out, ConstMatrixTransformRcPtr t) >+ { >+ out << YAML::VerbatimTag("MatrixTransform"); >+ out << YAML::Flow << YAML::BeginMap; >+ >+ std::vector<float> matrix(16, 0.0); >+ t->getMatrix(&matrix[0]); >+ if(!IsM44Identity(&matrix[0])) > { >- TransformDirection val; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<TransformDirection>(val)) >- t->setDirection(val); >+ out << YAML::Key << "matrix"; >+ out << YAML::Value << YAML::Flow << matrix; > } >- else >+ >+ std::vector<float> offset(4, 0.0); >+ t->getOffset(&offset[0]); >+ if(!IsVecEqualToZero(&offset[0],4)) > { >- LogUnknownKeyWarning(node.Tag(), iter.first()); >+ out << YAML::Key << "offset"; >+ out << YAML::Value << YAML::Flow << offset; > } >+ >+ EmitBaseTransformKeyValues(out, t); >+ out << YAML::EndMap; > } >- } >- >- YAML::Emitter& operator << (YAML::Emitter& out, ConstAllocationTransformRcPtr t) >- { >- out << YAML::VerbatimTag("AllocationTransform"); >- out << YAML::Flow << YAML::BeginMap; > >- out << YAML::Key << "allocation"; >- out << YAML::Value << YAML::Flow << t->getAllocation(); >+ // TruelightTransform > >- if(t->getNumVars() > 0) >+ inline void load(const YAML::Node& node, TruelightTransformRcPtr& t) > { >- std::vector<float> vars(t->getNumVars()); >- t->getVars(&vars[0]); >- out << YAML::Key << "vars"; >- out << YAML::Flow << YAML::Value << vars; >+ t = TruelightTransform::Create(); >+ >+ std::string key, stringval; >+ >+ for (Iterator iter = node.begin(); >+ iter != node.end(); >+ ++iter) >+ { >+ const YAML::Node& first = get_first(iter); >+ const YAML::Node& second = get_second(iter); >+ >+ load(first, key); >+ >+ if (second.Type() == YAML::NodeType::Null) continue; >+ >+ if(key == "config_root") >+ { >+ load(second, stringval); >+ t->setConfigRoot(stringval.c_str()); >+ } >+ else if(key == "profile") >+ { >+ load(second, stringval); >+ t->setProfile(stringval.c_str()); >+ } >+ else if(key == "camera") >+ { >+ load(second, stringval); >+ t->setCamera(stringval.c_str()); >+ } >+ else if(key == "input_display") >+ { >+ load(second, stringval); >+ t->setInputDisplay(stringval.c_str()); >+ } >+ else if(key == "recorder") >+ { >+ load(second, stringval); >+ t->setRecorder(stringval.c_str()); >+ } >+ else if(key == "print") >+ { >+ load(second, stringval); >+ t->setPrint(stringval.c_str()); >+ } >+ else if(key == "lamp") >+ { >+ load(second, stringval); >+ t->setLamp(stringval.c_str()); >+ } >+ else if(key == "output_camera") >+ { >+ load(second, stringval); >+ t->setOutputCamera(stringval.c_str()); >+ } >+ else if(key == "display") >+ { >+ load(second, stringval); >+ t->setDisplay(stringval.c_str()); >+ } >+ else if(key == "cube_input") >+ { >+ load(second, stringval); >+ t->setCubeInput(stringval.c_str()); >+ } >+ else if(key == "direction") >+ { >+ TransformDirection val; >+ load(second, val); >+ t->setDirection(val); >+ } >+ else >+ { >+ LogUnknownKeyWarning(node.Tag(), first); >+ } >+ } > } > >- EmitBaseTransformKeyValues(out, t); >- out << YAML::EndMap; >- return out; >- } >- >- void operator >> (const YAML::Node& node, TruelightTransformRcPtr& t) >- { >- t = TruelightTransform::Create(); >- >- std::string key, stringval; >- >- for (YAML::Iterator iter = node.begin(); >- iter != node.end(); >- ++iter) >+ inline void save(YAML::Emitter& out, ConstTruelightTransformRcPtr t) > { >- iter.first() >> key; > >- if(key == "config_root") >+ out << YAML::VerbatimTag("TruelightTransform"); >+ out << YAML::Flow << YAML::BeginMap; >+ if(strcmp(t->getConfigRoot(), "") != 0) > { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- t->setConfigRoot(stringval.c_str()); >+ out << YAML::Key << "config_root"; >+ out << YAML::Value << YAML::Flow << t->getConfigRoot(); > } >- else if(key == "profile") >+ if(strcmp(t->getProfile(), "") != 0) > { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- t->setProfile(stringval.c_str()); >+ out << YAML::Key << "profile"; >+ out << YAML::Value << YAML::Flow << t->getProfile(); > } >- else if(key == "camera") >+ if(strcmp(t->getCamera(), "") != 0) > { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- t->setCamera(stringval.c_str()); >+ out << YAML::Key << "camera"; >+ out << YAML::Value << YAML::Flow << t->getCamera(); > } >- else if(key == "input_display") >+ if(strcmp(t->getInputDisplay(), "") != 0) > { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- t->setInputDisplay(stringval.c_str()); >+ out << YAML::Key << "input_display"; >+ out << YAML::Value << YAML::Flow << t->getInputDisplay(); > } >- else if(key == "recorder") >+ if(strcmp(t->getRecorder(), "") != 0) > { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- t->setRecorder(stringval.c_str()); >+ out << YAML::Key << "recorder"; >+ out << YAML::Value << YAML::Flow << t->getRecorder(); > } >- else if(key == "print") >+ if(strcmp(t->getPrint(), "") != 0) > { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- t->setPrint(stringval.c_str()); >+ out << YAML::Key << "print"; >+ out << YAML::Value << YAML::Flow << t->getPrint(); > } >- else if(key == "lamp") >+ if(strcmp(t->getLamp(), "") != 0) > { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- t->setLamp(stringval.c_str()); >+ out << YAML::Key << "lamp"; >+ out << YAML::Value << YAML::Flow << t->getLamp(); > } >- else if(key == "output_camera") >+ if(strcmp(t->getOutputCamera(), "") != 0) > { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- t->setOutputCamera(stringval.c_str()); >+ out << YAML::Key << "output_camera"; >+ out << YAML::Value << YAML::Flow << t->getOutputCamera(); > } >- else if(key == "display") >+ if(strcmp(t->getDisplay(), "") != 0) > { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- t->setDisplay(stringval.c_str()); >+ out << YAML::Key << "display"; >+ out << YAML::Value << YAML::Flow << t->getDisplay(); > } >- else if(key == "cube_input") >+ if(strcmp(t->getCubeInput(), "") != 0) > { >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<std::string>(stringval)) >- t->setCubeInput(stringval.c_str()); >+ out << YAML::Key << "cube_input"; >+ out << YAML::Value << YAML::Flow << t->getCubeInput(); > } >- else if(key == "direction") >+ >+ EmitBaseTransformKeyValues(out, t); >+ >+ out << YAML::EndMap; >+ } >+ >+ // Transform >+ >+ void load(const YAML::Node& node, TransformRcPtr& t) >+ { >+ if(node.Type() != YAML::NodeType::Map) > { >- TransformDirection val; >- if (iter.second().Type() != YAML::NodeType::Null && >- iter.second().Read<TransformDirection>(val)) >- t->setDirection(val); >+ std::ostringstream os; >+ os << "Unsupported Transform type encountered: (" << node.Type() << ") in OCIO profile. "; >+ os << "Only Mapping types supported."; >+ throw Exception(os.str().c_str()); >+ } >+ >+ std::string type = node.Tag(); >+ >+ if(type == "AllocationTransform") { >+ AllocationTransformRcPtr temp; >+ load(node, temp); >+ t = temp; >+ } >+ else if(type == "CDLTransform") { >+ CDLTransformRcPtr temp; >+ load(node, temp); >+ t = temp; >+ } >+ else if(type == "ColorSpaceTransform") { >+ ColorSpaceTransformRcPtr temp; >+ load(node, temp); >+ t = temp; >+ } >+ // TODO: DisplayTransform >+ else if(type == "ExponentTransform") { >+ ExponentTransformRcPtr temp; >+ load(node, temp); >+ t = temp; >+ } >+ else if(type == "FileTransform") { >+ FileTransformRcPtr temp; >+ load(node, temp); >+ t = temp; >+ } >+ else if(type == "GroupTransform") { >+ GroupTransformRcPtr temp; >+ load(node, temp); >+ t = temp; >+ } >+ else if(type == "LogTransform") { >+ LogTransformRcPtr temp; >+ load(node, temp); >+ t = temp; >+ } >+ else if(type == "LookTransform") { >+ LookTransformRcPtr temp; >+ load(node, temp); >+ t = temp; >+ } >+ else if(type == "MatrixTransform") { >+ MatrixTransformRcPtr temp; >+ load(node, temp); >+ t = temp; >+ } >+ else if(type == "TruelightTransform") { >+ TruelightTransformRcPtr temp; >+ load(node, temp); >+ t = temp; > } > else > { >- LogUnknownKeyWarning(node.Tag(), iter.first()); >+ // TODO: add a new empty (better name?) aka passthru Transform() >+ // which does nothing. This is so upsupported !<tag> types don't >+ // throw an exception. Alternativly this could be caught in the >+ // GroupTransformRcPtr >> operator with some type of >+ // supported_tag() method >+ >+ // TODO: consider the forwards-compatibility implication of >+ // throwing an exception. Should this be a warning, instead? >+ >+ // t = EmptyTransformRcPtr(new EmptyTransform(), &deleter); >+ std::ostringstream os; >+ os << "Unsupported transform type !<" << type << "> in OCIO profile. "; >+ throw Exception(os.str().c_str()); > } > } >- } >- >- YAML::Emitter& operator << (YAML::Emitter& out, ConstTruelightTransformRcPtr t) >- { > >- out << YAML::VerbatimTag("TruelightTransform"); >- out << YAML::Flow << YAML::BeginMap; >- if(strcmp(t->getConfigRoot(), "") != 0) >- { >- out << YAML::Key << "config_root"; >- out << YAML::Value << YAML::Flow << t->getConfigRoot(); >- } >- if(strcmp(t->getProfile(), "") != 0) >- { >- out << YAML::Key << "profile"; >- out << YAML::Value << YAML::Flow << t->getProfile(); >- } >- if(strcmp(t->getCamera(), "") != 0) >- { >- out << YAML::Key << "camera"; >- out << YAML::Value << YAML::Flow << t->getCamera(); >- } >- if(strcmp(t->getInputDisplay(), "") != 0) >- { >- out << YAML::Key << "input_display"; >- out << YAML::Value << YAML::Flow << t->getInputDisplay(); >+ void save(YAML::Emitter& out, ConstTransformRcPtr t) >+ { >+ if(ConstAllocationTransformRcPtr Allocation_tran = \ >+ DynamicPtrCast<const AllocationTransform>(t)) >+ save(out, Allocation_tran); >+ else if(ConstCDLTransformRcPtr CDL_tran = \ >+ DynamicPtrCast<const CDLTransform>(t)) >+ save(out, CDL_tran); >+ else if(ConstColorSpaceTransformRcPtr ColorSpace_tran = \ >+ DynamicPtrCast<const ColorSpaceTransform>(t)) >+ save(out, ColorSpace_tran); >+ else if(ConstExponentTransformRcPtr Exponent_tran = \ >+ DynamicPtrCast<const ExponentTransform>(t)) >+ save(out, Exponent_tran); >+ else if(ConstFileTransformRcPtr File_tran = \ >+ DynamicPtrCast<const FileTransform>(t)) >+ save(out, File_tran); >+ else if(ConstGroupTransformRcPtr Group_tran = \ >+ DynamicPtrCast<const GroupTransform>(t)) >+ save(out, Group_tran); >+ else if(ConstLogTransformRcPtr Log_tran = \ >+ DynamicPtrCast<const LogTransform>(t)) >+ save(out, Log_tran); >+ else if(ConstLookTransformRcPtr Look_tran = \ >+ DynamicPtrCast<const LookTransform>(t)) >+ save(out, Look_tran); >+ else if(ConstMatrixTransformRcPtr Matrix_tran = \ >+ DynamicPtrCast<const MatrixTransform>(t)) >+ save(out, Matrix_tran); >+ else if(ConstTruelightTransformRcPtr Truelight_tran = \ >+ DynamicPtrCast<const TruelightTransform>(t)) >+ save(out, Truelight_tran); >+ else >+ throw Exception("Unsupported Transform() type for serialization."); > } >- if(strcmp(t->getRecorder(), "") != 0) >+ >+ // ColorSpace >+ >+ inline void load(const YAML::Node& node, ColorSpaceRcPtr& cs) > { >- out << YAML::Key << "recorder"; >- out << YAML::Value << YAML::Flow << t->getRecorder(); >+ if(node.Tag() != "ColorSpace") >+ return; // not a !<ColorSpace> tag >+ >+ std::string key, stringval; >+ bool boolval; >+ >+ for (Iterator iter = node.begin(); >+ iter != node.end(); >+ ++iter) >+ { >+ const YAML::Node& first = get_first(iter); >+ const YAML::Node& second = get_second(iter); >+ >+ load(first, key); >+ >+ if (second.Type() == YAML::NodeType::Null) continue; >+ >+ if(key == "name") >+ { >+ load(second, stringval); >+ cs->setName(stringval.c_str()); >+ } >+ else if(key == "description") >+ { >+ load(second, stringval); >+ cs->setDescription(stringval.c_str()); >+ } >+ else if(key == "family") >+ { >+ load(second, stringval); >+ cs->setFamily(stringval.c_str()); >+ } >+ else if(key == "equalitygroup") >+ { >+ load(second, stringval); >+ cs->setEqualityGroup(stringval.c_str()); >+ } >+ else if(key == "bitdepth") >+ { >+ BitDepth ret; >+ load(second, ret); >+ cs->setBitDepth(ret); >+ } >+ else if(key == "isdata") >+ { >+ load(second, boolval); >+ cs->setIsData(boolval); >+ } >+ else if(key == "allocation") >+ { >+ Allocation val; >+ load(second, val); >+ cs->setAllocation(val); >+ } >+ else if(key == "allocationvars") >+ { >+ std::vector<float> val; >+ load(second, val); >+ if(!val.empty()) >+ cs->setAllocationVars(static_cast<int>(val.size()), &val[0]); >+ } >+ else if(key == "to_reference") >+ { >+ TransformRcPtr val; >+ load(second, val); >+ cs->setTransform(val, COLORSPACE_DIR_TO_REFERENCE); >+ } >+ else if(key == "from_reference") >+ { >+ TransformRcPtr val; >+ load(second, val); >+ cs->setTransform(val, COLORSPACE_DIR_FROM_REFERENCE); >+ } >+ else >+ { >+ LogUnknownKeyWarning(node.Tag(), first); >+ } >+ } > } >- if(strcmp(t->getPrint(), "") != 0) >+ >+ inline void save(YAML::Emitter& out, ConstColorSpaceRcPtr cs) > { >- out << YAML::Key << "print"; >- out << YAML::Value << YAML::Flow << t->getPrint(); >+ out << YAML::VerbatimTag("ColorSpace"); >+ out << YAML::BeginMap; >+ >+ out << YAML::Key << "name" << YAML::Value << cs->getName(); >+ out << YAML::Key << "family" << YAML::Value << cs->getFamily(); >+ out << YAML::Key << "equalitygroup" << YAML::Value << cs->getEqualityGroup(); >+ out << YAML::Key << "bitdepth" << YAML::Value; >+ save(out, cs->getBitDepth()); >+ if(cs->getDescription() != NULL && strlen(cs->getDescription()) > 0) >+ { >+ out << YAML::Key << "description"; >+ out << YAML::Value << YAML::Literal << cs->getDescription(); >+ } >+ out << YAML::Key << "isdata" << YAML::Value << cs->isData(); >+ >+ out << YAML::Key << "allocation" << YAML::Value; >+ save(out, cs->getAllocation()); >+ if(cs->getAllocationNumVars() > 0) >+ { >+ std::vector<float> allocationvars(cs->getAllocationNumVars()); >+ cs->getAllocationVars(&allocationvars[0]); >+ out << YAML::Key << "allocationvars"; >+ out << YAML::Flow << YAML::Value << allocationvars; >+ } >+ >+ ConstTransformRcPtr toref = \ >+ cs->getTransform(COLORSPACE_DIR_TO_REFERENCE); >+ if(toref) >+ { >+ out << YAML::Key << "to_reference" << YAML::Value; >+ save(out, toref); >+ } >+ >+ ConstTransformRcPtr fromref = \ >+ cs->getTransform(COLORSPACE_DIR_FROM_REFERENCE); >+ if(fromref) >+ { >+ out << YAML::Key << "from_reference" << YAML::Value; >+ save(out, fromref); >+ } >+ >+ out << YAML::EndMap; >+ out << YAML::Newline; > } >- if(strcmp(t->getLamp(), "") != 0) >+ >+ // Look >+ >+ inline void load(const YAML::Node& node, LookRcPtr& look) > { >- out << YAML::Key << "lamp"; >- out << YAML::Value << YAML::Flow << t->getLamp(); >+ if(node.Tag() != "Look") >+ return; >+ >+ std::string key, stringval; >+ >+ for (Iterator iter = node.begin(); >+ iter != node.end(); >+ ++iter) >+ { >+ const YAML::Node& first = get_first(iter); >+ const YAML::Node& second = get_second(iter); >+ >+ load(first, key); >+ >+ if (second.Type() == YAML::NodeType::Null) continue; >+ >+ if(key == "name") >+ { >+ load(second, stringval); >+ look->setName(stringval.c_str()); >+ } >+ else if(key == "process_space") >+ { >+ load(second, stringval); >+ look->setProcessSpace(stringval.c_str()); >+ } >+ else if(key == "transform") >+ { >+ TransformRcPtr val; >+ load(second, val); >+ look->setTransform(val); >+ } >+ else if(key == "inverse_transform") >+ { >+ TransformRcPtr val; >+ load(second, val); >+ look->setInverseTransform(val); >+ } >+ else >+ { >+ LogUnknownKeyWarning(node.Tag(), first); >+ } >+ } > } >- if(strcmp(t->getOutputCamera(), "") != 0) >+ >+ inline void save(YAML::Emitter& out, ConstLookRcPtr look) > { >- out << YAML::Key << "output_camera"; >- out << YAML::Value << YAML::Flow << t->getOutputCamera(); >+ out << YAML::VerbatimTag("Look"); >+ out << YAML::BeginMap; >+ out << YAML::Key << "name" << YAML::Value << look->getName(); >+ out << YAML::Key << "process_space" << YAML::Value << look->getProcessSpace(); >+ >+ if(look->getTransform()) >+ { >+ out << YAML::Key << "transform"; >+ out << YAML::Value; >+ save(out, look->getTransform()); >+ } >+ >+ if(look->getInverseTransform()) >+ { >+ out << YAML::Key << "inverse_transform"; >+ out << YAML::Value; >+ save(out, look->getInverseTransform()); >+ } >+ >+ out << YAML::EndMap; >+ out << YAML::Newline; > } >- if(strcmp(t->getDisplay(), "") != 0) >+ >+ // Config >+ >+ inline void load(const YAML::Node& node, ConfigRcPtr& c, const char* filename) > { >- out << YAML::Key << "display"; >- out << YAML::Value << YAML::Flow << t->getDisplay(); >+ >+ // check profile version >+ int profile_version = 0; >+#ifdef OLDYAML >+ if(node.FindValue("ocio_profile_version") == NULL) >+#else >+ if(node["ocio_profile_version"] == NULL) >+#endif >+ { >+ std::ostringstream os; >+ os << "The specified file "; >+ os << "does not appear to be an OCIO configuration."; >+ throw Exception (os.str().c_str()); >+ } >+ >+ load(node["ocio_profile_version"], profile_version); >+ if(profile_version > 1) >+ { >+ std::ostringstream os; >+ os << "This .ocio config "; >+ if(filename && *filename) >+ { >+ os << " '" << filename << "' "; >+ } >+ os << "is version " << profile_version << ". "; >+ os << "This version of the OpenColorIO library (" << OCIO_VERSION ") "; >+ os << "is not known to be able to load this profile. "; >+ os << "An attempt will be made, but there are no guarantees that the "; >+ os << "results will be accurate. Continue at your own risk."; >+ LogWarning(os.str()); >+ } >+ >+ std::string key, stringval; >+ bool boolval = false; >+ EnvironmentMode mode = ENV_ENVIRONMENT_LOAD_ALL; >+ >+ for (Iterator iter = node.begin(); >+ iter != node.end(); >+ ++iter) >+ { >+ const YAML::Node& first = get_first(iter); >+ const YAML::Node& second = get_second(iter); >+ >+ load(first, key); >+ >+ if (second.Type() == YAML::NodeType::Null) continue; >+ >+ if(key == "ocio_profile_version") { } // Already handled above. >+ else if(key == "environment") >+ { >+ mode = ENV_ENVIRONMENT_LOAD_PREDEFINED; >+ if(second.Type() != YAML::NodeType::Map) >+ { >+ std::ostringstream os; >+ os << "'environment' field needs to be a (name: key) map."; >+ throw Exception(os.str().c_str()); >+ } >+ for (Iterator it = second.begin(); >+ it != second.end(); >+ ++it) >+ { >+ std::string k, v; >+ load(get_first(it), k); >+ load(get_second(it), v); >+ c->addEnvironmentVar(k.c_str(), v.c_str()); >+ } >+ } >+ else if(key == "search_path" || key == "resource_path") >+ { >+ load(second, stringval); >+ c->setSearchPath(stringval.c_str()); >+ } >+ else if(key == "strictparsing") >+ { >+ load(second, boolval); >+ c->setStrictParsingEnabled(boolval); >+ } >+ else if(key == "description") >+ { >+ load(second, stringval); >+ c->setDescription(stringval.c_str()); >+ } >+ else if(key == "luma") >+ { >+ std::vector<float> val; >+ load(second, val); >+ if(val.size() != 3) >+ { >+ std::ostringstream os; >+ os << "'luma' field must be 3 "; >+ os << "floats. Found '" << val.size() << "'."; >+ throw Exception(os.str().c_str()); >+ } >+ c->setDefaultLumaCoefs(&val[0]); >+ } >+ else if(key == "roles") >+ { >+ if(second.Type() != YAML::NodeType::Map) >+ { >+ std::ostringstream os; >+ os << "'roles' field needs to be a (name: key) map."; >+ throw Exception(os.str().c_str()); >+ } >+ for (Iterator it = second.begin(); >+ it != second.end(); >+ ++it) >+ { >+ std::string k, v; >+ load(get_first(it), k); >+ load(get_second(it), v); >+ c->setRole(k.c_str(), v.c_str()); >+ } >+ } >+ else if(key == "displays") >+ { >+ if(second.Type() != YAML::NodeType::Map) >+ { >+ std::ostringstream os; >+ os << "'displays' field needs to be a (name: key) map."; >+ throw Exception(os.str().c_str()); >+ } >+ for (Iterator it = second.begin(); >+ it != second.end(); >+ ++it) >+ { >+ std::string display; >+ load(get_first(it), display); >+ const YAML::Node& dsecond = get_second(it); >+ for(unsigned i = 0; i < dsecond.size(); ++i) >+ { >+ View view; >+ load(dsecond[i], view); >+ c->addDisplay(display.c_str(), view.name.c_str(), >+ view.colorspace.c_str(), view.looks.c_str()); >+ } >+ } >+ } >+ else if(key == "active_displays") >+ { >+ std::vector<std::string> display; >+ load(second, display); >+ std::string displays = JoinStringEnvStyle(display); >+ c->setActiveDisplays(displays.c_str()); >+ } >+ else if(key == "active_views") >+ { >+ std::vector<std::string> view; >+ load(second, view); >+ std::string views = JoinStringEnvStyle(view); >+ c->setActiveViews(views.c_str()); >+ } >+ else if(key == "colorspaces") >+ { >+ if(second.Type() != YAML::NodeType::Sequence) >+ { >+ std::ostringstream os; >+ os << "'colorspaces' field needs to be a (- !<ColorSpace>) list."; >+ throw Exception(os.str().c_str()); >+ } >+ for(unsigned i = 0; i < second.size(); ++i) >+ { >+ if(second[i].Tag() == "ColorSpace") >+ { >+ ColorSpaceRcPtr cs = ColorSpace::Create(); >+ load(second[i], cs); >+ for(int ii = 0; ii < c->getNumColorSpaces(); ++ii) >+ { >+ if(strcmp(c->getColorSpaceNameByIndex(ii), cs->getName()) == 0) >+ { >+ std::ostringstream os; >+ os << "Colorspace with name '" << cs->getName() << "' already defined."; >+ throw Exception(os.str().c_str()); >+ } >+ } >+ c->addColorSpace(cs); >+ } >+ else >+ { >+ std::ostringstream os; >+ os << "Unknown element found in colorspaces:"; >+ os << second[i].Tag() << ". Only ColorSpace(s)"; >+ os << " currently handled."; >+ LogWarning(os.str()); >+ } >+ } >+ } >+ else if(key == "looks") >+ { >+ if(second.Type() != YAML::NodeType::Sequence) >+ { >+ std::ostringstream os; >+ os << "'looks' field needs to be a (- !<Look>) list."; >+ throw Exception(os.str().c_str()); >+ } >+ >+ for(unsigned i = 0; i < second.size(); ++i) >+ { >+ if(second[i].Tag() == "Look") >+ { >+ LookRcPtr look = Look::Create(); >+ load(second[i], look); >+ c->addLook(look); >+ } >+ else >+ { >+ std::ostringstream os; >+ os << "Unknown element found in looks:"; >+ os << second[i].Tag() << ". Only Look(s)"; >+ os << " currently handled."; >+ LogWarning(os.str()); >+ } >+ } >+ } >+ else >+ { >+ LogUnknownKeyWarning("profile", first); >+ } >+ } >+ >+ if(filename) >+ { >+ std::string realfilename = pystring::os::path::abspath(filename); >+ std::string configrootdir = pystring::os::path::dirname(realfilename); >+ c->setWorkingDir(configrootdir.c_str()); >+ } >+ >+ c->setEnvironmentMode(mode); >+ c->loadEnvironment(); >+ >+ if(mode == ENV_ENVIRONMENT_LOAD_ALL) >+ { >+ std::ostringstream os; >+ os << "This .ocio config "; >+ if(filename && *filename) >+ { >+ os << " '" << filename << "' "; >+ } >+ os << "has no environment section defined. The default behaviour is to "; >+ os << "load all environment variables (" << c->getNumEnvironmentVars() << ")"; >+ os << ", which reduces the efficiency of OCIO's caching. Considering "; >+ os << "predefining the environment variables used."; >+ LogDebug(os.str()); >+ } >+ > } >- if(strcmp(t->getCubeInput(), "") != 0) >+ >+ inline void save(YAML::Emitter& out, const Config* c) > { >- out << YAML::Key << "cube_input"; >- out << YAML::Value << YAML::Flow << t->getCubeInput(); >+ out << YAML::Block; >+ out << YAML::BeginMap; >+ out << YAML::Key << "ocio_profile_version" << YAML::Value << 1; >+ out << YAML::Newline; >+#ifndef OLDYAML >+ out << YAML::Newline; >+#endif >+ >+ if(c->getNumEnvironmentVars() > 0) >+ { >+ out << YAML::Key << "environment"; >+ out << YAML::Value << YAML::BeginMap; >+ for(unsigned i = 0; i < c->getNumEnvironmentVars(); ++i) >+ { >+ const char* name = c->getEnvironmentVarNameByIndex(i); >+ out << YAML::Key << name; >+ out << YAML::Value << c->getEnvironmentVarDefault(name); >+ } >+ out << YAML::EndMap; >+ out << YAML::Newline; >+ } >+ out << YAML::Key << "search_path" << YAML::Value << c->getSearchPath(); >+ out << YAML::Key << "strictparsing" << YAML::Value << c->isStrictParsingEnabled(); >+ >+ std::vector<float> luma(3, 0.f); >+ c->getDefaultLumaCoefs(&luma[0]); >+ out << YAML::Key << "luma" << YAML::Value << YAML::Flow << luma; >+ >+ if(c->getDescription() != NULL && strlen(c->getDescription()) > 0) >+ { >+ out << YAML::Newline; >+ out << YAML::Key << "description"; >+ out << YAML::Value << c->getDescription(); >+ out << YAML::Newline; >+ } >+ >+ // Roles >+ out << YAML::Newline; >+#ifndef OLDYAML >+ out << YAML::Newline; >+#endif >+ out << YAML::Key << "roles"; >+ out << YAML::Value << YAML::BeginMap; >+ for(unsigned i = 0; i < c->getNumRoles(); ++i) >+ { >+ const char* role = c->getRoleName(i); >+ out << YAML::Key << role; >+ out << YAML::Value << c->getColorSpace(role)->getName(); >+ } >+ out << YAML::EndMap; >+#ifndef OLDYAML >+ out << YAML::Newline; >+#endif >+ >+ // Displays >+ out << YAML::Newline; >+ out << YAML::Key << "displays"; >+ out << YAML::Value << YAML::BeginMap; >+ for(unsigned i = 0; i < c->getNumDisplays(); ++i) >+ { >+ const char* display = c->getDisplay(i); >+ out << YAML::Key << display; >+ out << YAML::Value << YAML::BeginSeq; >+ for(unsigned v = 0; v < c->getNumViews(display); ++v) >+ { >+ View dview; >+ dview.name = c->getView(display, v); >+ dview.colorspace = c->getDisplayColorSpaceName(display, dview.name.c_str()); >+ if(c->getDisplayLooks(display, dview.name.c_str()) != NULL) >+ dview.looks = c->getDisplayLooks(display, dview.name.c_str()); >+ save(out, dview); >+ >+ } >+ out << YAML::EndSeq; >+ } >+ out << YAML::EndMap; >+ >+#ifndef OLDYAML >+ out << YAML::Newline; >+#endif >+ out << YAML::Newline; >+ out << YAML::Key << "active_displays"; >+ std::vector<std::string> active_displays; >+ if(c->getActiveDisplays() != NULL && strlen(c->getActiveDisplays()) > 0) >+ SplitStringEnvStyle(active_displays, c->getActiveDisplays()); >+ out << YAML::Value << YAML::Flow << active_displays; >+ out << YAML::Key << "active_views"; >+ std::vector<std::string> active_views; >+ if(c->getActiveViews() != NULL && strlen(c->getActiveViews()) > 0) >+ SplitStringEnvStyle(active_views, c->getActiveViews()); >+ out << YAML::Value << YAML::Flow << active_views; >+#ifndef OLDYAML >+ out << YAML::Newline; >+#endif >+ >+ // Looks >+ if(c->getNumLooks() > 0) >+ { >+ out << YAML::Newline; >+ out << YAML::Key << "looks"; >+ out << YAML::Value << YAML::BeginSeq; >+ for(unsigned i = 0; i < c->getNumLooks(); ++i) >+ { >+ const char* name = c->getLookNameByIndex(i); >+ save(out, c->getLook(name)); >+ } >+ out << YAML::EndSeq; >+ out << YAML::Newline; >+ } >+ >+ // ColorSpaces >+ { >+ out << YAML::Newline; >+ out << YAML::Key << "colorspaces"; >+ out << YAML::Value << YAML::BeginSeq; >+ for(unsigned i = 0; i < c->getNumColorSpaces(); ++i) >+ { >+ const char* name = c->getColorSpaceNameByIndex(i); >+ save(out, c->getColorSpace(name)); >+ } >+ out << YAML::EndSeq; >+ } >+ >+ out << YAML::EndMap; > } > >- EmitBaseTransformKeyValues(out, t); >- >- out << YAML::EndMap; >- return out; > } > > /////////////////////////////////////////////////////////////////////////// >- // Enums >- >- YAML::Emitter& operator << (YAML::Emitter& out, BitDepth depth) { >- out << BitDepthToString(depth); >- return out; >- } >- >- void operator >> (const YAML::Node& node, BitDepth& depth) { >- std::string str; >- node.Read<std::string>(str); >- depth = BitDepthFromString(str.c_str()); >- } >- >- YAML::Emitter& operator << (YAML::Emitter& out, Allocation alloc) { >- out << AllocationToString(alloc); >- return out; >- } >- >- void operator >> (const YAML::Node& node, Allocation& alloc) { >- std::string str; >- node.Read<std::string>(str); >- alloc = AllocationFromString(str.c_str()); >- } >- >- YAML::Emitter& operator << (YAML::Emitter& out, ColorSpaceDirection dir) { >- out << ColorSpaceDirectionToString(dir); >- return out; >- } > >- void operator >> (const YAML::Node& node, ColorSpaceDirection& dir) { >- std::string str; >- node.Read<std::string>(str); >- dir = ColorSpaceDirectionFromString(str.c_str()); >- } >- >- YAML::Emitter& operator << (YAML::Emitter& out, TransformDirection dir) { >- out << TransformDirectionToString(dir); >- return out; >- } >- >- void operator >> (const YAML::Node& node, TransformDirection& dir) { >- std::string str; >- node.Read<std::string>(str); >- dir = TransformDirectionFromString(str.c_str()); >- } >- >- YAML::Emitter& operator << (YAML::Emitter& out, Interpolation interp) { >- out << InterpolationToString(interp); >- return out; >+ void OCIOYaml::open(std::istream& istream, ConfigRcPtr& c, const char* filename) const >+ { >+ try >+ { >+#ifdef OLDYAML >+ YAML::Parser parser(istream); >+ YAML::Node node; >+ parser.GetNextDocument(node); >+#else >+ YAML::Node node = YAML::Load(istream); >+#endif >+ load(node, c, filename); >+ } >+ catch(const std::exception & e) >+ { >+ std::ostringstream os; >+ os << "Error: Loading the OCIO profile "; >+ if(filename) os << "'" << filename << "' "; >+ os << "failed. " << e.what(); >+ throw Exception(os.str().c_str()); >+ } > } > >- void operator >> (const YAML::Node& node, Interpolation& interp) { >- std::string str; >- node.Read<std::string>(str); >- interp = InterpolationFromString(str.c_str()); >+ void OCIOYaml::write(std::ostream& ostream, const Config* c) const >+ { >+ YAML::Emitter out; >+ save(out, c); >+ ostream << out.c_str(); > } > > } >diff -Naur a/src/core/OCIOYaml.h b/src/core/OCIOYaml.h >--- a/src/core/OCIOYaml.h 2013-10-08 23:59:34.000000000 +0100 >+++ b/src/core/OCIOYaml.h 2014-09-11 20:08:18.000000000 +0100 >@@ -28,97 +28,19 @@ > > #include <OpenColorIO/OpenColorIO.h> > >-#include "Platform.h" >- >-#ifndef WINDOWS >- >-// fwd declare yaml-cpp visibility >-#pragma GCC visibility push(hidden) >-namespace YAML { >- class Exception; >- class BadDereference; >- class RepresentationException; >- class EmitterException; >- class ParserException; >- class InvalidScalar; >- class KeyNotFound; >- template <typename T> class TypedKeyNotFound; >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::ColorSpace>; >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::Config>; >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::Exception>; >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::GpuShaderDesc>; >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::ImageDesc>; >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::Look>; >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::Processor>; >- >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::Transform>; >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::AllocationTransform>; >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::CDLTransform>; >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::ColorSpaceTransform>; >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::DisplayTransform>; >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::ExponentTransform>; >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::FileTransform>; >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::GroupTransform>; >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::LogTransform>; >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::LookTransform>; >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::MatrixTransform>; >- template <> class TypedKeyNotFound<OCIO_NAMESPACE::TruelightTransform>; >-} >-#pragma GCC visibility pop >- >-#endif >- >-#include <yaml-cpp/yaml.h> >- > #ifndef INCLUDED_OCIO_YAML_H > #define INCLUDED_OCIO_YAML_H > > OCIO_NAMESPACE_ENTER > { > >- // Core >- OCIOHIDDEN void operator >> (const YAML::Node& node, ColorSpaceRcPtr& cs); >- OCIOHIDDEN YAML::Emitter& operator << (YAML::Emitter& out, ColorSpaceRcPtr cs); >- OCIOHIDDEN void operator >> (const YAML::Node& node, GroupTransformRcPtr& t); >- OCIOHIDDEN YAML::Emitter& operator << (YAML::Emitter& out, ConstGroupTransformRcPtr t); >- OCIOHIDDEN void operator >> (const YAML::Node& node, TransformRcPtr& t); >- OCIOHIDDEN YAML::Emitter& operator << (YAML::Emitter& out, ConstTransformRcPtr t); >- OCIOHIDDEN void operator >> (const YAML::Node& node, LookRcPtr& cs); >- OCIOHIDDEN YAML::Emitter& operator << (YAML::Emitter& out, LookRcPtr cs); >- >- // Transforms >- OCIOHIDDEN void operator >> (const YAML::Node& node, AllocationTransformRcPtr& t); >- OCIOHIDDEN YAML::Emitter& operator << (YAML::Emitter& out, ConstAllocationTransformRcPtr t); >- OCIOHIDDEN void operator >> (const YAML::Node& node, CDLTransformRcPtr& t); >- OCIOHIDDEN YAML::Emitter& operator << (YAML::Emitter& out, ConstCDLTransformRcPtr t); >- OCIOHIDDEN void operator >> (const YAML::Node& node, ColorSpaceTransformRcPtr& t); >- OCIOHIDDEN YAML::Emitter& operator << (YAML::Emitter& out, ConstColorSpaceTransformRcPtr t); >- OCIOHIDDEN void operator >> (const YAML::Node& node, ExponentTransformRcPtr& t); >- OCIOHIDDEN YAML::Emitter& operator << (YAML::Emitter& out, ConstExponentTransformRcPtr t); >- OCIOHIDDEN void operator >> (const YAML::Node& node, FileTransformRcPtr& t); >- OCIOHIDDEN YAML::Emitter& operator << (YAML::Emitter& out, ConstFileTransformRcPtr t); >- OCIOHIDDEN void operator >> (const YAML::Node& node, LogTransformRcPtr& t); >- OCIOHIDDEN YAML::Emitter& operator << (YAML::Emitter& out, ConstLogTransformRcPtr t); >- OCIOHIDDEN void operator >> (const YAML::Node& node, LookTransformRcPtr& t); >- OCIOHIDDEN YAML::Emitter& operator << (YAML::Emitter& out, ConstLookTransformRcPtr t); >- OCIOHIDDEN void operator >> (const YAML::Node& node, MatrixTransformRcPtr& t); >- OCIOHIDDEN YAML::Emitter& operator << (YAML::Emitter& out, ConstMatrixTransformRcPtr t); >- OCIOHIDDEN void operator >> (const YAML::Node& node, TruelightTransformRcPtr& t); >- OCIOHIDDEN YAML::Emitter& operator << (YAML::Emitter& out, ConstTruelightTransformRcPtr t); >- >- // Enums >- OCIOHIDDEN YAML::Emitter& operator << (YAML::Emitter& out, BitDepth depth); >- OCIOHIDDEN void operator >> (const YAML::Node& node, BitDepth& depth); >- OCIOHIDDEN YAML::Emitter& operator << (YAML::Emitter& out, Allocation alloc); >- OCIOHIDDEN void operator >> (const YAML::Node& node, Allocation& alloc); >- OCIOHIDDEN YAML::Emitter& operator << (YAML::Emitter& out, ColorSpaceDirection dir); >- OCIOHIDDEN void operator >> (const YAML::Node& node, ColorSpaceDirection& dir); >- OCIOHIDDEN YAML::Emitter& operator << (YAML::Emitter& out, TransformDirection dir); >- OCIOHIDDEN void operator >> (const YAML::Node& node, TransformDirection& dir); >- OCIOHIDDEN YAML::Emitter& operator << (YAML::Emitter& out, Interpolation iterp); >- OCIOHIDDEN void operator >> (const YAML::Node& node, Interpolation& iterp); >+ class OCIOYaml >+ { >+ public: >+ void open(std::istream& istream, ConfigRcPtr& c, const char* filename = NULL) const; >+ void write(std::ostream& ostream, const Config* c) const; >+ }; > >- void LogUnknownKeyWarning(const std::string & name, const YAML::Node& tag); > } > OCIO_NAMESPACE_EXIT > >diff -Naur a/src/core/ParseUtils.cpp b/src/core/ParseUtils.cpp >--- a/src/core/ParseUtils.cpp 2013-10-08 23:59:34.000000000 +0100 >+++ b/src/core/ParseUtils.cpp 2014-09-11 20:08:18.000000000 +0100 >@@ -359,6 +359,10 @@ > while ( istream.good() ) > { > std::getline(istream, line); >+ if(line.size() > 0 && line[line.size() - 1] == '\r') >+ { >+ line.resize(line.size() - 1); >+ } > if(!pystring::strip(line).empty()) > { > return true; >diff -Naur a/src/core/PathUtils.cpp b/src/core/PathUtils.cpp >--- a/src/core/PathUtils.cpp 2013-10-08 23:59:34.000000000 +0100 >+++ b/src/core/PathUtils.cpp 2014-09-11 20:08:18.000000000 +0100 >@@ -48,6 +48,7 @@ > > #if defined(__APPLE__) && !defined(__IPHONE__) > #include <crt_externs.h> // _NSGetEnviron() >+#include <unistd.h> > #elif !defined(WINDOWS) > #include <unistd.h> > extern char **environ; >diff -Naur a/src/pyglue/CMakeLists.txt b/src/pyglue/CMakeLists.txt >--- a/src/pyglue/CMakeLists.txt 2013-10-08 23:59:34.000000000 +0100 >+++ b/src/pyglue/CMakeLists.txt 2014-09-11 20:08:18.000000000 +0100 >@@ -95,7 +95,8 @@ > endif() > > if(APPLE) >- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -undefined dynamic_lookup") >+ set_target_properties(PyOpenColorIO PROPERTIES >+ LINK_FLAGS "-undefined dynamic_lookup") > endif() > > add_subdirectory(tests) >diff -Naur a/src/pyglue/PyMain.cpp b/src/pyglue/PyMain.cpp >--- a/src/pyglue/PyMain.cpp 2013-10-08 23:59:34.000000000 +0100 >+++ b/src/pyglue/PyMain.cpp 2014-09-11 20:08:18.000000000 +0100 >@@ -150,7 +150,6 @@ > } > OCIO_NAMESPACE_EXIT > >-extern "C" > MOD_INIT(PyOpenColorIO) > { > PyObject * m;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 583890
:
435082
|
435084
| 435086 |
435088
|
435090
|
435092